blob: 68ba7d7b2710dc18a0bf44fbc0016a12d8c2ecc9 [file] [log] [blame] [view]
# golangconfig Package Developer Documentation
`golangconfig` is an API for package developers to obtain configuration
information about a user's Go environment. It is distributed as a Package
Control dependency, and thus automatically installed when a package requiring
it is installed by an end-user.
- [Overview](#overview)
- [Example](#example)
- [API Documentation](#api-documentation)
## Overview
### subprocess_info()
`subprocess_info()` is the primary function that will be used in packages.
It accepts five parameters. The first two are positional:
1. the name of the requested executable, e.g. "go", "gofmt", "godoc"
2. a list of required environment variables
The three remaining parameters are keyword arguments:
- optional_vars: a list of vars that will be pulled from project or Sublime
Text settings and used as environment variables
- view: a `sublime.View` object, if available
- window: a `sublime.Window` object, if available
The function returns a two-element tuple containing the path to the requested
executable and a `dict` to pass via the `env=` arg of `subprocess.Popen()`.
The `sublime.View` and/or `sublime.Window` objects are used to obtain
project-specific settings. These objects are available via attributes of the
`sublime_plugin.WindowCommand` and `sublime_plugin.TextCommand` classes.
The `golangconfig` package interacts with Sublime Text's settings API, which
means that all calls must occur within the UI thread for compatibility with
Sublime Text 2.
### setting_value()
The function `setting_value()` is intended for use when fetching environment
variables for non-subprocess usage, or for getting settings that are not
environment variables. Obtaining the value of an individual environment variable
may be useful when printing debug information, or using the value in an
interactive manner with the user.
The function accepts three parameters. The first is position:
1. a unicode string of the name of the setting or environment variable
The two other parameters are keyword arguments:
- view: a `sublime.View` object, if available
- window: a `sublime.Window` object, if available
The function returns a two-element tuple containing the value of the setting
requested, and a unicode string describing the source of the setting.
If no value was found for the setting, the tuple `(None, None)` will be
returned.
If a value is found for the setting, the second element of the tuple will
contain one of the following unicode strings:
- "project file"
- "project file (os-specific)"
- "golang.sublime-settings"
- "golang.sublime-settings (os-specific)"
- a unicode string of the path to the user's login shell
This value is intended for display to the user for help in debugging.
### Errors
If the executable can not be found, a `golangconfig.ExecutableError()` will be
raised. It has two attributes: `.name` which is the name of the executable that
could not be found, and `.dirs` which is a list of the dirs searched by first
looking at the `PATH` from the Sublime Text settings, and then looking at the
shell `PATH` value.
If one of the required environment variables is not set, an
`golangconfig.EnvVarError()` will be raised. It has one attribute: `.missing`
which is a list of all required environment variables that could not be
found in the Sublime Text settings, or the shell environment.
If the `GOROOT` environment variable points to a directory that does not exist
on disk, the `golangconfig.GoRootNotFoundError()` will be raised. It has one
attribute `.directory` that contains a unicode string of the `GOROOT` value.
If one or more of the directories specified in the `GOPATH` environment variable
can not be found on disk, the `golangconfig.GoPathNotFoundError()` will be
raised. It has one attribute `.directories`, which is a list on unicode strings
of the directories that could not be found.
### Requiring the Dependency
When developing a package to utilize `golangconfig`, Package Control needs to be
told to ensure that `golangconfig` is installed. To accomplish this, a file
named `dependencies.json` needs to be placed in the root of the package. The
file should contain the following specification:
```json
{
"*": {
"*": [
"shellenv",
"golangconfig"
]
}
}
```
This specification indicates that for all operating systems (the outer `*`) and
all versions of Sublime Text (the nested `*`), the dependencies named `shellenv`
and `golangconfig` are required.
## Example
The following snippet of Python show basic usage of `golangconfig` from within
command classes derived from `sublime_plugin.WindowCommand` and
`sublime_plugin.TextCommand`.
```python
# coding: utf-8
from __future__ import unicode_literals
import sys
import sublime
import sublime_plugin
import golangconfig
if sys.version_info < (3,):
str_cls = unicode
else:
str_cls = str
class MyWindowCommand(sublime_plugin.WindowCommand):
def run(self):
try:
go_executable_path, env_dict = golangconfig.subprocess_info(
'go',
['GOPATH'],
[
'GOROOT',
'GOROOT_FINAL',
'GOBIN',
'GOOS',
'GOARCH',
'GORACE',
'GOARM',
'GO386',
'GOHOSTOS',
'GOHOSTARCH',
],
window=self.window
)
# Launch thread to execute subprocess.Popen() ...
except (golangconfig.ExecutableError) as e:
error_message = '''
My Package
The %s executable could not be found. Please ensure it is
installed and available via your PATH.
Would you like to view documentation for setting the PATH?
'''
prompt = error_message % e.name
if sublime.ok_cancel_dialog(prompt, 'Open Documentation'):
self.window.run_command(
'open_url',
{'url': 'http://example.com/documentation'}
)
except (golangconfig.EnvVarError) as e:
error_message = '''
My Package
The setting%s %s could not be found in your Sublime Text
settings or your shell environment.
Would you like to view the configuration documentation?
'''
plural = 's' if len(e.missing) > 1 else ''
setting_names = ', '.join(e.missing)
prompt = error_message % (plural, setting_names)
if sublime.ok_cancel_dialog(prompt, 'Open Documentation'):
self.window.run_command(
'open_url',
{'url': 'http://example.com/documentation'}
)
except (golangconfig.GoRootNotFoundError, golangconfig.GoPathNotFoundError) as e:
error_message = '''
My Package
%s.
Would you like to view the configuration documentation?
'''
prompt = error_message % str_cls(e)
if sublime.ok_cancel_dialog(prompt, 'Open Documentation'):
self.window.run_command(
'open_url',
{'url': 'http://example.com/documentation'}
)
class MyTextCommand(sublime_plugin.TextCommand):
def run(self):
# This example omits exception handling for brevity
gofmt_executable_path, env = golangconfig.subprocess_info(
'gofmt',
['GOPATH'],
# GOOS, GOARCH, GO386 and GOARM are omitted from optional_vars in
# this example with the intent they would be provided through user
# interaction.
[
'GOROOT',
'GOROOT_FINAL',
'GOBIN',
'GORACE',
'GOHOSTOS',
'GOHOSTARCH',
],
view=self.view
)
goos_setting = golangconfig.setting_value('GOOS', view=self.view)
goarch_setting = golangconfig.setting_value('GOARCH', view=self.view)
# Use the sublime API to show the user OS and ARCH options, with their
# values from the settings selected by default
```
Since the `golangconfig` functions must be called in the UI thread, commands
will normally look up any necessary information before firing off a thread to
perform a task in the background.
## API Documentation
The public API consists of the following functions:
- [`subprocess_info()`](#subprocess_info-function)
- [`setting_value()`](#setting_value-function)
- [`executable_path()`](#executable_path-function)
- [`debug_enabled()`](#debug_enabled-function)
### `subprocess_info()` function
> ```python
> def subprocess_info(executable_name, required_vars, optional_vars=None, view=None, window=None):
> """
> :param executable_name:
> A unicode string of the executable to locate, e.g. "go" or "gofmt"
>
> :param required_vars:
> A list of unicode strings of the environment variables that are
> required, e.g. "GOPATH". Obtains values from setting_value().
>
> :param optional_vars:
> A list of unicode strings of the environment variables that are
> optional, but should be pulled from setting_value() if available - e.g.
> "GOOS", "GOARCH". Obtains values from setting_value().
>
> :param view:
> A sublime.View object to use in finding project-specific settings. This
> should be passed whenever available.
>
> :param window:
> A sublime.Window object to use in finding project-specific settings.
> This will only work for Sublime Text 3, and should only be passed if
> no sublime.View object is available to pass via the view parameter.
>
> :raises:
> RuntimeError
> When the function is called from any thread but the UI thread
> TypeError
> When any of the parameters are of the wrong type
> golangconfig.ExecutableError
> When the executable requested could not be located. The .name
> attribute contains the name of the executable that could not be
> located. The .dirs attribute contains a list of unicode strings
> of the directories searched.
> golangconfig.EnvVarError
> When one or more required_vars are not available. The .missing
> attribute will be a list of the names of missing environment
> variables.
>
> :return:
> A two-element tuple.
>
> - [0] A unicode string (byte string for ST2) of the path to the executable
> - [1] A dict to pass to the env parameter of subprocess.Popen()
> """
> ```
>
> Gathers and formats information necessary to use subprocess.Popen() to
> run one of the go executables, with details pulled from setting_value() and
> executable_path().
>
> Ensures that the executable path and env dictionary are properly encoded for
> Sublime Text 2, where byte strings are necessary.
### `setting_value()` function
> ```python
> def setting_value(setting_name, view=None, window=None):
> """
> :param setting_name:
> A unicode string of the setting to retrieve
>
> :param view:
> A sublime.View object to use in finding project-specific settings. This
> should be passed whenever available.
>
> :param window:
> A sublime.Window object to use in finding project-specific settings.
> This will only work for Sublime Text 3, and should only be passed if
> no sublime.View object is available to pass via the view parameter.
>
> :raises:
> RuntimeError
> When the function is called from any thread but the UI thread
> TypeError
> When any of the parameters are of the wrong type
>
> :return:
> A two-element tuple.
>
> If no setting was found, the return value will be:
>
> - [0] None
> - [1] None
>
> If a setting was found, the return value will be:
>
> - [0] The setting value
> - [1] The source of the setting, a unicode string:
> - "project file (os-specific)"
> - "golang.sublime-settings (os-specific)"
> - "project file"
> - "golang.sublime-settings"
> - A unicode string of the path to the user's login shell
>
> The second element of the tuple is intended to be used in the display
> of debugging information to end users.
> """
> ```
>
> Returns the user's setting for a specific variable, such as GOPATH or
> GOROOT. Supports global and per-platform settings. Finds settings by
> looking in:
>
> 1. If a project is open, the project settings
> 2. The global golang.sublime-settings file
> 3. The user's environment variables, as defined by their login shell
>
> If the setting is a known name, e.g. GOPATH or GOROOT, the value will be
> checked to ensure the path exists.
### `executable_path()` function
> ```python
> def executable_path(executable_name, view=None, window=None):
> """
> :param name:
> The name of the binary to find - a unicode string of "go", "gofmt" or
> "godoc"
>
> :param view:
> A sublime.View object to use in finding project-specific settings. This
> should be passed whenever available.
>
> :param window:
> A sublime.Window object to use in finding project-specific settings.
> This will only work for Sublime Text 3, and should only be passed if
> no sublime.View object is available to pass via the view parameter.
>
> :raises:
> RuntimeError
> When the function is called from any thread but the UI thread
> TypeError
> When any of the parameters are of the wrong type
>
> :return:
> A 2-element tuple.
>
> If the executable was not found, the return value will be:
>
> - [0] None
> - [1] None
>
> If the exeutable was found, the return value will be:
>
> - [0] A unicode string of the full path to the executable
> - [1] A unicode string of the source of the PATH value
> - "project file (os-specific)"
> - "golang.sublime-settings (os-specific)"
> - "project file"
> - "golang.sublime-settings"
> - A unicode string of the path to the user's login shell
>
> The second element of the tuple is intended to be used in the display
> of debugging information to end users.
> """
> ```
>
> Uses the user's Sublime Text settings and then PATH environment variable
> as set by their login shell to find a go executable
### `debug_enabled()` function
> ```python
> def debug_enabled():
> """
> :raises:
> RuntimeError
> When the function is called from any thread but the UI thread
>
> :return:
> A boolean - if debug is enabled
> """
> ```
>
> Checks to see if the "debug" setting is true