Skip to content

Commit

Permalink
Merge 435a715 into 1470009
Browse files Browse the repository at this point in the history
  • Loading branch information
josepht committed Jun 27, 2016
2 parents 1470009 + 435a715 commit f81175d
Show file tree
Hide file tree
Showing 3 changed files with 90 additions and 20 deletions.
22 changes: 20 additions & 2 deletions snapcraft/internal/parser.py
Expand Up @@ -39,6 +39,7 @@
import yaml

from docopt import docopt
from collections import OrderedDict

from snapcraft.internal import log, sources

Expand All @@ -56,6 +57,23 @@ class InvalidEntryError(Exception):
PARTS_FILE = "snap-parts.yaml"


# yaml OrderedDict loading and dumping
# from http://stackoverflow.com/a/21048064 Wed Jun 22 16:05:34 UTC 2016
_mapping_tag = yaml.resolver.BaseResolver.DEFAULT_MAPPING_TAG


def dict_representer(dumper, data):
return dumper.represent_dict(data.items())


def dict_constructor(loader, node):
return OrderedDict(loader.construct_pairs(node))


yaml.add_representer(OrderedDict, dict_representer)
yaml.add_constructor(_mapping_tag, dict_constructor)


def _get_version():
try:
return pkg_resources.require('snapcraft-parser')[0].version
Expand Down Expand Up @@ -146,7 +164,7 @@ def _process_subparts(project_part, subparts, parts, origin, maintainer,

def _process_entry(data):
key = data.get('project-part')
parts_list = {}
parts_list = OrderedDict()
# Store all the parts listed in 'after' for each included part so that
# we can check later that we aren't missing any parts.
# XXX: What do we do about 'after' parts that should be looked for in
Expand Down Expand Up @@ -210,7 +228,7 @@ class Options:
def _process_index(output):
# XXX: This can't remain in memory if the list gets very large, but it
# should be okay for now.
master_parts_list = {}
master_parts_list = OrderedDict()

output = output.strip()

Expand Down
51 changes: 51 additions & 0 deletions snapcraft/tests/test_parser.py
Expand Up @@ -19,6 +19,7 @@
from unittest import mock

import yaml
from collections import OrderedDict

from snapcraft.internal.parser import (
_get_namespaced_partname,
Expand Down Expand Up @@ -556,3 +557,53 @@ def test_missing_fields(self, mock_get, mock_get_origin_data):
}
main(['--debug', '--index', TEST_OUTPUT_PATH])
self.assertEqual(0, _get_part_list_count())

@mock.patch('snapcraft.internal.parser._get_origin_data')
@mock.patch('snapcraft.internal.sources.get')
def test_parsed_output_matches_wiki_order(
self, mock_get, mock_get_origin_data):
_create_example_output("""
---
maintainer: John Doe <john.doe@example.com>
origin: lp:snapcraft-parser-example
description: example main
project-part: main
---
maintainer: Jim Doe <jim.doe@example.com>
origin: lp:snapcraft-parser-example
description: example main2
project-part: main2
---
maintainer: Jim Doe <jim.doe@example.com>
origin: lp:snapcraft-parser-example
description: example main2
project-part: app1
""")
parts = OrderedDict()

parts_main = OrderedDict()
parts_main['source'] = 'lp:project'
parts_main['plugin'] = 'copy'
parts_main['files'] = ['file1', 'file2']
parts['main'] = parts_main

parts_main2 = OrderedDict()
parts_main2['source'] = 'lp:project'
parts_main2['plugin'] = 'copy'
parts_main2['files'] = ['file1', 'file2']
parts['main2'] = parts_main2

parts_app1 = OrderedDict()
parts_app1['source'] = 'lp:project'
parts_app1['plugin'] = 'copy'
parts_app1['files'] = ['file1', 'file2']
parts['app1'] = parts_app1

mock_get_origin_data.return_value = {
'parts': parts,
}
main(['--index', TEST_OUTPUT_PATH])
self.assertEqual(3, _get_part_list_count())

self.assertEqual(parts,
_get_part_list())
37 changes: 19 additions & 18 deletions snapcraft/tests/test_pluginhandler.py
Expand Up @@ -14,6 +14,7 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.

from collections import OrderedDict
import copy
import logging
import os
Expand Down Expand Up @@ -599,9 +600,9 @@ def test_pull_state(self, ubuntu_mock):

self.assertTrue(state, 'Expected pull to save state YAML')
self.assertTrue(type(state) is states.PullState)
self.assertTrue(type(state.properties) is dict)
self.assertTrue(type(state.properties) is OrderedDict)
self.assertEqual(0, len(state.properties))
self.assertTrue(type(state.project_options) is dict)
self.assertTrue(type(state.project_options) is OrderedDict)
self.assertTrue('deb_arch' in state.project_options)

@patch('importlib.import_module')
Expand All @@ -621,10 +622,10 @@ def test_pull_state_with_properties(self, plugin_mock, local_load_mock,

self.assertTrue(state, 'Expected pull to save state YAML')
self.assertTrue(type(state) is states.PullState)
self.assertTrue(type(state.properties) is dict)
self.assertTrue(type(state.properties) is OrderedDict)
self.assertTrue('foo' in state.properties)
self.assertEqual(state.properties['foo'], 'bar')
self.assertTrue(type(state.project_options) is dict)
self.assertTrue(type(state.project_options) is OrderedDict)
self.assertTrue('deb_arch' in state.project_options)

@patch.object(nil.NilPlugin, 'clean_pull')
Expand All @@ -650,9 +651,9 @@ def test_build_state(self):

self.assertTrue(state, 'Expected build to save state YAML')
self.assertTrue(type(state) is states.BuildState)
self.assertTrue(type(state.properties) is dict)
self.assertTrue(type(state.properties) is OrderedDict)
self.assertEqual(0, len(state.properties))
self.assertTrue(type(state.project_options) is dict)
self.assertTrue(type(state.project_options) is OrderedDict)
self.assertTrue('deb_arch' in state.project_options)

@patch('importlib.import_module')
Expand All @@ -672,10 +673,10 @@ def test_build_state_with_properties(self, plugin_mock, local_load_mock,

self.assertTrue(state, 'Expected build to save state YAML')
self.assertTrue(type(state) is states.BuildState)
self.assertTrue(type(state.properties) is dict)
self.assertTrue(type(state.properties) is OrderedDict)
self.assertTrue('foo' in state.properties)
self.assertEqual(state.properties['foo'], 'bar')
self.assertTrue(type(state.project_options) is dict)
self.assertTrue(type(state.project_options) is OrderedDict)
self.assertTrue('deb_arch' in state.project_options)

@patch.object(nil.NilPlugin, 'clean_build')
Expand Down Expand Up @@ -710,15 +711,15 @@ def test_stage_state(self):
self.assertTrue(type(state) is states.StageState)
self.assertTrue(type(state.files) is set)
self.assertTrue(type(state.directories) is set)
self.assertTrue(type(state.properties) is dict)
self.assertTrue(type(state.properties) is OrderedDict)
self.assertEqual(2, len(state.files))
self.assertTrue('bin/1' in state.files)
self.assertTrue('bin/2' in state.files)
self.assertEqual(1, len(state.directories))
self.assertTrue('bin' in state.directories)
self.assertTrue('stage' in state.properties)
self.assertEqual(state.properties['stage'], ['*'])
self.assertTrue(type(state.project_options) is dict)
self.assertTrue(type(state.project_options) is OrderedDict)
self.assertEqual(0, len(state.project_options))

def test_stage_state_with_stage_keyword(self):
Expand All @@ -741,14 +742,14 @@ def test_stage_state_with_stage_keyword(self):
self.assertTrue(type(state) is states.StageState)
self.assertTrue(type(state.files) is set)
self.assertTrue(type(state.directories) is set)
self.assertTrue(type(state.properties) is dict)
self.assertTrue(type(state.properties) is OrderedDict)
self.assertEqual(1, len(state.files))
self.assertTrue('bin/1' in state.files)
self.assertEqual(1, len(state.directories))
self.assertTrue('bin' in state.directories)
self.assertTrue('stage' in state.properties)
self.assertEqual(state.properties['stage'], ['bin/1'])
self.assertTrue(type(state.project_options) is dict)
self.assertTrue(type(state.project_options) is OrderedDict)
self.assertEqual(0, len(state.project_options))

self.assertEqual('stage', self.handler.last_step())
Expand Down Expand Up @@ -850,7 +851,7 @@ def test_prime_state(self, mock_copy, mock_find_dependencies):
self.assertTrue(type(state.files) is set)
self.assertTrue(type(state.directories) is set)
self.assertTrue(type(state.dependency_paths) is set)
self.assertTrue(type(state.properties) is dict)
self.assertTrue(type(state.properties) is OrderedDict)
self.assertEqual(2, len(state.files))
self.assertTrue('bin/1' in state.files)
self.assertTrue('bin/2' in state.files)
Expand All @@ -859,7 +860,7 @@ def test_prime_state(self, mock_copy, mock_find_dependencies):
self.assertEqual(0, len(state.dependency_paths))
self.assertTrue('snap' in state.properties)
self.assertEqual(state.properties['snap'], ['*'])
self.assertTrue(type(state.project_options) is dict)
self.assertTrue(type(state.project_options) is OrderedDict)
self.assertEqual(0, len(state.project_options))

@patch('snapcraft.internal.pluginhandler._find_dependencies')
Expand Down Expand Up @@ -898,7 +899,7 @@ def test_prime_state_with_dependencies(self, mock_migrate_files,
self.assertTrue(type(state.files) is set)
self.assertTrue(type(state.directories) is set)
self.assertTrue(type(state.dependency_paths) is set)
self.assertTrue(type(state.properties) is dict)
self.assertTrue(type(state.properties) is OrderedDict)
self.assertEqual(2, len(state.files))
self.assertTrue('bin/1' in state.files)
self.assertTrue('bin/2' in state.files)
Expand All @@ -910,7 +911,7 @@ def test_prime_state_with_dependencies(self, mock_migrate_files,
self.assertTrue('lib2' in state.dependency_paths)
self.assertTrue('snap' in state.properties)
self.assertEqual(state.properties['snap'], ['*'])
self.assertTrue(type(state.project_options) is dict)
self.assertTrue(type(state.project_options) is OrderedDict)
self.assertEqual(0, len(state.project_options))

@patch('snapcraft.internal.pluginhandler._find_dependencies')
Expand Down Expand Up @@ -941,15 +942,15 @@ def test_prime_state_with_snap_keyword(self, mock_copy,
self.assertTrue(type(state.files) is set)
self.assertTrue(type(state.directories) is set)
self.assertTrue(type(state.dependency_paths) is set)
self.assertTrue(type(state.properties) is dict)
self.assertTrue(type(state.properties) is OrderedDict)
self.assertEqual(1, len(state.files))
self.assertTrue('bin/1' in state.files)
self.assertEqual(1, len(state.directories))
self.assertTrue('bin' in state.directories)
self.assertEqual(0, len(state.dependency_paths))
self.assertTrue('snap' in state.properties)
self.assertEqual(state.properties['snap'], ['bin/1'])
self.assertTrue(type(state.project_options) is dict)
self.assertTrue(type(state.project_options) is OrderedDict)
self.assertEqual(0, len(state.project_options))

def test_clean_prime_state(self):
Expand Down

0 comments on commit f81175d

Please sign in to comment.