コード例 #1
0
class test_bes_project_cli_args(program_unit_test):

    _program = program_unit_test.resolve_program(__file__,
                                                 '../../../../bin/best.py')

    def test_ensure(self):
        tester = _bes_project_tester(self)
        requirements_content = '''\
# Requests
beautifulsoup4==4.9.3 # https://github.com/waylan/beautifulsoup
    '''
        requirements_tmp = self.make_temp_file(content=requirements_content)
        rv = tester.ensure(requirements_tmp)
        self.assertEqual(0, rv.exit_code)

    def test_activate_script(self):
        tester = _bes_project_tester(self)
        requirements_content = '''\
# Requests
beautifulsoup4==4.9.3 # https://github.com/waylan/beautifulsoup
    '''
        requirements_tmp = self.make_temp_file(content=requirements_content)
        version = str(python_exe.default_exe_version())
        rv = tester.ensure(requirements_tmp, versions=[version])
        self.assertEqual(0, rv.exit_code)
        rv = tester.activate_script(version)
        self.assertEqual(0, rv.exit_code)
        expected = path.join(tester.root_dir, version, 'bin/activate')
        self.assertEqual(expected, rv.output)
コード例 #2
0
class test_dir_split_cli_args(program_unit_test):

  _program = program_unit_test.resolve_program(__file__, '../../../../bin/best.py')

  def test_split_chunks_of_two(self):
    t = self._split_test([
      multiplied_temp_content('apple', 5),
      multiplied_temp_content('kiwi', 2),
      multiplied_temp_content('lemon', 3),
      multiplied_temp_content('blueberry', 1),
    ], 1, 2)
    expected = [
      'chunk-1',
      'chunk-1/apple1.txt',
      'chunk-1/apple2.txt',
      'chunk-2',
      'chunk-2/apple3.txt',
      'chunk-2/apple4.txt',
      'chunk-3',
      'chunk-3/apple5.txt',
      'chunk-3/blueberry1.txt',
      'chunk-4',
      'chunk-4/kiwi1.txt',
      'chunk-4/kiwi2.txt',
      'chunk-5',
      'chunk-5/lemon1.txt',
      'chunk-5/lemon2.txt',
      'chunk-6',
      'chunk-6/lemon3.txt',
    ]
    self.assertEqual( 0, t.result.exit_code )
    self.assert_filename_list_equal( expected, t.dst_files )
    self.assert_filename_list_equal( [], t.src_files )
    
  def _split_test(self, multiplied_content_items, content_multiplier, chunk_size, extra_content_items = None):
    with dir_operation_tester(multiplied_content_items = multiplied_content_items,
                              content_multiplier = content_multiplier,
                              extra_content_items = extra_content_items) as test:
      args = [
        'dir_split',
        'split',
        '--prefix', 'chunk-',
        '--dst-dir', test.dst_dir,
        '--chunk-size', str(chunk_size),
        test.src_dir,
      ]
      test.result = self.run_program(self._program, args)
    return test
コード例 #3
0
class test_git_cli_args(program_unit_test):

  _program = program_unit_test.resolve_program(__file__, '..', '..', '..', '..', 'bin', 'best.py')
  
  @git_temp_home_func()
  def test_greatest_tag(self):
    config = '''\
add commit1 commit1
  kiwi.txt: kiwi.txt
tag rel/1.0.0 tag1 @commit1
add commit2 commit2
  lemon.txt: lemon.txt
tag rel/1.0.1 tag2 @commit2
add commit3 commit3
  melon.txt: melon.txt
tag rel/1.0.2 tag3 @commit3
'''
    r = git_temp_repo(remote = True, debug = self.DEBUG)
    r.apply_config_text(config)
    args = [
      'git_repo',
      'greatest_tag',
      r.root,
    ]
    rv = self.run_program(self._program, args)
    self.assertEqual(0, rv.exit_code)
    self.assertEqual( 'rel/1.0.2', rv.output.strip() )

  @git_temp_home_func()
  def test_bump_tag(self):
    config = '''\
add commit1 commit1
  kiwi.txt: kiwi.txt
tag 1.0.0 tag1 @commit1
'''
    r = git_temp_repo(remote = True, debug = self.DEBUG)
    r.apply_config_text(config)
    args = [
      'git_repo',
      'bump_tag',
      r.root,
    ]
    rv = self.run_program(self._program, args)
    self.assertEqual(0, rv.exit_code)
    args = [
      'git_repo',
      'greatest_tag',
      r.root,
    ]
    rv = self.run_program(self._program, args)
    self.assertEqual(0, rv.exit_code)
    self.assertEqual( '1.0.1', rv.output.strip() )

  @git_temp_home_func()
  def test_bump_tag_component_major(self):
    config = '''\
add commit1 commit1
  kiwi.txt: kiwi.txt
tag 1.0.0 tag1 @commit1
'''
    r = git_temp_repo(remote = True, debug = self.DEBUG)
    r.apply_config_text(config)
    args = [
      'git_repo',
      'bump_tag',
      '--component', 'major',
      r.root,
    ]
    rv = self.run_program(self._program, args)
    self.assertEqual(0, rv.exit_code)
    args = [
      'git_repo',
      'greatest_tag',
      r.root,
    ]
    rv = self.run_program(self._program, args)
    self.assertEqual(0, rv.exit_code)
    self.assertEqual( '2.0.0', rv.output.strip() )

  @git_temp_home_func()
  def test_bump_tag_component_minor(self):
    config = '''\
add commit1 commit1
  kiwi.txt: kiwi.txt
tag 1.0.0 tag1 @commit1
'''
    r = git_temp_repo(remote = True, debug = self.DEBUG)
    r.apply_config_text(config)
    args = [
      'git_repo',
      'bump_tag',
      '--component', 'minor',
      r.root,
    ]
    rv = self.run_program(self._program, args)
    self.assertEqual(0, rv.exit_code)
    args = [
      'git_repo',
      'greatest_tag',
      r.root,
    ]
    rv = self.run_program(self._program, args)
    self.assertEqual(0, rv.exit_code)
    self.assertEqual( '1.1.0', rv.output.strip() )
    
  @git_temp_home_func()
  def test_bump_tag_component_revision(self):
    config = '''\
add commit1 commit1
  kiwi.txt: kiwi.txt
tag 1.0.0 tag1 @commit1
'''
    r = git_temp_repo(remote = True, debug = self.DEBUG)
    r.apply_config_text(config)
    args = [
      'git_repo',
      'bump_tag',
      '--component', 'revision',
      r.root,
    ]
    rv = self.run_program(self._program, args)
    self.assertEqual(0, rv.exit_code)
    args = [
      'git_repo',
      'greatest_tag',
      r.root,
    ]
    rv = self.run_program(self._program, args)
    self.assertEqual(0, rv.exit_code)
    self.assertEqual( '1.0.1', rv.output.strip() )

  @git_temp_home_func()
  def test_bump_tag_component_major_reset_lower(self):
    config = '''\
add commit1 commit1
  kiwi.txt: kiwi.txt
tag 1.0.1 tag1 @commit1
'''
    r = git_temp_repo(remote = True, debug = self.DEBUG)
    r.apply_config_text(config)
    args = [
      'git_repo',
      'bump_tag',
      '--component', 'major',
      '--reset-lower',
      r.root,
    ]
    rv = self.run_program(self._program, args)
    self.assertEqual(0, rv.exit_code)
    args = [
      'git_repo',
      'greatest_tag',
      r.root,
    ]
    rv = self.run_program(self._program, args)
    self.assertEqual(0, rv.exit_code)
    self.assertEqual( '2.0.0', rv.output.strip() )

  @git_temp_home_func()
  def test_clone(self):
    config = '''\
add commit1 commit1
  kiwi.txt: kiwi.txt
tag 1.0.1 tag1 @commit1
push origin master
'''
    r1 = git_temp_repo(remote = True, debug = self.DEBUG)
    r1.apply_config_text(config)
    tmp_dir = self.make_temp_dir(suffix = '-tmp-clone-dir')
    args = [
      'git_repo',
      'clone',
      r1.address,
      tmp_dir,
    ]
    rv = self.run_program(self._program, args)
    self.assertEqual(0, rv.exit_code)
    r2 = git_repo(tmp_dir)
    self.assertEqual( '1.0.1', r2.greatest_local_tag().name )
    self.assertEqual( [
      'kiwi.txt',
    ], r2.find_all_files() )

  @git_temp_home_func()
  def test_sync(self):
    config = '''\
add commit1 commit1
  kiwi.txt: kiwi.txt
tag 1.0.1 tag1 @commit1
push origin master
'''
    r1 = git_temp_repo(remote = True, debug = self.DEBUG)
    r1.apply_config_text(config)
    tmp_dir = self.make_temp_dir(suffix = '-tmp-sync-dir')
    args = [
      'git_repo',
      'sync',
      r1.address,
      tmp_dir,
    ]
    rv = self.run_program(self._program, args)
    self.assertEqual(0, rv.exit_code)
    r2 = git_repo(tmp_dir)
    self.assertEqual( '1.0.1', r2.greatest_local_tag().name )
    self.assertEqual( [
      'kiwi.txt',
    ], r2.find_all_files() )
