Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Piper/config simplification #396

Merged
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
config upgrade functions
  • Loading branch information
pipermerriam committed Dec 11, 2017
commit 024fcdfce840522df53692ce4a9b34321c86b848
82 changes: 34 additions & 48 deletions populus/api/upgrade.py
Original file line number Diff line number Diff line change
@@ -1,66 +1,52 @@
import copy
import os

from populus.config import (
load_config,
write_config,
)

from populus.config.upgrade import (
upgrade_config,
upgrade_user_config,
ConfigContext,
)

from populus.project import (
Project,
)

from populus.config.versions import (
LATEST_VERSION,
LAST_NO_USER_CONFIG_VERSION,
)

import shutil
from populus.config.helpers import (
get_user_json_config_file_path,
get_json_config_file_path,
)


def upgrade_configs(project_dir, logger, to_version=None):
def upgrade_configs(project_dir, logger, to_version):
"""upgrade project and the user config file"""

project = Project(project_dir=project_dir)

if to_version is None:
to_version = LATEST_VERSION

user_config = copy.deepcopy(project.user_config)
if int(user_config['version']) < int(LATEST_VERSION):
user_config = upgrade_config(user_config, ConfigContext.USER)
write_config(user_config, project.user_config_file_path)

if project.legacy_config_path is not None:

