def test_GemfileLockParser_can_parse_simple_files(self): gemfilelock = self.get_test_loc( 'gemfile_lock/complete/Gemfile.lock_simple') gfl = gemfile_lock.GemfileLockParser(gemfilelock) result = '\n\n'.join(g.pformat() for g in gfl.all_gems.values()) exf = self.get_test_loc( 'gemfile_lock/complete/expected_Gemfile.lock_simple') expected = open(exf).read() self.assertEqual(expected, result) result_deps = '\n'.join(repr(i) for i in gfl.dependencies.items()) expected_deps = ( '''(u'activerecord', Gem(name=u'activerecord', version=u'4.0.0', type=u'GEM')) (u'appraisal', Gem(name=u'appraisal', version=u'0.5.2', type=u'GEM')) (u'aruba', Gem(name=u'aruba', version=u'0.5.3', type=u'GEM')) (u'bourne', Gem(name=u'bourne', version=u'1.5.0', type=u'GEM')) (u'cucumber', Gem(name=u'cucumber', version=u'1.2.5', type=u'GEM')) (u'factory_girl', Gem(name=u'factory_girl', version=u'4.3.0', type=u'PATH')) (u'mocha', Gem(name=u'mocha', version=u'0.14.0', type=u'GEM')) (u'rspec', Gem(name=u'rspec', version=u'2.12.0', type=u'GEM')) (u'simplecov', Gem(name=u'simplecov', version=u'0.7.1', type=u'GEM')) (u'sqlite3', Gem(name=u'sqlite3', version=u'1.3.8', type=u'GEM')) (u'timecop', Gem(name=u'timecop', version=u'0.6.2.2', type=u'GEM')) (u'yard', Gem(name=u'yard', version=u'0.8.7', type=u'GEM'))''') self.assertEqual(expected_deps, result_deps) self.assertEqual(True, gfl.dependencies['factory_girl'].pinned)
def test_parse_source_mixed_step1(self): gemfilelock = self.get_test_loc( 'gemfile_lock/parse_source/Gemfile.lock_mixed1') gfl = gemfile_lock.GemfileLockParser(gemfilelock) self.assertEqual({ u'tag': u'that', u'remote': u'.' }, gfl.current_options)
def test_parse_spec_single_level(self): gemfilelock = self.get_test_loc( 'gemfile_lock/parse_spec/Gemfile.lock1') gfl = gemfile_lock.GemfileLockParser(gemfilelock) expected_names = ['user-lib'] self.assertEqual(expected_names, gfl.all_gems.keys()) expected_tree = {(u'user-lib', u'2.1.0'): {}} result = gfl.all_gems['user-lib'].as_nv_tree() self.assertEqual(expected_tree, result)
def test_parse_platform(self): gemfilelock = self.get_test_loc( 'gemfile_lock/parse_platform/Gemfile.lock') gfl = gemfile_lock.GemfileLockParser(gemfilelock) expected = [ u'ruby', u'java', ] self.assertEqual(expected, gfl.platforms)
def test_parse_spec_two_levels(self): gemfilelock = self.get_test_loc( 'gemfile_lock/parse_spec/Gemfile.lock2') gfl = gemfile_lock.GemfileLockParser(gemfilelock) expected_names = ['user-lib', 'multi_json'] self.assertEqual(expected_names, gfl.all_gems.keys()) expected_tree = {(u'user-lib', u'2.1.0'): {('multi_json', None): {}}} result = gfl.all_gems['user-lib'].as_nv_tree() self.assertEqual(expected_tree, result) result = gfl.all_gems['multi_json'].as_nv_tree() self.assertEqual({('multi_json', None): {}}, result)
def test_parse_source_mixed_step3(self): gemfilelock = self.get_test_loc( 'gemfile_lock/parse_source/Gemfile.lock_mixed3') gfl = gemfile_lock.GemfileLockParser(gemfilelock) self.assertEqual( { u'branch': u'tree', u'ref': u'this', u'remote': u'https://github.com/mypath/registrar.git', u'revision': u'49850ee876652a59dbd2233dad726b3b808bb8f9', u'tag': u'that' }, gfl.current_options)
def test_parse_source_mixed_step4(self): gemfilelock = self.get_test_loc( 'gemfile_lock/parse_source/Gemfile.lock_mixed4') gfl = gemfile_lock.GemfileLockParser(gemfilelock) expected = { u'branch': u'treebranch', u'ref': u'81e5e4d6', u'remote': u'https://github.com/mylib/lib.git', u'revision': u'81e5e4d622338b3332ab24840e6b40d47b161849', u'tag': u'thistag' } self.assertEqual(expected, gfl.current_options)
def test_GemfileLockParser_can_parse_complex_files(self): gemfilelock = self.get_test_loc( 'gemfile_lock/complete/Gemfile.lock_complex') gfl = gemfile_lock.GemfileLockParser(gemfilelock) result = '\n\n'.join(g.pformat() for g in gfl.all_gems.values()) exf = self.get_test_loc( 'gemfile_lock/complete/expected_Gemfile.lock_complex') regen = False if regen: with open(exf, 'wb') as outf: outf.write(result) expected = open(exf).read() self.assertEqual(expected.splitlines(), result.splitlines())
def test_GemfileLockParser_can_yield_a_flat_list_of_deps(self): gemfilelock = self.get_test_loc('gemfile_lock/as_deps/Gemfile.lock') gfl = gemfile_lock.GemfileLockParser(gemfilelock) result = sorted(repr(fd) for fd in gfl.flatten()) expected = sorted([ "(Gem(name=u'activemodel', version=u'4.0.0', type=u'GEM'), Gem(name=u'activesupport', version=u'4.0.0', type=u'GEM'))", "(Gem(name=u'activemodel', version=u'4.0.0', type=u'GEM'), Gem(name=u'builder', version=u'3.1.4', type=u'GEM'))", "(Gem(name=u'activerecord', version=u'4.0.0', type=u'GEM'), Gem(name=u'activemodel', version=u'4.0.0', type=u'GEM'))", "(Gem(name=u'activerecord', version=u'4.0.0', type=u'GEM'), Gem(name=u'activerecord-deprecated_finders', version=u'1.0.3', type=u'GEM'))", "(Gem(name=u'activerecord', version=u'4.0.0', type=u'GEM'), Gem(name=u'activesupport', version=u'4.0.0', type=u'GEM'))", "(Gem(name=u'activerecord', version=u'4.0.0', type=u'GEM'), Gem(name=u'arel', version=u'4.0.0', type=u'GEM'))", "(Gem(name=u'activesupport', version=u'4.0.0', type=u'GEM'), Gem(name=u'i18n', version=u'0.6.4', type=u'GEM'))", "(Gem(name=u'activesupport', version=u'4.0.0', type=u'GEM'), Gem(name=u'minitest', version=u'4.7.5', type=u'GEM'))", "(Gem(name=u'activesupport', version=u'4.0.0', type=u'GEM'), Gem(name=u'multi_json', version=u'1.7.7', type=u'GEM'))", "(Gem(name=u'activesupport', version=u'4.0.0', type=u'GEM'), Gem(name=u'thread_safe', version=u'0.1.2', type=u'GEM'))", "(Gem(name=u'activesupport', version=u'4.0.0', type=u'GEM'), Gem(name=u'tzinfo', version=u'0.3.37', type=u'GEM'))", "(Gem(name=u'appraisal', version=u'0.5.2', type=u'GEM'), Gem(name=u'rake', version=u'10.1.0', type=u'GEM'))", "(Gem(name=u'aruba', version=u'0.5.3', type=u'GEM'), Gem(name=u'childprocess', version=u'0.3.9', type=u'GEM'))", "(Gem(name=u'aruba', version=u'0.5.3', type=u'GEM'), Gem(name=u'cucumber', version=u'1.2.5', type=u'GEM'))", "(Gem(name=u'aruba', version=u'0.5.3', type=u'GEM'), Gem(name=u'rspec-expectations', version=u'2.12.1', type=u'GEM'))", "(Gem(name=u'bourne', version=u'1.5.0', type=u'GEM'), Gem(name=u'mocha', version=u'0.14.0', type=u'GEM'))", "(Gem(name=u'childprocess', version=u'0.3.9', type=u'GEM'), Gem(name=u'ffi', version=u'1.9.0', type=u'GEM'))", "(Gem(name=u'cucumber', version=u'1.2.5', type=u'GEM'), Gem(name=u'builder', version=u'3.1.4', type=u'GEM'))", "(Gem(name=u'cucumber', version=u'1.2.5', type=u'GEM'), Gem(name=u'diff-lcs', version=u'1.1.3', type=u'GEM'))", "(Gem(name=u'cucumber', version=u'1.2.5', type=u'GEM'), Gem(name=u'gherkin', version=u'2.11.8', type=u'GEM'))", "(Gem(name=u'cucumber', version=u'1.2.5', type=u'GEM'), Gem(name=u'multi_json', version=u'1.7.7', type=u'GEM'))", "(Gem(name=u'factory_girl', version=u'4.3.0', type=u'PATH'), Gem(name=u'activesupport', version=u'4.0.0', type=u'GEM'))", "(Gem(name=u'gherkin', version=u'2.11.8', type=u'GEM'), Gem(name=u'multi_json', version=u'1.7.7', type=u'GEM'))", "(Gem(name=u'mocha', version=u'0.14.0', type=u'GEM'), Gem(name=u'metaclass', version=u'0.0.1', type=u'GEM'))", "(Gem(name=u'rspec', version=u'2.12.0', type=u'GEM'), Gem(name=u'rspec-core', version=u'2.12.2', type=u'GEM'))", "(Gem(name=u'rspec', version=u'2.12.0', type=u'GEM'), Gem(name=u'rspec-expectations', version=u'2.12.1', type=u'GEM'))", "(Gem(name=u'rspec', version=u'2.12.0', type=u'GEM'), Gem(name=u'rspec-mocks', version=u'2.12.2', type=u'GEM'))", "(Gem(name=u'rspec-expectations', version=u'2.12.1', type=u'GEM'), Gem(name=u'diff-lcs', version=u'1.1.3', type=u'GEM'))", "(Gem(name=u'simplecov', version=u'0.7.1', type=u'GEM'), Gem(name=u'multi_json', version=u'1.7.7', type=u'GEM'))", "(Gem(name=u'simplecov', version=u'0.7.1', type=u'GEM'), Gem(name=u'simplecov-html', version=u'0.7.1', type=u'GEM'))", "(Gem(name=u'thread_safe', version=u'0.1.2', type=u'GEM'), Gem(name=u'atomic', version=u'1.1.10', type=u'GEM'))", "(None, Gem(name=u'activerecord', version=u'4.0.0', type=u'GEM'))", "(None, Gem(name=u'appraisal', version=u'0.5.2', type=u'GEM'))", "(None, Gem(name=u'aruba', version=u'0.5.3', type=u'GEM'))", "(None, Gem(name=u'bourne', version=u'1.5.0', type=u'GEM'))", "(None, Gem(name=u'cucumber', version=u'1.2.5', type=u'GEM'))", "(None, Gem(name=u'factory_girl', version=u'4.3.0', type=u'PATH'))", "(None, Gem(name=u'mocha', version=u'0.14.0', type=u'GEM'))", "(None, Gem(name=u'rspec', version=u'2.12.0', type=u'GEM'))", "(None, Gem(name=u'simplecov', version=u'0.7.1', type=u'GEM'))", "(None, Gem(name=u'sqlite3', version=u'1.3.8', type=u'GEM'))", "(None, Gem(name=u'timecop', version=u'0.6.2.2', type=u'GEM'))", "(None, Gem(name=u'yard', version=u'0.8.7', type=u'GEM'))", ]) self.assertEqual(expected, result)
def test_parse_spec_multi_levels(self): gemfilelock = self.get_test_loc( 'gemfile_lock/parse_spec/Gemfile.lock3') gfl = gemfile_lock.GemfileLockParser(gemfilelock) expected_tree = { u'activesupport': { (u'activesupport', u'3.2.17'): { (u'i18n', '0.6.9'): {}, (u'multi_json', '1.9.2'): {} } }, u'addressable': { (u'addressable', u'2.3.6'): {} }, u'allowy': { (u'allowy', u'0.4.0'): { (u'activesupport', u'3.2.17'): { (u'i18n', '0.6.9'): {}, (u'multi_json', '1.9.2'): {} }, (u'i18n', '0.6.9'): {} } }, u'i18n': { (u'i18n', '0.6.9'): {} }, u'multi_json': { (u'multi_json', '1.9.2'): {} } } result = dict(( n, g.as_nv_tree(), ) for n, g in gfl.all_gems.items()) self.assertEqual(expected_tree, result)
def test_parse_source_git_no_deps(self): gemfilelock = self.get_test_loc( 'gemfile_lock/parse_git/Gemfile.lock_single') gfl = gemfile_lock.GemfileLockParser(gemfilelock) result_deps = '\n'.join(repr(i) for i in gfl.all_gems.items()) expected_deps = "(u'concurrency', Gem(name=u'concurrency', version=u'2a5b0179842cb3d3e7f912a6453ec5731979d115', type=u'GIT'))" self.assertEqual(expected_deps, result_deps) expected = [ dict( name=u'concurrency', version=u'2a5b0179842cb3d3e7f912a6453ec5731979d115', pinned=False, remote=u'https://github.com/pombredanne/concurrency.git', type=u'GIT', revision=u'2a5b0179842cb3d3e7f912a6453ec5731979d115', ref='2a5b01798', branch=None, ), ] for ex in expected: res = gfl.all_gems[ex['name']] for k, v in ex.items(): self.assertEqual(v, getattr(res, k))
def test_parse_dependency(self): gemfilelock = self.get_test_loc( 'gemfile_lock/parse_dependency/Gemfile.lock') gfl = gemfile_lock.GemfileLockParser(gemfilelock, print_errors=False) expected_names = [ u'activesupport', u'addressable', u'debugger', u'eventmachine', u'machinist', u'mysql2', u'nokogiri', u'rspec-instafail', u'sequel', u'yajl-ruby', ] self.assertEqual(expected_names, gfl.all_gems.keys()) self.assertEqual(expected_names, gfl.dependencies.keys()) self.assertEqual(gfl.all_gems, gfl.dependencies) expected_gems = [ ( u'activesupport', None, ['~> 3.0'], False, ), ( u'addressable', None, [], False, ), ( u'debugger', None, [], True, ), ( u'eventmachine', None, ['~> 1.0.0'], True, ), ( u'machinist', None, ['~> 1.0.6'], False, ), ( u'mysql2', None, [], False, ), ( u'nokogiri', None, ['~> 1.6.2'], False, ), ( u'rspec-instafail', None, [], False, ), ( u'sequel', None, ['~> 3.48'], False, ), ( u'yajl-ruby', None, [], True, ), ] for name, version, vercon, pinned in expected_gems: g = gfl.dependencies[name] self.assertEqual(version, g.version) self.assertEqual(vercon, g.version_constraints) self.assertEqual(pinned, g.pinned)
def test_parse_source_with_multi_paths_in_git(self): gemfilelock = self.get_test_loc('gemfile_lock/parse_git/Gemfile.lock') gfl = gemfile_lock.GemfileLockParser(gemfilelock) result_deps = '\n'.join(repr(i) for i in gfl.all_gems.items()) expected_deps = ( '''(u'barden-client', Gem(name=u'barden-client', version=u'517d065bfbbbad82e7165639d32adf298b48471a', type=u'GIT')) (u'eventmachine', Gem(name=u'eventmachine', version=None, type=u'GEM')) (u'barden-server', Gem(name=u'barden-server', version=u'517d065bfbbbad82e7165639d32adf298b48471a', type=u'GIT')) (u'barden-network', Gem(name=u'barden-network', version=u'517d065bfbbbad82e7165639d32adf298b48471a', type=u'GIT')) (u'beefcake', Gem(name=u'beefcake', version=None, type=u'GEM'))''') self.assertEqual(expected_deps, result_deps) expected = [ dict( name=u'barden-client', version=u'517d065bfbbbad82e7165639d32adf298b48471a', platform='ruby', pinned=False, remote=u'https://github.com/bitops/barden.git', type=u'GIT', path=None, location=None, revision=u'517d065bfbbbad82e7165639d32adf298b48471a', ref=None, branch=None, submodules=None, tag=None, ), dict( name=u'eventmachine', version=None, platform=None, pinned=False, remote=None, type=u'GEM', path=None, location=None, revision=None, ref=None, branch=None, submodules=None, tag=None, ), dict( name=u'barden-server', version=u'517d065bfbbbad82e7165639d32adf298b48471a', platform='ruby', pinned=False, remote=u'https://github.com/bitops/barden.git', type=u'GIT', path=None, location=None, revision=u'517d065bfbbbad82e7165639d32adf298b48471a', ref=None, branch=None, submodules=None, tag=None, ), dict( name=u'barden-network', version=u'517d065bfbbbad82e7165639d32adf298b48471a', platform='ruby', pinned=False, remote=u'https://github.com/bitops/barden.git', type=u'GIT', path=None, location=None, revision=u'517d065bfbbbad82e7165639d32adf298b48471a', ref=None, branch=None, submodules=None, tag=None, ), dict(name=u'beefcake', remote=None, type=u'GEM', path=None, location=None, revision=None, ref=None, branch=None, submodules=None, tag=None) ] for ex in expected: res = gfl.all_gems[ex['name']] for k, v in ex.items(): self.assertEqual(v, getattr(res, k))
def test_parse_spec_multi_levels_complex(self): gemfilelock = self.get_test_loc( 'gemfile_lock/parse_spec/Gemfile.lock4') gfl = gemfile_lock.GemfileLockParser(gemfilelock) expected_tree = { u'activesupport': { (u'activesupport', u'3.2.17'): { (u'i18n', u'0.6.9'): { (u'clockwork', u'0.4.1'): { (u'fluent-logger', u'0.4.7'): { (u'msgpack', u'0.5.8'): {}, (u'yajl-ruby', u'1.2.0'): {} } } }, (u'multi_json', u'1.9.2'): {} } }, u'addressable': { (u'addressable', u'2.3.6'): {} }, u'allowy': { (u'allowy', u'0.4.0'): { (u'activesupport', u'3.2.17'): { (u'i18n', u'0.6.9'): { (u'clockwork', u'0.4.1'): { (u'fluent-logger', u'0.4.7'): { (u'msgpack', u'0.5.8'): {}, (u'yajl-ruby', u'1.2.0'): {} } } }, (u'multi_json', u'1.9.2'): {} }, (u'i18n', u'0.6.9'): { (u'clockwork', u'0.4.1'): { (u'fluent-logger', u'0.4.7'): { (u'msgpack', u'0.5.8'): {}, (u'yajl-ruby', u'1.2.0'): {} } } } } }, u'clockwork': { (u'clockwork', u'0.4.1'): { (u'fluent-logger', u'0.4.7'): { (u'msgpack', u'0.5.8'): {}, (u'yajl-ruby', u'1.2.0'): {} } } }, u'delayed_job': { (u'delayed_job', u'4.0.0'): { (u'activesupport', u'3.2.17'): { (u'i18n', u'0.6.9'): { (u'clockwork', u'0.4.1'): { (u'fluent-logger', u'0.4.7'): { (u'msgpack', u'0.5.8'): {}, (u'yajl-ruby', u'1.2.0'): {} } } }, (u'multi_json', u'1.9.2'): {} } } }, u'fluent-logger': { (u'fluent-logger', u'0.4.7'): { (u'msgpack', u'0.5.8'): {}, (u'yajl-ruby', u'1.2.0'): {} } }, u'i18n': { (u'i18n', u'0.6.9'): { (u'clockwork', u'0.4.1'): { (u'fluent-logger', u'0.4.7'): { (u'msgpack', u'0.5.8'): {}, (u'yajl-ruby', u'1.2.0'): {} } } } }, u'msgpack': { (u'msgpack', u'0.5.8'): {} }, u'multi_json': { (u'multi_json', u'1.9.2'): {} }, u'yajl-ruby': { (u'yajl-ruby', u'1.2.0'): {} } } result = dict(( n, g.as_nv_tree(), ) for n, g in gfl.all_gems.items()) self.assertEqual(expected_tree, result)
def test_parse_gem(self): gemfilelock = self.get_test_loc('gemfile_lock/parse_gem/Gemfile.lock1') gfl = gemfile_lock.GemfileLockParser(gemfilelock) self.assertEqual('https://rubygems.org/', gfl.current_options['remote'])
def test_parse_source_mixed_step2(self): gemfilelock = self.get_test_loc( 'gemfile_lock/parse_source/Gemfile.lock_mixed2') gfl = gemfile_lock.GemfileLockParser(gemfilelock) self.assertEqual({u'remote': u'http://rubygems.org/'}, gfl.current_options)
def test_parse_gem_with_path_before(self): gemfilelock = self.get_test_loc('gemfile_lock/parse_gem/Gemfile.lock2') gfl = gemfile_lock.GemfileLockParser(gemfilelock) self.assertEqual({u'remote': u'http://rubygems.org/'}, gfl.current_options)
def test_parse_source_two_path(self): gemfilelock = self.get_test_loc( 'gemfile_lock/parse_source/Gemfile.lock_path2') gfl = gemfile_lock.GemfileLockParser(gemfilelock) self.assertEqual({u'remote': u'/'}, gfl.current_options) self.assertEqual('PATH', gfl.current_type)