コード例 #4
0
class test_computer_setup_cli_args(program_unit_test):

    _program = program_unit_test.resolve_program(__file__, '..', '..', '..',
                                                 '..', 'bin', 'best.py')

    @git_temp_home_func()
    def test_update(self):
        config = '''\
add commit1 commit1
  kiwi.txt: kiwi.txt
tag 1.0.0 tag1 @commit1
'''
        r = git_temp_repo(remote=True, config=config, debug=self.DEBUG)
        self.assertEqual('1.0.0', r.greatest_local_tag().name)
        args = [
            'git',
            'tag',
            '--root-dir',
            r.root,
        ]
        rv = self.run_program(self._program, args)
        self.assertEqual(0, rv.exit_code)
        self.assert_string_equal_strip('''\
local: 1.0.0
remote: 1.0.0
''',
                                       rv.output,
                                       native_line_breaks=True)

    @git_temp_home_func()
    def test_bump_tag_revision(self):
        'Just a smoke test bes.git has more test cases for bump_tag'
        content = [
            'file foo.txt "this is foo.txt" 644',
            'file bar.txt "this is bar.txt" 644',
        ]
        r1 = git_temp_repo(content=content, debug=self.DEBUG)
        r2 = r1.make_temp_cloned_repo()
        self.assertEqual(None, r1.greatest_local_tag())

        args = [
            'git',
            'bump_tag',
            '--root-dir',
            r1.root,
            '--component',
            'revision',
            '--reset-lower',
        ]
        rv = self.run_program(self._program, args)
        self.assertEqual(0, rv.exit_code)
        r2.pull()
        self.assertEqual('1.0.0', r2.greatest_local_tag().name)

        args = [
            'git',
            'bump_tag',
            '--root-dir',
            r1.root,
            '--component',
            'revision',
            '--reset-lower',
        ]
        rv = self.run_program(self._program, args)
        self.assertEqual(0, rv.exit_code)
        r2.pull()
        self.assertEqual('1.0.1', r2.greatest_local_tag().name)

    @git_temp_home_func()
    def test_bump_tag_major(self):
        'Just a smoke test bes.git has more test cases for bump_tag'
        content = [
            'file foo.txt "this is foo.txt" 644',
            'file bar.txt "this is bar.txt" 644',
        ]
        r1 = git_temp_repo(content=content, debug=self.DEBUG)
        r2 = r1.make_temp_cloned_repo()
        self.assertEqual(None, r1.greatest_local_tag())

        args = [
            'git',
            'bump_tag',
            '--root-dir',
            r1.root,
            '--component',
            'revision',
            '--reset-lower',
        ]
        rv = self.run_program(self._program, args)
        self.assertEqual(0, rv.exit_code)
        r2.pull()
        self.assertEqual('1.0.0', r2.greatest_local_tag().name)

        args = [
            'git',
            'bump_tag',
            '--root-dir',
            r1.root,
            '--component',
            'major',
            '--reset-lower',
        ]
        rv = self.run_program(self._program, args)
        self.assertEqual(0, rv.exit_code)
        r2.pull()
        self.assertEqual('2.0.0', r2.greatest_local_tag().name)

    @git_temp_home_func()
    def test_tags(self):
        config = '''\
add commit1 commit1
  kiwi.txt: kiwi.txt
tag rel/1.0.0 tag1 @commit1
add commit2 commit2
  lemon.txt: lemon.txt
tag rel/1.0.1 tag2 @commit2
add commit3 commit3
  melon.txt: melon.txt
tag rel/1.0.2 tag3 @commit3
'''
        r = git_temp_repo(remote=True, config=config, debug=self.DEBUG)
        tmp_output_file = self.make_temp_file(suffix='.txt')
        args = [
            'git',
            'tags',
            '--root-dir',
            r.root,
            '--output',
            tmp_output_file,
            '--style',
            'brief',
        ]
        rv = self.run_program(self._program, args)
        self.assertEqual(0, rv.exit_code)
        self.assert_text_file_equal_fuzzy(
            '''\
rel/1.0.0
rel/1.0.1
rel/1.0.2
''', tmp_output_file)

    @git_temp_home_func()
    def test_bump_tag_with_prefix(self):
        config = '''\
add commit1 commit1
  kiwi.txt: kiwi.txt
tag rel/v2/1.0.0 tag1 @commit1
add commit2 commit2
  lemon.txt: lemon.txt
tag rel/v2/1.0.1 tag2 @commit2
add commit3 commit3
  melon.txt: melon.txt
tag rel/v2/1.0.2 tag3 @commit3
add commit4 commit4
  potato.txt: potato.txt
tag test/v3/1.0.0 tag4 @commit4
tag test/v3/1.0.1 tag5 @commit4
'''
        r = git_temp_repo(remote=True, config=config, debug=self.DEBUG)
        args = [
            'git',
            'bump_tag',
            '--root-dir',
            r.root,
            '--component',
            'revision',
            '--prefix',
            'rel/v2/',
        ]
        self.assertEqual('rel/v2/1.0.2',
                         r.greatest_local_tag(prefix='rel/v2/').name)
        self.assertEqual('test/v3/1.0.1',
                         r.greatest_local_tag(prefix='test/v3/').name)

        rv = self.run_program(self._program, args)
        self.assertEqual(0, rv.exit_code)

        self.assertEqual('rel/v2/1.0.3',
                         r.greatest_local_tag(prefix='rel/v2/').name)
        self.assertEqual('test/v3/1.0.1',
                         r.greatest_local_tag(prefix='test/v3/').name)

    @git_temp_home_func()
    def test_delete_tags(self):
        config = '''\
add commit1 commit1
  kiwi.txt: kiwi.txt
tag rel/1.0.0 tag1 @commit1
add commit2 commit2
  lemon.txt: lemon.txt
tag rel/1.0.1 tag2 @commit2
add commit3 commit3
  melon.txt: melon.txt
tag rel/1.0.2 tag3 @commit3
'''
        r = git_temp_repo(remote=True, config=config, debug=self.DEBUG)
        self.assertEqual(['rel/1.0.0', 'rel/1.0.1', 'rel/1.0.2'],
                         r.list_local_tags().names())
        self.assertEqual(['rel/1.0.0', 'rel/1.0.1', 'rel/1.0.2'],
                         r.list_remote_tags().names())
        args = [
            'git',
            'delete_tags',
            '--root-dir',
            r.root,
            'rel/1.0.1',
        ]
        rv = self.run_program(self._program, args)
        self.assertEqual(0, rv.exit_code)
        self.assertEqual(['rel/1.0.0', 'rel/1.0.2'],
                         r.list_local_tags().names())
        self.assertEqual(['rel/1.0.0', 'rel/1.0.2'],
                         r.list_remote_tags().names())

    @git_temp_home_func()
    def test_remote_print(self):
        r = git_temp_repo(remote=True)
        args = [
            'git',
            'remote_print',
            '--root-dir',
            r.root,
        ]
        rv = self.run_program(self._program, args)
        self.assertEqual(0, rv.exit_code)
        self.assertEqual(r.address, rv.output.strip())

    @git_temp_home_func()
    def test_remote_replace(self):
        new_url = git_temp_repo(remote=True, debug=self.DEBUG).address
        r = git_temp_repo(remote=True, debug=self.DEBUG)
        args = [
            'git',
            'remote_replace',
            '--root-dir',
            r.root,
            new_url,
        ]
        rv = self.run_program(self._program, args)
        self.assertEqual(0, rv.exit_code)

        args = [
            'git',
            'remote_print',
            '--root-dir',
            r.root,
        ]
        rv = self.run_program(self._program, args)
        self.assertEqual(0, rv.exit_code)
        self.assert_filename_equal(new_url, rv.output.strip())