legacy_config = load_config(project.legacy_config_path)
legacy_version = legacy_config['version']
if int(legacy_version) > int(LAST_NO_USER_CONFIG_VERSION):
raise KeyError(
"Unkown legacy version {legacy_version} at {legacy_config}".format(
legacy_version=legacy_version,
legacy_config=legacy_config
)
)
elif int(legacy_version) < int(LAST_NO_USER_CONFIG_VERSION):
legacy_config = upgrade_config(
legacy_config, ConfigContext.LEGACY, LAST_NO_USER_CONFIG_VERSION
user_config_file_path = get_user_json_config_file_path()
if os.path.exists(user_config_file_path):
user_config = load_config(user_config_file_path)
current_user_config_version = int(user_config['version'])

if current_user_config_version < int(LATEST_VERSION):
upgraded_user_config = upgrade_user_config(user_config, to_version)
if upgrade_config:
write_config(upgraded_user_config, user_config_file_path)
else:
os.remove(user_config_file_path)

project_config_file_path = get_json_config_file_path(project_dir)
if os.path.exists(project_config_file_path):
project_config = load_config(project_config_file_path)
project_config_version = int(project_config['version'])

if project_config_version < int(LATEST_VERSION):
upgraded_project_config = upgrade_config(
project_config,
ConfigContext.USER,
to_version,
)

shutil.move(
project.legacy_config_path,
project.legacy_config_path + ".orig"
)
write_config(legacy_config, project.config_file_path)
project.reload_config()

project_config = copy.deepcopy(project.project_config)
if int(project_config['version']) < int(LATEST_VERSION):
project_config = upgrade_config(project_config, ConfigContext.USER)
write_config(project_config, project.config_file_path)

project.reload_config()
project.clean_config()
if upgraded_project_config:
write_config(upgraded_project_config, project_config_file_path)
else:
os.path.remove(upgraded_project_config)
9 changes: 6 additions & 3 deletions populus/assets/defaults.v8.config.json
Original file line number Diff line number Diff line change
Expand Up @@ -214,9 +214,7 @@
"contract_source_dirs": [
"./contracts"
],
"import_remappings": [
"import-path-from-legacy=contracts"
]
"import_remappings": []
},
"contracts": {
"backends": {
Expand All @@ -241,6 +239,11 @@
}
}
},
"some": {
"nested": {
"key": "value"
}
},
"version": "8",
"web3": {
"GethIPC": {
Expand Down
2 changes: 1 addition & 1 deletion populus/cli/upgrade_cmd.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,4 +27,4 @@ def upgrade_cmd(ctx, to_version):
logger = logging.getLogger('populus.cli.upgrade')
project_dir = ctx.obj['PROJECT_DIR']

upgrade_configs(project_dir, logger)
upgrade_configs(project_dir, logger, to_version)
32 changes: 29 additions & 3 deletions populus/config/upgrade/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,14 @@
from .v3 import upgrade_v3_to_v4
from .v4 import upgrade_v4_to_v5
from .v5 import upgrade_v5_to_v6
from .v6 import upgrade_v6_to_v7
from .v7 import upgrade_v7_to_v8
from .v6 import (
upgrade_v6_to_v7,
upgrade_user_v6_to_v7,
)
from .v7 import (
upgrade_v7_to_v8,
upgrade_user_v7_to_v8,
)


UPGRADE_SEQUENCE = {
Expand All @@ -52,6 +58,11 @@
V7: upgrade_v7_to_v8,
}

USER_UPGRADE_FUNCTIONS = {
V6: upgrade_user_v6_to_v7,
V7: upgrade_user_v7_to_v8,
}


class ConfigContext(enum.Enum):
USER = 1
Expand Down Expand Up @@ -87,7 +98,6 @@ def get_upgrade_sequence(start_version, end_version, known_versions):


def upgrade_config(config, config_context, to_version=LATEST_VERSION):

if config_context == ConfigContext.USER:
known_versions = KNOWN_USER_VERSIONS
elif config_context == ConfigContext.LEGACY:
Expand All @@ -106,3 +116,19 @@ def upgrade_config(config, config_context, to_version=LATEST_VERSION):
)
upgraded_config = pipe(config, *upgrade_functions)
return upgraded_config


def upgrade_user_config(user_config, to_version=LATEST_VERSION):
try:
current_version = user_config['version']
except KeyError:
raise KeyError("No version key found in user config file:\n\n{0}".format(
pprint.pformat(user_config),
))

upgrade_sequence = get_upgrade_sequence(current_version, to_version, KNOWN_USER_VERSIONS)
upgrade_functions = tuple(
USER_UPGRADE_FUNCTIONS[version] for version in upgrade_sequence
)
upgraded_user_config = pipe(user_config, *upgrade_functions)
return upgraded_user_config
33 changes: 33 additions & 0 deletions populus/config/upgrade/v6.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

from populus.config.defaults import (
load_default_config,
load_user_default_config,
)

from populus.config.validation import (
Expand Down Expand Up @@ -51,3 +52,35 @@ def upgrade_v6_to_v7(v6_config):
upgraded_v6_config['version'] = V7

return upgraded_v6_config


def upgrade_user_v6_to_v7(v6_user_config):
"""
Upgrade a v6 config file to a v7 config file.
"""
errors = get_validation_errors(v6_user_config, version=V6)
if errors:
raise ValueError(
"Cannot upgrade invalid config. Please ensure that your current "
"configuration file is valid:\n\n{0}".format(
format_errors(errors),
)
)

v6_default = load_user_default_config(version=V6)
v7_default = load_user_default_config(version=V7)

v6_default_config = Config(v6_default)
v6_default_config.unref()

v7_default_config = Config(v7_default)
v7_default_config.unref()

if v6_user_config == v6_default_config:
return v7_default_config

# V7 just moved to user config, no change in keys
upgraded_v6_user_config = copy.deepcopy(v6_user_config)
upgraded_v6_user_config['version'] = V7

return upgraded_v6_user_config
35 changes: 30 additions & 5 deletions populus/config/upgrade/v7.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

from populus.config.defaults import (
load_default_config,
load_user_default_config,
)

from populus.config.validation import (
Expand Down Expand Up @@ -35,19 +36,43 @@ def upgrade_v7_to_v8(v7_config):
)

v7_default = load_default_config(version=V7)
v8_default = load_default_config(version=V8)

v7_default_config = Config(v7_default)
v7_default_config.unref()

v8_default_config = Config(v8_default)

if v7_config == v7_default_config:
return v8_default_config
return {}

# V8 just removes all of the `$ref` values from the config.
upgraded_v7_config = Config(copy.deepcopy(v7_config))
upgraded_v7_config.unref()
upgraded_v7_config['version'] = V8

return upgraded_v7_config


def upgrade_user_v7_to_v8(v7_user_config):
"""
Upgrade a v7 user config file to a v8 user config file.
"""
errors = get_validation_errors(v7_user_config, version=V7)
if errors:
raise ValueError(
"Cannot upgrade invalid config. Please ensure that your current "
"configuration file is valid:\n\n{0}".format(
format_errors(errors),
)
)

v7_default = load_user_default_config(version=V7)

v7_default_config = Config(v7_default)

if v7_user_config == v7_default_config:
return {}

# V8 just removes all of the `$ref` values from the config.
upgraded_v7_user_config = Config(copy.deepcopy(v7_user_config))
upgraded_v7_user_config.unref()
upgraded_v7_user_config['version'] = V8

return upgraded_v7_user_config
3 changes: 2 additions & 1 deletion populus/project.py
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,8 @@ def __init__(self,
if user_config_file_path is not None:
if not os.path.exists(user_config_file_path):
raise FileNotFoundError(
"No populus configuration file found at specified location: `{0}`".format(user_config_file_path)
"No populus configuration file found at specified location: "
"`{0}`".format(user_config_file_path)
)
self.user_config_file_path = user_config_file_path
else:
Expand Down