Skip to content

Commit

Permalink
Merge pull request #55 from Anaconda-Platform/upload-variable-default
Browse files Browse the repository at this point in the history
Include "default" for variables in publication_info()
  • Loading branch information
havocp committed Apr 5, 2017
2 parents 6fd5932 + a7a4054 commit 48845ae
Show file tree
Hide file tree
Showing 4 changed files with 92 additions and 13 deletions.
11 changes: 11 additions & 0 deletions anaconda_project/plugins/requirement.py
Original file line number Diff line number Diff line change
Expand Up @@ -290,6 +290,17 @@ def encrypted(self):
else:
return any(self.env_var.endswith(suffix) for suffix in _secret_suffixes)

@property
def default_as_string(self):
"""Get the default, forced to string or None."""
value = self.options.get('default', None)
if value is None:
return None
else:
# see _parse_default above, it can be a string already,
# or an integer
return str(value)

def _get_value_of_env_var(self, environ):
"""A "protected" method for subtypes to use."""
value = environ.get(self.env_var, None)
Expand Down
58 changes: 58 additions & 0 deletions anaconda_project/plugins/test/test_requirement.py
Original file line number Diff line number Diff line change
Expand Up @@ -67,3 +67,61 @@ def test_requirement_status_repr():
status = requirement.check_status(dict(FOO=''), tmp_local_state_file(), 'default', UserConfigOverrides())
assert "RequirementStatus(False,'Environment variable FOO is not set.',EnvVarRequirement(env_var='FOO'))" == repr(
status)


def test_requirement_parse_default():
null_default = dict(default=None)
string_default = dict(default="foo")
int_default = dict(default=42)
float_default = dict(default=3.14)

# invalid defaults
bool_default = dict(default=True)
list_default = dict(default=[])

def type_error(value):
return "default value for variable FOO must be null, a string, or a number, not {value}.".format(value=value)

problems = []

EnvVarRequirement._parse_default(null_default, "FOO", problems)
assert null_default == dict()
assert problems == []

EnvVarRequirement._parse_default(string_default, "FOO", problems)
assert string_default == dict(default="foo")
assert problems == []

EnvVarRequirement._parse_default(int_default, "FOO", problems)
assert int_default == dict(default=42)
assert problems == []

EnvVarRequirement._parse_default(float_default, "FOO", problems)
assert float_default == dict(default=3.14)
assert problems == []

EnvVarRequirement._parse_default(bool_default, "FOO", problems)
assert problems == [type_error(True)]

problems = []
EnvVarRequirement._parse_default(list_default, "FOO", problems)
assert problems == [type_error([])]


def test_requirement_default_as_string():
no_default = dict()
string_default = dict(default="foo")
int_default = dict(default=42)
float_default = dict(default=3.14)

req = EnvVarRequirement(registry=PluginRegistry(), env_var='FOO', options=no_default)
assert req.default_as_string is None

req = EnvVarRequirement(registry=PluginRegistry(), env_var='FOO', options=string_default)
assert req.default_as_string == "foo"

req = EnvVarRequirement(registry=PluginRegistry(), env_var='FOO', options=int_default)
assert req.default_as_string == "42"

req = EnvVarRequirement(registry=PluginRegistry(), env_var='FOO', options=float_default)
assert req.default_as_string == "3.14"
26 changes: 17 additions & 9 deletions anaconda_project/project.py
Original file line number Diff line number Diff line change
Expand Up @@ -1170,15 +1170,23 @@ def publication_info(self):
for req in self.requirements:
if isinstance(req, CondaEnvRequirement):
continue
elif isinstance(req, DownloadRequirement):
downloads[req.env_var] = dict(title=req.title,
description=req.description,
encrypted=req.encrypted,
url=req.url)
elif isinstance(req, ServiceRequirement):
services[req.env_var] = dict(title=req.title, description=req.description, type=req.service_type)
elif isinstance(req, EnvVarRequirement):
variables[req.env_var] = dict(title=req.title, description=req.description, encrypted=req.encrypted)

if isinstance(req, EnvVarRequirement):
data = dict(title=req.title, description=req.description, encrypted=req.encrypted)

default = req.default_as_string
if default is not None:
data['default'] = default

if isinstance(req, DownloadRequirement):
data['url'] = req.url
downloads[req.env_var] = data
elif isinstance(req, ServiceRequirement):
data['type'] = req.service_type
services[req.env_var] = data
elif isinstance(req, EnvVarRequirement):
variables[req.env_var] = data

json['downloads'] = downloads
json['variables'] = variables
json['services'] = services
Expand Down
10 changes: 6 additions & 4 deletions anaconda_project/test/test_project.py
Original file line number Diff line number Diff line change
Expand Up @@ -2151,8 +2151,8 @@ def check_publication_info_from_empty(dirname):
variables:
SOMETHING: {}
SOMETHING_ELSE: {}
SOMETHING_ELSE:
default: 42
"""


Expand Down Expand Up @@ -2207,11 +2207,13 @@ def check_publication_info_from_complex(dirname):
'description': 'SOMETHING environment variable must be set.'},
'SOMETHING_ELSE': {'encrypted': False,
'title': 'SOMETHING_ELSE',
'description': 'SOMETHING_ELSE environment variable must be set.'}},
'description': 'SOMETHING_ELSE environment variable must be set.',
'default': "42"}},
'services': {'REDIS_URL':
{'title': 'REDIS_URL',
'description': 'A running Redis server, located by a redis: URL set as REDIS_URL.',
'type': 'redis'}}
'type': 'redis',
'encrypted': False}}
}

assert expected == project.publication_info()
Expand Down

0 comments on commit 48845ae

Please sign in to comment.