コード例 #5
0
class test_files_cli_args(program_unit_test):

    _program = program_unit_test.resolve_program(__file__,
                                                 '../../../../bin/best.py')

    def test_move_files(self):
        items = [
            'file src/readme.md "readme.md" 0644',
            'file src/a/kiwi-10.txt "kiwi-10.txt" 0644',
            'file src/a/kiwi-20.txt "kiwi-20.txt" 0644',
            'file src/a/kiwi-30.txt "kiwi-30.txt" 0644',
            'file src/b/lemon-10.txt "lemon-10.txt" 0644',
            'file src/b/lemon-20.txt "lemon-20.txt" 0644',
            'file src/b/lemon-30.txt "lemon-30.txt" 0644',
            'file src/c/cheese-10.txt "cheese-10.txt" 0644',
            'file src/icons/foo.note "foo.note" 0644',
        ]
        t = self._move_files_test(extra_content_items=items, recursive=True)
        dst_after_expected = [
            'a',
            'a/kiwi-10.txt',
            'a/kiwi-20.txt',
            'a/kiwi-30.txt',
            'b',
            'b/lemon-10.txt',
            'b/lemon-20.txt',
            'b/lemon-30.txt',
            'c',
            'c/cheese-10.txt',
            'icons',
            'icons/foo.note',
            'readme.md',
        ]
        self.assert_filename_list_equal(dst_after_expected, t.dst_files)
        src_after_expected = []
        self.assert_filename_list_equal(src_after_expected, t.src_files)

    def test_move_files_with_duplicate_file_conflicts(self):
        items = [
            'file src/readme.md "readme.md" 0644',
            'file src/a/kiwi-10.txt "kiwi-10.txt" 0644',
            'file src/a/kiwi-20.txt "kiwi-20.txt" 0644',
            'file src/a/kiwi-30.txt "kiwi-30.txt" 0644',
            'file src/b/lemon-10.txt "lemon-10.txt" 0644',
            'file src/b/lemon-20.txt "lemon-20.txt" 0644',
            'file src/b/lemon-30.txt "lemon-30.txt" 0644',
            'file src/c/cheese-10.txt "cheese-10.txt" 0644',
            'file src/icons/foo.note "foo.note" 0644',
            'file dst/readme.md "readme.md" 0644',
            'file dst/icons/foo.note "foo.note" 0644',
        ]
        t = self._move_files_test(extra_content_items=items, recursive=True)
        dst_after_expected = [
            'a',
            'a/kiwi-10.txt',
            'a/kiwi-20.txt',
            'a/kiwi-30.txt',
            'b',
            'b/lemon-10.txt',
            'b/lemon-20.txt',
            'b/lemon-30.txt',
            'c',
            'c/cheese-10.txt',
            'icons',
            'icons/foo.note',
            'readme.md',
        ]
        self.assert_filename_list_equal(dst_after_expected, t.dst_files)
        src_after_expected = []
        self.assert_filename_list_equal(src_after_expected, t.src_files)

    def test_move_files_with_non_duplicate_file_conflicts(self):
        items = [
            'file src/readme.md "src readme.md" 0644',
            'file src/a/kiwi-10.txt "kiwi-10.txt" 0644',
            'file src/a/kiwi-20.txt "kiwi-20.txt" 0644',
            'file src/a/kiwi-30.txt "kiwi-30.txt" 0644',
            'file src/b/lemon-10.txt "lemon-10.txt" 0644',
            'file src/b/lemon-20.txt "lemon-20.txt" 0644',
            'file src/b/lemon-30.txt "lemon-30.txt" 0644',
            'file src/c/cheese-10.txt "cheese-10.txt" 0644',
            'file src/icons/foo.note "src foo.note" 0644',
            'file dst/readme.md "dst readme.md" 0644',
            'file dst/icons/foo.note "dst foo.note" 0644',
        ]
        t = self._move_files_test(extra_content_items=items,
                                  recursive=True,
                                  dup_file_timestamp='timestamp',
                                  dup_file_count=1)
        dst_after_expected = [
            'a',
            'a/kiwi-10.txt',
            'a/kiwi-20.txt',
            'a/kiwi-30.txt',
            'b',
            'b/lemon-10.txt',
            'b/lemon-20.txt',
            'b/lemon-30.txt',
            'c',
            'c/cheese-10.txt',
            'icons',
            'icons/foo-timestamp-1.note',
            'icons/foo.note',
            'readme-timestamp-2.md',
            'readme.md',
        ]
        self.assert_filename_list_equal(dst_after_expected, t.dst_files)
        src_after_expected = []
        self.assert_filename_list_equal(src_after_expected, t.src_files)

    def test_move_files_with_dry_run(self):
        items = [
            'file src/readme.md "readme.md" 0644',
            'file src/a/kiwi-10.txt "kiwi-10.txt" 0644',
            'file src/a/kiwi-20.txt "kiwi-20.txt" 0644',
            'file src/a/kiwi-30.txt "kiwi-30.txt" 0644',
            'file src/b/lemon-10.txt "lemon-10.txt" 0644',
            'file src/b/lemon-20.txt "lemon-20.txt" 0644',
            'file src/b/lemon-30.txt "lemon-30.txt" 0644',
            'file src/c/cheese-10.txt "cheese-10.txt" 0644',
            'file src/icons/foo.note "foo.note" 0644',
        ]
        t = self._move_files_test(extra_content_items=items,
                                  recursive=True,
                                  dry_run=True)
        src_after_expected = [
            'a',
            'a/kiwi-10.txt',
            'a/kiwi-20.txt',
            'a/kiwi-30.txt',
            'b',
            'b/lemon-10.txt',
            'b/lemon-20.txt',
            'b/lemon-30.txt',
            'c',
            'c/cheese-10.txt',
            'icons',
            'icons/foo.note',
            'readme.md',
        ]
        self.assert_filename_list_equal(src_after_expected, t.src_files)
        dst_after_expected = []
        self.assert_filename_list_equal(dst_after_expected, t.dst_files)

        self.assert_string_equal_fuzzy(
            f'''\
DRY_RUN: {t.src_dir}/a/kiwi-10.txt => {t.dst_dir}/a/kiwi-10.txt
DRY_RUN: {t.src_dir}/a/kiwi-20.txt => {t.dst_dir}/a/kiwi-20.txt
DRY_RUN: {t.src_dir}/a/kiwi-30.txt => {t.dst_dir}/a/kiwi-30.txt
DRY_RUN: {t.src_dir}/b/lemon-10.txt => {t.dst_dir}/b/lemon-10.txt
DRY_RUN: {t.src_dir}/b/lemon-20.txt => {t.dst_dir}/b/lemon-20.txt
DRY_RUN: {t.src_dir}/b/lemon-30.txt => {t.dst_dir}/b/lemon-30.txt
DRY_RUN: {t.src_dir}/c/cheese-10.txt => {t.dst_dir}/c/cheese-10.txt
DRY_RUN: {t.src_dir}/icons/foo.note => {t.dst_dir}/icons/foo.note
DRY_RUN: {t.src_dir}/readme.md => {t.dst_dir}/readme.md
''', t.result.output)

    def xtest_partition_with_prefix_dry_run(self):
        items = [
            temp_content('file', 'src/readme.md', 'readme.md', 0o0644),
            temp_content('file', 'src/a/kiwi-10.txt', 'kiwi-10.txt', 0o0644),
            temp_content('file', 'src/a/kiwi-20.txt', 'kiwi-20.txt', 0o0644),
            temp_content('file', 'src/a/kiwi-30.txt', 'kiwi-30.txt', 0o0644),
            temp_content('file', 'src/b/lemon-10.txt', 'lemon-10.txt', 0o0644),
            temp_content('file', 'src/b/lemon-20.txt', 'lemon-20.txt', 0o0644),
            temp_content('file', 'src/b/lemon-30.txt', 'lemon-30.txt', 0o0644),
            temp_content('file', 'src/c/cheese-10.txt', 'cheese-10.txt',
                         0o0644),
            temp_content('file', 'src/icons/foo.note', 'foo.note', 0o0644),
        ]
        t = self._move_files_test(extra_content_items=items,
                                  recursive=True,
                                  dry_run=True)
        dst_after_expected = []
        self.assert_filename_list_equal(dst_after_expected, t.dst_files)
        src_after_expected = [
            'a',
            'a/kiwi-10.txt',
            'a/kiwi-20.txt',
            'a/kiwi-30.txt',
            'b',
            'b/lemon-10.txt',
            'b/lemon-20.txt',
            'b/lemon-30.txt',
            'c',
            'c/cheese-10.txt',
            'icons',
            'icons/foo.note',
            'readme.md',
        ]
        self.assert_filename_list_equal(src_after_expected, t.src_files)

        self.assert_string_equal_fuzzy(
            f'''\
{t.src_dir}/a/kiwi-10.txt => {t.dst_dir}/kiwi/kiwi-10.txt
{t.src_dir}/a/kiwi-20.txt => {t.dst_dir}/kiwi/kiwi-20.txt
{t.src_dir}/a/kiwi-30.txt => {t.dst_dir}/kiwi/kiwi-30.txt 
{t.src_dir}/b/lemon-10.txt => {t.dst_dir}/lemon/lemon-10.txt 
{t.src_dir}/b/lemon-20.txt => {t.dst_dir}/lemon/lemon-20.txt 
{t.src_dir}/b/lemon-30.txt => {t.dst_dir}/lemon/lemon-30.txt 
{t.src_dir}/c/cheese-10.txt => {t.dst_dir}/cheese/cheese-10.txt
''', t.result.output)

    def _move_files_test(self,
                         extra_content_items=None,
                         recursive=False,
                         dry_run=False,
                         dup_file_timestamp=None,
                         dup_file_count=None):
        with dir_operation_tester(
                extra_content_items=extra_content_items) as test:
            file_util.mkdir(test.dst_dir)
            args = [
                'files',
                'move',
                test.src_dir,
                test.dst_dir,
            ]
            if recursive:
                args.append('--recursive')
            if dry_run:
                args.append('--dry-run')
            if dup_file_timestamp:
                args.extend(['--dup-file-timestamp', dup_file_timestamp])
            if dup_file_count:
                args.extend(['--dup-file-count', str(dup_file_count)])
            test.result = self.run_program(self._program, args)
        return test
コード例 #6
0
class test_file_split_cli_args(program_unit_test):

    _program = program_unit_test.resolve_program(__file__,
                                                 '../../../../bin/best.py')

    def test_find_and_unsplit(self):
        items = [
            temp_content('file', 'src/a/foo/kiwi.txt', 'this is kiwi', 0o0644),
            temp_content('file', 'src/a/parts/xfoo.txt.001', 'garbage',
                         0o0644),
            temp_content('file', 'src/a/parts/foo.txt.001', 'foo001', 0o0644),
            temp_content('file', 'src/a/parts/foo.txt.002', 'foo002', 0o0644),
            temp_content('file', 'src/a/parts/foo.txt.003', 'foo003', 0o0644),
            temp_content('file', 'src/a/parts/foo.txt.xx4', 'garbage', 0o0644),
            temp_content('file', 'src/a/parts/foo.txt.003.garbage', 'garbage',
                         0o0644),
            temp_content('file', 'src/b/icons/lemon.jpg.01', 'lemon01',
                         0o0644),
            temp_content('file', 'src/b/icons/lemon.jpg.02', 'lemon02',
                         0o0644),
            temp_content('file', 'src/b/icons/lemon.jpg.03', 'lemon03',
                         0o0644),
        ]
        t = self._find_and_unsplit_test(extra_content_items=items,
                                        recursive=True)
        self.assertEqual([
            'a',
            'a/foo',
            'a/foo/kiwi.txt',
            'a/parts',
            'a/parts/foo.txt',
            'a/parts/foo.txt.003.garbage',
            'a/parts/foo.txt.xx4',
            'a/parts/xfoo.txt.001',
            'b',
            'b/icons',
            'b/icons/lemon.jpg',
        ], t.src_files)
        self.assert_text_file_equal('foo001foo002foo003',
                                    f'{t.src_dir}/a/parts/foo.txt')
        self.assert_text_file_equal('lemon01lemon02lemon03',
                                    f'{t.src_dir}/b/icons/lemon.jpg')

    def test_find_and_unsplit_dry_run(self):
        items = [
            temp_content('file', 'src/a/foo/kiwi.txt', 'this is kiwi', 0o0644),
            temp_content('file', 'src/a/parts/xfoo.txt.001', 'garbage',
                         0o0644),
            temp_content('file', 'src/a/parts/foo.txt.001', 'foo001', 0o0644),
            temp_content('file', 'src/a/parts/foo.txt.002', 'foo002', 0o0644),
            temp_content('file', 'src/a/parts/foo.txt.003', 'foo003', 0o0644),
            temp_content('file', 'src/a/parts/foo.txt.xx4', 'garbage', 0o0644),
            temp_content('file', 'src/a/parts/foo.txt.003.garbage', 'garbage',
                         0o0644),
            temp_content('file', 'src/b/icons/lemon.jpg.01', 'lemon01',
                         0o0644),
            temp_content('file', 'src/b/icons/lemon.jpg.02', 'lemon02',
                         0o0644),
            temp_content('file', 'src/b/icons/lemon.jpg.03', 'lemon03',
                         0o0644),
        ]
        t = self._find_and_unsplit_test(extra_content_items=items,
                                        recursive=True,
                                        dry_run=True)
        self.assertEqual([
            'a',
            'a/foo',
            'a/foo/kiwi.txt',
            'a/parts',
            'a/parts/foo.txt.001',
            'a/parts/foo.txt.002',
            'a/parts/foo.txt.003',
            'a/parts/foo.txt.003.garbage',
            'a/parts/foo.txt.xx4',
            'a/parts/xfoo.txt.001',
            'b',
            'b/icons',
            'b/icons/lemon.jpg.01',
            'b/icons/lemon.jpg.02',
            'b/icons/lemon.jpg.03',
        ], t.src_files)
        self.assert_string_equal_fuzzy(
            f'''\
{t.src_dir}/a/parts/foo.txt:
  {t.src_dir}/a/parts/foo.txt.001
  {t.src_dir}/a/parts/foo.txt.002
  {t.src_dir}/a/parts/foo.txt.003
{t.src_dir}/b/icons/lemon.jpg:
  {t.src_dir}/b/icons/lemon.jpg.01
  {t.src_dir}/b/icons/lemon.jpg.02
  {t.src_dir}/b/icons/lemon.jpg.03
''', t.result.output)
        return

    def _find_and_unsplit_test(
            self,
            extra_content_items=None,
            recursive=False,
            check_downloading=_DEFAULT_FILE_SPLIT_OPTIONS.check_downloading,
            check_modified=_DEFAULT_FILE_SPLIT_OPTIONS.check_modified,
            check_modified_interval=_DEFAULT_FILE_SPLIT_OPTIONS.
        check_modified_interval,
            dry_run=False):
        options = file_split_options(recursive=recursive,
                                     check_downloading=check_downloading)
        with dir_operation_tester(
                extra_content_items=extra_content_items) as test:
            args = [
                'file_split',
                'unsplit',
                test.src_dir,
            ]
            if recursive:
                args.append('--recursive')
            if check_downloading:
                args.append('--check-downloading')
            if dry_run:
                args.append('--dry-run')
            test.result = self.run_program(self._program, args)
        return test
コード例 #7
0
class test_vm_builder_cli_args(program_unit_test):

    _program = program_unit_test.resolve_program(__file__, '..', '..', '..',
                                                 '..', 'bin', 'best.py')

    @unit_test_function_skip.skip_if(not host.is_unix(), 'not unix')
    def test_vm_builder_ssh_setup(self):

        git_access_ssh_public_key_content = r'''
ssh-rsa test_public_bitbucket_key fred@bedrock
'''
        git_access_ssh_private_key_content = r'''
-----BEGIN RSA PRIVATE KEY-----
test_private_bitbucket_key
-----END RSA PRIVATE KEY-----
'''
        git_access_ssh_public_key = self.make_temp_file(
            content=git_access_ssh_public_key_content)
        git_access_ssh_private_key = self.make_temp_file(
            content=git_access_ssh_private_key_content)

        vm_builder_access_ssh_public_key_content = r'''
ssh-rsa test_public_access_key sally@bedrock
'''
        vm_builder_access_ssh_private_key_content = r'''
-----BEGIN RSA PRIVATE KEY-----
test_private_access_key
-----END RSA PRIVATE KEY-----
'''
        vm_builder_access_ssh_public_key = self.make_temp_file(
            content=vm_builder_access_ssh_public_key_content)

        tmp_dir = self.make_temp_dir(suffix='.ssh')

        args = [
            'vm_builder',
            'vm_builder_ssh_setup',
            '--dont-include-ip-address',
            '--dont-include-comment',
            tmp_dir,
            'fred',
            git_access_ssh_public_key,
            git_access_ssh_private_key,
            'bitbucket.org',
            vm_builder_access_ssh_public_key,
        ]

        rv = self.run_program(self._program, args)
        self.assertEqual(0, rv.exit_code)
        files = file_find.find(tmp_dir)
        self.assertEqual([
            'authorized_keys',
            'config',
            'id_rsa_bitbucket_org',
            'id_rsa_bitbucket_org.pub',
            'known_hosts',
            'vm_builder_access_key.pub',
        ], files)

        private_key = path.join(tmp_dir, 'id_rsa_bitbucket_org')
        config_text = file_util.read(path.join(tmp_dir, 'config'),
                                     codec='utf-8').strip()
        expected_config = '''
Host bitbucket.org
  Hostname bitbucket.org
  IdentityFile {private_key}
  User fred
'''.format(private_key=private_key)
        self.assert_string_equal(expected_config,
                                 config_text,
                                 strip=True,
                                 multi_line=True,
                                 native_line_breaks=True)

        known_hosts_text = file_util.read(path.join(tmp_dir, 'known_hosts'),
                                          codec='utf-8').strip()
        expected_known_hosts = '''
bitbucket.org ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAubiN81eDcafrgMeLzaFPsw2kNvEcqTKl/VqLat/MaB33pZy0y3rJZtnqwR2qOOvbwKZYKiEO1O6VqNEBxKvJJelCq0dTXWT5pbO2gDXC6h6QDXCaHo6pOHGPUy+YBaGQRGuSusMEASYiWunYN0vCAI8QaXnWMXNMdFP3jHAJH0eDsoiGnLPBlBp4TNm6rYI74nMzgz3B9IikW4WVK+dc8KZJZWYjAuORU3jc1c/NPskD2ASinf8v3xnfXeukU0sJ5N6m5E8VLjObPEO+mN2t/FZTMZLiFqPWc/ALSqnMnnhwrNi2rbfg/rd/IpL8Le3pSBne8+seeFVBoGqzHM9yXw==
'''
        self.assert_string_equal(expected_known_hosts,
                                 known_hosts_text,
                                 strip=True,
                                 multi_line=True,
                                 native_line_breaks=True)

        abs_files = [path.join(tmp_dir, f) for f in files]
        if host.is_unix():
            for filename in abs_files:
                self.assertEqual(0o0600, file_util.mode(filename))

    def test_vm_host_ssh_setup(self):
        vm_builder_access_ssh_public_key_content = r'''
ssh-rsa test_public_access_key sally@bedrock
'''
        vm_builder_access_ssh_private_key_content = r'''
-----BEGIN RSA PRIVATE KEY-----
test_private_access_key
-----END RSA PRIVATE KEY-----
'''
        vm_builder_access_ssh_public_key = self.make_temp_file(
            content=vm_builder_access_ssh_public_key_content)
        vm_builder_access_ssh_private_key = self.make_temp_file(
            content=vm_builder_access_ssh_private_key_content)
        tmp_dir = self.make_temp_dir(suffix='.ssh')

        args = [
            'vm_builder',
            'vm_host_ssh_setup',
            '--dont-include-ip-address',
            '--dont-include-comment',
            tmp_dir,
            'vm_host_access_key',
            'fred',
            vm_builder_access_ssh_public_key,
            vm_builder_access_ssh_private_key,
        ]

        rv = self.run_program(self._program, args)
        self.assertEqual(0, rv.exit_code)
        files = file_find.find(tmp_dir)
        print(files)
        self.assertEqual([
            'vm_host_access_key',
            'vm_host_access_key.pub',
        ], files)
        return

        private_key = path.join(tmp_dir, 'id_rsa_bitbucket_org')
        expected_config = '''
Host bitbucket.org
  Hostname bitbucket.org
  IdentityFile {private_key}
  User fred
'''.format(private_key=private_key)
        self.assert_text_file_equal(expected_config,
                                    path.join(tmp_dir, 'config'),
                                    codec='utf-8',
                                    strip=True,
                                    native_line_breaks=True)

        expected_known_hosts = '''
bitbucket.org ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAubiN81eDcafrgMeLzaFPsw2kNvEcqTKl/VqLat/MaB33pZy0y3rJZtnqwR2qOOvbwKZYKiEO1O6VqNEBxKvJJelCq0dTXWT5pbO2gDXC6h6QDXCaHo6pOHGPUy+YBaGQRGuSusMEASYiWunYN0vCAI8QaXnWMXNMdFP3jHAJH0eDsoiGnLPBlBp4TNm6rYI74nMzgz3B9IikW4WVK+dc8KZJZWYjAuORU3jc1c/NPskD2ASinf8v3xnfXeukU0sJ5N6m5E8VLjObPEO+mN2t/FZTMZLiFqPWc/ALSqnMnnhwrNi2rbfg/rd/IpL8Le3pSBne8+seeFVBoGqzHM9yXw==
'''
        self.assert_text_file_equal(expected_known_hosts,
                                    path.join(tmp_dir, 'known_hosts'),
                                    codec='utf-8',
                                    strip=True,
                                    native_line_breaks=True)

        abs_files = [path.join(tmp_dir, f) for f in files]
        if host.is_unix():
            for filename in abs_files:
                self.assertEqual(0o0600, file_util.mode(filename))
コード例 #8
0
class test_properties_file_cli_args(program_unit_test):

    _program = program_unit_test.resolve_program(__file__, '..', '..', '..',
                                                 '..', 'bin', 'best.py')

    def test_set_non_existing_file(self):
        tmp_dir = self.make_temp_dir()
        tmp_file = path.join(tmp_dir, 'foo.yml')
        args = [
            'properties_file',
            'set',
            tmp_file,
            'fruit',
            'kiwi',
        ]
        rv = self.run_program(self._program, args)
        self.assertEqual(0, rv.exit_code)
        expected = '''\
fruit: kiwi
'''
        self.assert_text_file_equal(expected, tmp_file)

    def test_set_existing_file(self):
        content = '''\
fruit: kiwi
'''
        tmp_file = self.make_temp_file(content=content)
        args = [
            'properties_file',
            'set',
            tmp_file,
            'fruit',
            'apple',
        ]
        rv = self.run_program(self._program, args)
        self.assertEqual(0, rv.exit_code)
        expected = '''\
fruit: apple
'''
        self.assert_text_file_equal(expected, tmp_file)

    def test_set_value_nonexistent_file(self):
        tmp = self.make_temp_file(suffix='.yml')
        args = [
            'properties_file',
            'set',
            tmp,
            'fruit',
            'kiwi',
        ]
        rv = self.run_program(self._program, args)
        self.assertEqual(0, rv.exit_code)
        expected = '''\
fruit: kiwi
'''
        self.assert_text_file_equal(expected, tmp)

    def test_set_value_existing_file(self):
        content = '''\
fruit: kiwi
'''
        tmp = self.make_temp_file(content=content, suffix='.yml')
        args = [
            'properties_file',
            'set',
            tmp,
            'fruit',
            'apple',
        ]
        rv = self.run_program(self._program, args)
        self.assertEqual(0, rv.exit_code)
        expected = '''\
fruit: apple
'''
        self.assert_text_file_equal(expected, tmp)

    def test_get_value_existing_file(self):
        content = '''\
fruit: kiwi
'''
        tmp = self.make_temp_file(content=content, suffix='.yml')
        args = [
            'properties_file',
            'get',
            tmp,
            'fruit',
        ]
        rv = self.run_program(self._program, args)
        self.assertEqual(0, rv.exit_code)
        self.assertEqual('kiwi', rv.output.strip())

    def test_bump_version(self):
        content = '''\
ver: 1.2.3
'''
        tmp = self.make_temp_file(content=content, suffix='.yml')
        args = [
            'properties_file',
            'bump_version',
            tmp,
            'ver',
        ]
        rv = self.run_program(self._program, args)
        self.assertEqual(0, rv.exit_code)
        expected = '''\
ver: 1.2.4
'''
        self.assert_text_file_equal(expected, tmp)

    def test_bump_version_major(self):
        content = '''\
ver: 1.2.3
'''
        tmp = self.make_temp_file(content=content, suffix='.yml')
        args = [
            'properties_file',
            'bump_version',
            '--component',
            'major',
            tmp,
            'ver',
        ]
        rv = self.run_program(self._program, args)
        self.assertEqual(0, rv.exit_code)
        expected = '''\
ver: 2.2.3
'''
        self.assert_text_file_equal(expected, tmp)
コード例 #9
0
class test_file_duplicates_cli_args(program_unit_test):

    _program = program_unit_test.resolve_program(__file__,
                                                 '../../../../bin/best.py')

    def test_find_duplicates(self):
        items = [
            temp_content('file', 'src/a/kiwi.jpg', 'this is kiwi', 0o0644),
            temp_content('file', 'src/a/apple.jpg', 'this is apple', 0o0644),
            temp_content('file', 'src/a/lemon.jpg', 'this is lemon', 0o0644),
            temp_content('file', 'src/b/kiwi_dup1.jpg', 'this is kiwi',
                         0o0644),
            temp_content('file', 'src/c/kiwi_dup2.jpg', 'this is kiwi',
                         0o0644),
        ]
        t = self._find_dups_test(extra_content_items=items, recursive=True)
        self.assert_string_equal_fuzzy(
            f'''\
{t.src_dir}/a/kiwi.jpg:
  {t.src_dir}/b/kiwi_dup1.jpg
  {t.src_dir}/c/kiwi_dup2.jpg
''', t.result.output)

    def test_find_duplicates_delete(self):
        items = [
            temp_content('file', 'src/a/kiwi.jpg', 'this is kiwi', 0o0644),
            temp_content('file', 'src/a/apple.jpg', 'this is apple', 0o0644),
            temp_content('file', 'src/a/lemon.jpg', 'this is lemon', 0o0644),
            temp_content('file', 'src/b/kiwi_dup1.jpg', 'this is kiwi',
                         0o0644),
            temp_content('file', 'src/c/kiwi_dup2.jpg', 'this is kiwi',
                         0o0644),
        ]
        t = self._find_dups_test(extra_content_items=items,
                                 recursive=True,
                                 delete=True)
        self.assert_string_equal_fuzzy(
            f'''\
{t.src_dir}/a/kiwi.jpg:
  {t.src_dir}/b/kiwi_dup1.jpg
  {t.src_dir}/c/kiwi_dup2.jpg
''', t.result.output)

        src_after_expected = [
            'a',
            'a/apple.jpg',
            'a/kiwi.jpg',
            'a/lemon.jpg',
        ]
        self.assert_filename_list_equal(src_after_expected, t.src_files)

    def test_find_duplicates_delete_with_keep_empty_dirs(self):
        items = [
            temp_content('file', 'src/a/kiwi.jpg', 'this is kiwi', 0o0644),
            temp_content('file', 'src/a/apple.jpg', 'this is apple', 0o0644),
            temp_content('file', 'src/a/lemon.jpg', 'this is lemon', 0o0644),
            temp_content('file', 'src/b/kiwi_dup1.jpg', 'this is kiwi',
                         0o0644),
            temp_content('file', 'src/c/kiwi_dup2.jpg', 'this is kiwi',
                         0o0644),
        ]
        t = self._find_dups_test(extra_content_items=items,
                                 recursive=True,
                                 delete=True,
                                 keep_empty_dirs=True)
        self.assert_string_equal_fuzzy(
            f'''\
{t.src_dir}/a/kiwi.jpg:
  {t.src_dir}/b/kiwi_dup1.jpg
  {t.src_dir}/c/kiwi_dup2.jpg
''', t.result.output)

        src_after_expected = [
            'a',
            'a/apple.jpg',
            'a/kiwi.jpg',
            'a/lemon.jpg',
            'b',
            'c',
        ]
        self.assert_filename_list_equal(src_after_expected, t.src_files)

    def _find_dups_test(self,
                        extra_content_items=None,
                        recursive=False,
                        small_checksum_size=1024 * 1024,
                        prefer_prefixes=None,
                        delete=False,
                        keep_empty_dirs=False):
        with dir_operation_tester(
                extra_content_items=extra_content_items) as test:
            args = [
                'file_duplicates',
                'dups',
                test.src_dir,
            ]
            if recursive:
                args.append('--recursive')
            if delete:
                args.append('--delete')
            if keep_empty_dirs:
                args.append('--keep')
            test.result = self.run_program(self._program, args)
        return test
コード例 #10
0
class test_dirs_cli_args(program_unit_test):

    _program = program_unit_test.resolve_program(__file__,
                                                 '../../../../bin/best.py')

    def test_remove_empty(self):
        t = self._test([
            'dir  src/empty1             ""              700',
            'file src/readme.md          "readme.md"     644',
            'file src/a/kiwi-30.jpg      "kiwi-30.txt"   644',
            'dir  src/a/empty2           ""              700',
            'file src/b/lemon-10.jpg     "lemon-10.txt"  644',
            'file src/c/cheese-10.jpg    "cheese-10.jpg" 644',
            'file src/icons/foo.png      "foo.png"       644',
            'file src/lemon-40.jpg       "lemon-40.txt"  644',
            'dir  src/a/empty2           ""              700',
            'dir  src/foo/bar/baz/empty3 "lemon-40.txt"  700',
        ],
                       recursive=False)
        expected = [
            'a',
            'a/empty2',
            'b',
            'c',
            'foo',
            'foo/bar',
            'foo/bar/baz',
            'foo/bar/baz/empty3',
            'icons',
        ]
        self.assertEqual(0, t.result.exit_code)
        self.assert_filename_list_equal(expected, t.src_dirs)

    def test_remove_empty_recursive(self):
        t = self._test([
            'dir  src/empty1             ""              700',
            'file src/readme.md          "readme.md"     644',
            'file src/a/kiwi-30.jpg      "kiwi-30.txt"   644',
            'dir  src/a/empty2           ""              700',
            'file src/b/lemon-10.jpg     "lemon-10.txt"  644',
            'file src/c/cheese-10.jpg    "cheese-10.jpg" 644',
            'file src/icons/foo.png      "foo.png"       644',
            'file src/lemon-40.jpg       "lemon-40.txt"  644',
            'dir  src/a/empty2           ""              700',
            'dir  src/foo/bar/baz/empty3 "lemon-40.txt"  700',
        ],
                       recursive=True)
        expected = [
            'a',
            'b',
            'c',
            'icons',
        ]
        self.assertEqual(0, t.result.exit_code)
        self.assert_filename_list_equal(expected, t.src_dirs)

    def test_remove_empty_dry_run(self):
        t = self._test([
            'dir  src/empty1             ""              700',
            'file src/readme.md          "readme.md"     644',
            'file src/a/kiwi-30.jpg      "kiwi-30.txt"   644',
            'dir  src/a/empty2           ""              700',
            'file src/b/lemon-10.jpg     "lemon-10.txt"  644',
            'file src/c/cheese-10.jpg    "cheese-10.jpg" 644',
            'file src/icons/foo.png      "foo.png"       644',
            'file src/lemon-40.jpg       "lemon-40.txt"  644',
            'dir  src/a/empty2           ""              700',
            'dir  src/foo/bar/baz/empty3 "lemon-40.txt"  700',
        ],
                       recursive=True,
                       dry_run=True)
        expected = [
            'a',
            'a/empty2',
            'b',
            'c',
            'empty1',
            'foo',
            'foo/bar',
            'foo/bar/baz',
            'foo/bar/baz/empty3',
            'icons',
        ]
        self.assertEqual(0, t.result.exit_code)
        self.assert_filename_list_equal(expected, t.src_dirs)
        self.assert_string_equal_fuzzy(
            f'''
DRY_RUN: would remove {t.src_dir}/a/empty2
DRY_RUN: would remove {t.src_dir}/empty1
DRY_RUN: would remove {t.src_dir}/foo/bar/baz/empty3
''', t.result.output)

    def _test(self, items, recursive=False, dry_run=False):
        with dir_operation_tester(extra_content_items=items) as test:
            args = [
                'dirs',
                'remove_empty',
                test.src_dir,
            ]
            if recursive:
                args.append('--recursive')
            if dry_run:
                args.append('--dry-run')
            test.result = self.run_program(self._program, args)
        return test
コード例 #11
0
class test_git_repo_document_cli_args(program_unit_test):

    _program = program_unit_test.resolve_program(__file__, '..', '..', '..',
                                                 '..', 'bin', 'best.py')

    @git_temp_home_func()
    def test_basic(self):
        # This is the document to write to the repository.
        tmp_source_doc = self.make_temp_file(content='abc', suffix='-doc.txt')

        # Here's a repository to put it in.
        r = git_temp_repo(debug=self.DEBUG)
        r.add_file('dummy.txt', content='dummy')
        r.push('origin', 'master')

        tmp_db_dir = self.make_temp_dir()

        args = [
            'git_repo_document',
            'update',
            tmp_source_doc,
            r.address,
            'master',
            '--working-dir',
            tmp_db_dir,
        ]
        rv = self.run_program(self._program, args)
        self.assertEqual(0, rv.exit_code)

        # Also check doc is in repo. It will have the same name as the source doc.
        filename = path.basename(tmp_source_doc)
        r.pull()
        contents = r.read_file(filename)
        self.assertEqual(contents, 'abc')

        # Since we now have a file in the repo, let's also test whether load_document can read it.

        # Here's an auto-delete temp directory for the document DB's local repository.
        tmp_db_dir2 = temp_file.make_temp_dir(delete=not self.DEBUG)

        # By default, the CLI will put the output file in a file with the same name as the file in
        # the repo, in the current directory.
        tmp_target_filepath = path.join(getcwd(), filename)
        if path.exists(tmp_target_filepath):
            remove(tmp_target_filepath)

        # Run the CLI.
        args = [
            'git_repo_document',
            'load',
            filename,
            r.address,
            'master',
            '--working-dir',
            tmp_db_dir2,
        ]
        rv = self.run_program(self._program, args)
        self.assertEqual(0, rv.exit_code)

        # See if the file and contents are there.
        actual = file_util.read(tmp_target_filepath)
        self.assertEqual(actual, b'abc')

        # This will cause an exception and fail the test if the file wasn't created by the CLI.
        remove(tmp_target_filepath)
コード例 #12
0
class test_git_identity_cli_args(program_unit_test):

  _program = program_unit_test.resolve_program(__file__, '..', '..', '..', '..', 'bin', 'best.py')
  
  @env_override_temp_home_func()
  def test_git_identity_get_never_set(self):
    args = [
      'git_identity',
      'get',
    ]
    rv = self.run_program(self._program, args)
    self.assertEqual(0, rv.exit_code)
    self.assertEqual( '', rv.output.strip() )

  @env_override_temp_home_func()
  def test_git_identity_set(self):
    args = [
      'git_identity',
      'set',
      'Foo Bar',
      '*****@*****.**',
    ]
    rv = self.run_program(self._program, args)
    self.assertEqual(0, rv.exit_code)

    args = [
      'git_identity',
      'get',
    ]
    rv = self.run_program(self._program, args)
    self.assertEqual(0, rv.exit_code)
    self.assertEqual( 'Foo Bar:[email protected]', rv.output.strip() )

    args = [
      'git_identity',
      'get',
      '--name',
    ]
    rv = self.run_program(self._program, args)
    self.assertEqual(0, rv.exit_code)
    self.assertEqual( 'Foo Bar', rv.output.strip() )

    args = [
      'git_identity',
      'get',
      '--email',
    ]
    rv = self.run_program(self._program, args)
    self.assertEqual(0, rv.exit_code)
    self.assertEqual( '*****@*****.**', rv.output.strip() )

  @env_override_temp_home_func()
  def xtest_git_identity_ensure(self):
    args = [
      'git_identity',
      'ensure',
      'Foo Bar',
      '*****@*****.**',
    ]
    rv = self.run_program(self._program, args)
    self.assertEqual(0, rv.exit_code)

    args = [
      'git_identity',
      'get',
    ]
    rv = self.run_program(self._program, args)
    self.assertEqual(0, rv.exit_code)
    self.assertEqual( 'Foo Bar:[email protected]', rv.output.strip() )
コード例 #13
0
class test_pip_project_cli_args(program_unit_test):

    _program = program_unit_test.resolve_program(__file__,
                                                 '../../../../bin/best.py')

    def test_create(self):
        tester = _pip_project_tester(self)
        rv = tester.create()
        self.assertEqual(0, rv.exit_code)

    def test_install(self):
        tester = _pip_project_tester(self)
        rv = tester.create()
        self.assertEqual(0, rv.exit_code)
        installed1 = tester.installed()

        rv = self.run_program(self._program,
                              tester.make_args('install', 'chardet'))
        self.assertEqual(0, rv.exit_code)
        installed2 = tester.installed()

        actual = set(installed2) - set(installed1)
        expected = {'chardet'}
        self.assertEqual(expected, actual)

    def test_outdated(self):
        tester = _pip_project_tester(self)
        rv = tester.create()
        self.assertEqual(0, rv.exit_code)

        rv = self.run_program(
            self._program,
            tester.make_args('install', 'chardet', '--version', '3.0.4'))
        self.assertEqual(0, rv.exit_code)
        self.assertTrue('chardet' in set(tester.outdated()))

    def test_upgrade_one_package(self):
        tester = _pip_project_tester(self)
        rv = tester.create()
        self.assertEqual(0, rv.exit_code)

        old_version = semantic_version('3.0.4')

        rv = self.run_program(
            self._program,
            tester.make_args('install', 'chardet', '--version',
                             str(old_version)))
        self.assertEqual(0, rv.exit_code)

        installed_before = tester.installed_dict()
        self.assertEqual(str(old_version), installed_before['chardet'])

        rv = self.run_program(self._program,
                              tester.make_args('upgrade', 'chardet'))
        self.assertEqual(0, rv.exit_code)

        installed_after = tester.installed_dict()
        new_version = semantic_version(installed_after['chardet'])
        self.assertTrue(new_version > old_version)

    def test_upgrade_many_packages(self):
        requirements_content = '''\
idna == 2.7
chardet == 3.0.4
certifi == 2021.5.30
'''
        tmp_requirements = self.make_temp_file(content=requirements_content)

        tester = _pip_project_tester(self)
        rv = tester.create()
        self.assertEqual(0, rv.exit_code)

        rv = self.run_program(
            self._program,
            tester.make_args('install_requirements', tmp_requirements))
        self.assertEqual(0, rv.exit_code)
        installed_before = tester.installed_dict()
        self.assertEqual('2.7', installed_before['idna'])
        self.assertEqual('3.0.4', installed_before['chardet'])
        self.assertEqual('2021.5.30', installed_before['certifi'])

        rv = self.run_program(
            self._program,
            tester.make_args('upgrade', 'idna', 'chardet', 'certifi'))
        self.assertEqual(0, rv.exit_code)
        installed_after = tester.installed_dict()
        self.assertTrue(
            semantic_version(installed_after['idna']) > semantic_version('2.7')
        )
        self.assertTrue(
            semantic_version(installed_after['chardet']) > semantic_version(
                '3.0.4'))
        self.assertTrue(
            semantic_version(installed_after['certifi']) > semantic_version(
                '2021.5.30'))

    def test_install_requirements(self):
        requirements_content = '''\
idna == 2.7
chardet == 3.0.4
certifi == 2021.5.30
'''
        tmp_requirements = self.make_temp_file(content=requirements_content)

        tester = _pip_project_tester(self)
        rv = tester.create()
        self.assertEqual(0, rv.exit_code)

        rv = self.run_program(
            self._program,
            tester.make_args('install_requirements', tmp_requirements))
        self.assertEqual(0, rv.exit_code)
        installed = tester.installed_dict()
        self.assertEqual('2.7', installed['idna'])
        self.assertEqual('3.0.4', installed['chardet'])
        self.assertEqual('2021.5.30', installed['certifi'])
コード例 #14
0
class test_dir_combine_cli_args(program_unit_test):

    _program = program_unit_test.resolve_program(__file__,
                                                 '../../../../bin/best.py')

    def test_combine_recursive(self):
        t = self._test([
            'file src/a/kiwi-30.txt      "kiwi-30.txt"    644',
            'file src/a/lemon-30.txt     "lemon-30.txt"   644',
            'file src/a/grape-30.txt     "grape-30.txt"   644',
            'file src/b/brie-30.txt      "brie-30.txt"    644',
            'file src/b/cheddar-30.txt   "cheddar-30.txt" 644',
            'file src/b/gouda-30.txt     "gouda-30.txt"   644',
            'file src/c/barolo-10.txt    "barolo-10.txt"  644',
            'file src/c/chablis-10.txt   "chablis-10.txt"  644',
            'file src/d/steak-10.txt     "steak-10.txt"  644',
        ],
                       recursive=True,
                       files=['a', 'b', 'c', 'd'],
                       flatten=True)
        expected = [
            'a',
            'a/barolo-10.txt',
            'a/brie-30.txt',
            'a/chablis-10.txt',
            'a/cheddar-30.txt',
            'a/gouda-30.txt',
            'a/grape-30.txt',
            'a/kiwi-30.txt',
            'a/lemon-30.txt',
            'a/steak-10.txt',
        ]
        self.assertEqual(0, t.result.exit_code)
        self.assert_filename_list_equal(expected, t.src_files)

    def test_combine_recursive_with_conflicts(self):
        t = self._test([
            'file src/a/kiwi-30.txt      "kiwi-30.txt"      644',
            'file src/a/lemon-30.txt     "lemon-30.txt"     644',
            'file src/a/grape-30.txt     "grape-30.txt"     644',
            'file src/b/brie-30.txt      "brie-30.txt"      644',
            'file src/b/kiwi-30.txt      "kiwi-30-dup1.txt" 644',
            'file src/b/gouda-30.txt     "gouda-30.txt"     644',
            'file src/c/barolo-10.txt    "barolo-10.txt"    644',
            'file src/c/kiwi-30.txt      "kiwi-30-dup2.txt" 644',
            'file src/d/steak-10.txt     "steak-10.txt"     644',
        ],
                       recursive=True,
                       files=['a', 'b', 'c', 'd'],
                       flatten=True)
        expected = [
            'a',
            'a/barolo-10.txt',
            'a/brie-30.txt',
            'a/gouda-30.txt',
            'a/grape-30.txt',
            'a/kiwi-30-dup-timestamp-42.txt',
            'a/kiwi-30-dup-timestamp-43.txt',
            'a/kiwi-30.txt',
            'a/lemon-30.txt',
            'a/steak-10.txt',
        ]
        self.assertEqual(0, t.result.exit_code)
        self.assert_filename_list_equal(expected, t.src_files)

    def xtest_remove_empty_recursive(self):
        t = self._test([
            'dir  src/empty1             ""              700',
            'file src/readme.md          "readme.md"     644',
            'file src/a/kiwi-30.txt      "kiwi-30.txt"   644',
            'dir  src/a/empty2           ""              700',
            'file src/b/lemon-10.txt     "lemon-10.txt"  644',
            'file src/c/cheese-10.txt    "cheese-10.txt" 644',
            'file src/icons/foo.note     "foo.note"       644',
            'file src/lemon-40.txt       "lemon-40.txt"  644',
            'dir  src/a/empty2           ""              700',
            'dir  src/foo/bar/baz/empty3 "lemon-40.txt"  700',
        ],
                       recursive=True,
                       flatten=True)
        expected = [
            'a',
            'b',
            'c',
            'icons',
        ]
        self.assertEqual(0, t.result.exit_code)
        self.assert_filename_list_equal(expected, t.src_dirs)

    def xtest_remove_empty_dry_run(self):
        t = self._test([
            'dir  src/empty1             ""              700',
            'file src/readme.md          "readme.md"     644',
            'file src/a/kiwi-30.txt      "kiwi-30.txt"   644',
            'dir  src/a/empty2           ""              700',
            'file src/b/lemon-10.txt     "lemon-10.txt"  644',
            'file src/c/cheese-10.txt    "cheese-10.txt" 644',
            'file src/icons/foo.note     "foo.note"       644',
            'file src/lemon-40.txt       "lemon-40.txt"  644',
            'dir  src/a/empty2           ""              700',
            'dir  src/foo/bar/baz/empty3 "lemon-40.txt"  700',
        ],
                       recursive=True,
                       dry_run=True,
                       flatten=True)
        expected = [
            'a',
            'a/empty2',
            'b',
            'c',
            'empty1',
            'foo',
            'foo/bar',
            'foo/bar/baz',
            'foo/bar/baz/empty3',
            'icons',
        ]
        self.assertEqual(0, t.result.exit_code)
        self.assert_filename_list_equal(expected, t.src_dirs)
        self.assert_string_equal_fuzzy(
            f'''
DRY_RUN: would remove {t.src_dir}/a/empty2
DRY_RUN: would remove {t.src_dir}/empty1
DRY_RUN: would remove {t.src_dir}/foo/bar/baz/empty3
''', t.result.output)

    def _test(self,
              items,
              files=[],
              recursive=False,
              dry_run=False,
              flatten=dir_combine_defaults.FLATTEN,
              delete_empty_dirs=dir_combine_defaults.DELETE_EMPTY_DIRS):
        with dir_operation_tester(extra_content_items=items) as test:
            if files:
                files_args = [path.join(test.src_dir, f) for f in files]
            else:
                files_args = [test.src_dir]
            args = [
                'dir_combine',
                'combine',
                '--dup-file-timestamp',
                'dup-timestamp',
                '--dup-file-count',
                '42',
            ] + files_args
            if recursive:
                args.append('--recursive')
            if dry_run:
                args.append('--dry-run')
            if flatten:
                args.append('--flatten')
            if delete_empty_dirs:
                args.append('--delete-empty-dirs')
            test.result = self.run_program(self._program, args)
        return test
コード例 #15
0
class test_dir_partition_cli_args(program_unit_test):

  _program = program_unit_test.resolve_program(__file__, '../../../../bin/best.py')

  def test_partition_with_prefix(self):
    items = [
      temp_content('file', 'src/readme.md', 'readme.md', 0o0644),
      temp_content('file', 'src/a/kiwi-10.jpg', 'kiwi-10.txt', 0o0644),
      temp_content('file', 'src/a/kiwi-20.jpg', 'kiwi-20.txt', 0o0644),
      temp_content('file', 'src/a/kiwi-30.jpg', 'kiwi-30.txt', 0o0644),
      temp_content('file', 'src/b/lemon-10.jpg', 'lemon-10.txt', 0o0644),
      temp_content('file', 'src/b/lemon-20.jpg', 'lemon-20.txt', 0o0644),
      temp_content('file', 'src/b/lemon-30.jpg', 'lemon-30.txt', 0o0644),
      temp_content('file', 'src/c/cheese-10.jpg', 'cheese-10.jpg', 0o0644),
      temp_content('file', 'src/icons/foo.png', 'foo.png', 0o0644),
    ]
    t = self._partition_test(extra_content_items = items,
                             dst_dir_same_as_src = False,
                             recursive = True,
                             partition_type = 'prefix',
                             delete_empty_dirs = True,
                             flatten = True)
    dst_after_expected = [
      'cheese',
      'cheese/cheese-10.jpg',
      'kiwi',
      'kiwi/kiwi-10.jpg',
      'kiwi/kiwi-20.jpg',
      'kiwi/kiwi-30.jpg',
      'lemon',
      'lemon/lemon-10.jpg',
      'lemon/lemon-20.jpg',
      'lemon/lemon-30.jpg',
    ]
    self.assert_filename_list_equal( dst_after_expected, t.dst_files )
    src_after_expected = [
      'icons',
      'icons/foo.png',
      'readme.md',
    ]
    self.assert_filename_list_equal( src_after_expected, t.src_files )

  def test_partition_with_prefix_dry_run(self):
    items = [
      temp_content('file', 'src/readme.md', 'readme.md', 0o0644),
      temp_content('file', 'src/a/kiwi-10.jpg', 'kiwi-10.txt', 0o0644),
      temp_content('file', 'src/a/kiwi-20.jpg', 'kiwi-20.txt', 0o0644),
      temp_content('file', 'src/a/kiwi-30.jpg', 'kiwi-30.txt', 0o0644),
      temp_content('file', 'src/b/lemon-10.jpg', 'lemon-10.txt', 0o0644),
      temp_content('file', 'src/b/lemon-20.jpg', 'lemon-20.txt', 0o0644),
      temp_content('file', 'src/b/lemon-30.jpg', 'lemon-30.txt', 0o0644),
      temp_content('file', 'src/c/cheese-10.jpg', 'cheese-10.jpg', 0o0644),
      temp_content('file', 'src/icons/foo.png', 'foo.png', 0o0644),
    ]
    t = self._partition_test(extra_content_items = items,
                             dst_dir_same_as_src = False,
                             recursive = True,
                             partition_type = 'prefix',
                             dry_run = True,
                             delete_empty_dirs = True,
                             flatten = True)
    dst_after_expected = [
    ]
    self.assert_filename_list_equal( dst_after_expected, t.dst_files )
    src_after_expected = [
      'a',
      'a/kiwi-10.jpg',
      'a/kiwi-20.jpg',
      'a/kiwi-30.jpg',
      'b',
      'b/lemon-10.jpg',
      'b/lemon-20.jpg',
      'b/lemon-30.jpg',
      'c',
      'c/cheese-10.jpg',
      'icons',
      'icons/foo.png',
      'readme.md',
    ]
    self.assert_filename_list_equal( src_after_expected, t.src_files )

    self.assert_string_equal_fuzzy(f'''\
{t.src_dir}/a/kiwi-10.jpg => {t.dst_dir}/kiwi/kiwi-10.jpg
{t.src_dir}/a/kiwi-20.jpg => {t.dst_dir}/kiwi/kiwi-20.jpg
{t.src_dir}/a/kiwi-30.jpg => {t.dst_dir}/kiwi/kiwi-30.jpg 
{t.src_dir}/b/lemon-10.jpg => {t.dst_dir}/lemon/lemon-10.jpg 
{t.src_dir}/b/lemon-20.jpg => {t.dst_dir}/lemon/lemon-20.jpg 
{t.src_dir}/b/lemon-30.jpg => {t.dst_dir}/lemon/lemon-30.jpg 
{t.src_dir}/c/cheese-10.jpg => {t.dst_dir}/cheese/cheese-10.jpg
''', t.result.output )
    
  def _partition_test(self,
                      extra_content_items = None,
                      dst_dir_same_as_src = False,
                      recursive = False,
                      partition_type = dir_partition_defaults.PARTITION_TYPE,
                      dry_run = False,
                      delete_empty_dirs = dir_partition_defaults.DELETE_EMPTY_DIRS,
                      threshold = dir_partition_defaults.THRESHOLD,
                      flatten = dir_partition_defaults.FLATTEN):
    with dir_operation_tester(extra_content_items = extra_content_items,
                              dst_dir_same_as_src = dst_dir_same_as_src) as test:
      args = [
        'dir_partition',
        'partition',
        '--type', partition_type,
        '--dst-dir', test.dst_dir,
        test.src_dir,
      ]
      if recursive:
        args.append('--recursive')
      if dry_run:
        args.append('--dry-run')
      if delete_empty_dirs:
        args.append('--delete-empty-dirs')
      if threshold:
        args.extend([ '--threshold', str(threshold) ])
      if flatten:
        args.append('--flatten')
      test.result = self.run_program(self._program, args)
    return test
コード例 #16
0
class test_archive_cli_args(program_unit_test):

  _program = program_unit_test.resolve_program(__file__, '..', '..', '..', '..', 'bin', 'best.py')

  @git_temp_home_func()
  def test_create_git_zip(self):
    content = [ 
      'file a/b/c/foo.txt "foo content" 755',
      'file d/e/bar.txt "bar content" 644',
      'dir  baz     ""            700',
    ]
    r = git_temp_repo(content = content, prefix = 'test_archive_', debug = self.DEBUG)
    commit = r.last_commit_hash(short_hash = True)
    
    tmp_archive = self.make_temp_file(suffix = '.zip')

    prefix = 'foo-{}'.format(commit)
    
    args = [
      'archive',
      'create_git',
      '--root-dir', r.root,
      '--format', 'zip',
      prefix,
      commit,
      tmp_archive,
    ]
    rv = self.run_program(self._program, args)
    self.assertEqual( 0, rv.exit_code )
    self.assertEqual( 'zip', archiver.format_name(tmp_archive) )
    expected = [
      '{}/a/b/c/foo.txt'.format(prefix),
      '{}/d/e/bar.txt'.format(prefix),
    ]
    actual = archiver.members(tmp_archive)
    self.assert_filename_list_equal( expected, actual )
    
  @git_temp_home_func()
  def test_create_git_tgz(self):
    content = [ 
      'file a/b/c/foo.txt "foo content" 755',
      'file d/e/bar.txt "bar content" 644',
      'dir  baz     ""            700',
    ]
    r = git_temp_repo(content = content, prefix = 'test_archive_', debug = self.DEBUG)
    commit = r.last_commit_hash(short_hash = True)
    
    tmp_archive = self.make_temp_file(suffix = '.tgz')

    prefix = 'foo-{}'.format(commit)
    
    args = [
      'archive',
      'create_git',
      '--root-dir', r.root,
      '--format', 'tgz',
      prefix,
      commit,
      tmp_archive,
    ]
    rv = self.run_program(self._program, args)
    self.assertEqual( 0, rv.exit_code )
    self.assertEqual( 'tgz', archiver.format_name(tmp_archive) )
    expected = [
      '{}/a/b/c/foo.txt'.format(prefix),
      '{}/d/e/bar.txt'.format(prefix),
    ]
    actual = archiver.members(tmp_archive)
    self.assert_filename_list_equal( expected, actual )