duplicated_filename_checker 0.1.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7ab8cff2f3e31f6071bd3a14773ba6ccc80b1de2
4
- data.tar.gz: 329cc390c657a46b4d4a4795d1749c62e871f678
3
+ metadata.gz: f0bee9d09d0dc3b70e60cfc8e6b383f08e6070b8
4
+ data.tar.gz: f2dfc12500b29bfd22c9752dbf1dab479123be30
5
5
  SHA512:
6
- metadata.gz: 3acbcc235243c4ba747a88323691fea36ddfcf308d99e175db7f11a36d1760208fa5d3abac0d6e11932d16934514d5f57c8c531fdc7a35a8ae54a903cd49ee46
7
- data.tar.gz: 6d23f23982c269cbd602994489c38c0890fa5de9e1687991123c5bfb3d8d9a4160a478914831e751aedfb1264b835acacc95cf85a1291133a0345f7fb99230b5
6
+ metadata.gz: 6cc1ee617589e8e23bce4a5c4f9e2f6b9110b302658cc60fa3acf28b8d7187469fdac4739e6254d6f70c7d2ace7082eb1c23598d35d5629f8fc97382cef4ebea
7
+ data.tar.gz: da5031d498c68fd85b3da4c06da79b2d65c769815462e3c9f19146e4d776847c679e173057ca3f26718309462e7d3d4f00918274c6fab1c1ed4924ab171288ca
@@ -1,5 +1,5 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 2.1.0
3
+ - 2.1.2
4
4
  - 2.2.0
5
5
  script: rake test
data/README.md CHANGED
@@ -15,6 +15,8 @@ install:
15
15
  $ gem install duplicated_filename_checker
16
16
 
17
17
  ## Usage
18
+ ### survey duplicate filename
19
+
18
20
  ```
19
21
  $ dup-filename ./survey_dir1_root ./survey_dir2_root
20
22
 
@@ -38,6 +40,14 @@ $ dup-filename ./survey_dir1_root ./survey_dir2_root
38
40
 
39
41
  ```
40
42
 
43
+ ### only filename option: `-l`
44
+ ```
45
+ $ dup-filename -l ./survey_dir1_root ./survey_dir2_root
46
+ dupfilename1.png
47
+ dupfilename2.png
48
+
49
+ ```
50
+
41
51
  ## Usage `duplicated_filename_checker` as library
42
52
 
43
53
  You can use `duplicated_filename_checker` in ruby program.
@@ -87,4 +97,4 @@ p duplicate_file_profiles[0].path
87
97
 
88
98
  p duplicate_file_profiles[1].path
89
99
  #=> /Users/shinya131/survey_dir2_root/subdirectory/dupfilename1.png
90
- ```
100
+ ```
@@ -1,34 +1,27 @@
1
1
  #!/usr/bin/env ruby
2
+ $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
2
3
  require 'duplicated_filename_checker'
3
4
  require 'optparse'
4
5
 
5
- # check argument
6
- unless ARGV.size > 0
7
- raise ArgumentError.new('Specify the argument. Argument is survey target root paths.')
8
- end
6
+ # read args
7
+ options = ARGV.getopts("li:")
9
8
 
10
- # survey
9
+ exclude_basename = options["i"]
10
+ only_basename = options["l"]
11
11
  servey_root_paths = ARGV
12
- duplicated_file_profiles = DuplicatedFilenameChecker::Check.new(*servey_root_paths).execute
13
-
14
- # options
15
- options = ARGV.getopts("i:")
16
- ignore_keyword = options["i"]
17
12
 
18
- # formatting
19
- duplicated_file_profiles.each do |basename, file_profiles|
20
- if ignore_keyword
21
- next if basename =~ Regexp.new(ignore_keyword)
22
- end
23
-
24
- puts "## #{basename}"
13
+ # survey
14
+ include DuplicatedFilenameChecker
15
+ duplicated_file_profiles = Check.new(*servey_root_paths).execute
16
+ result = Formatter.new(duplicated_file_profiles)
25
17
 
26
- file_profiles.each.with_index(1) do |file_profile, index|
27
- puts "#{index}. #{file_profile.path}"
28
- puts " * md5: #{file_profile.md5_digest}"
29
- puts " * mtime: #{file_profile.stat.mtime}"
30
- puts "\n"
31
- end
18
+ # filter
19
+ result.exclude_basename(exclude_basename)
32
20
 
33
- puts "\n"
21
+ # show
22
+ if only_basename
23
+ puts result.only_basename
24
+ else
25
+ puts result.markdown
34
26
  end
27
+
@@ -3,4 +3,5 @@ require "duplicated_filename_checker/version"
3
3
  module DuplicatedFilenameChecker
4
4
  require 'duplicated_filename_checker/file_profile'
5
5
  require 'duplicated_filename_checker/check'
6
+ require 'duplicated_filename_checker/formatter'
6
7
  end
@@ -1,6 +1,9 @@
1
1
  class DuplicatedFilenameChecker::Check
2
- def initialize(*survey_direcotry_roots)
3
- @survey_target_paths = survey_target_paths_by(survey_direcotry_roots)
2
+ def initialize(*check_direcotry_roots)
3
+ argument_size_validation!(check_direcotry_roots)
4
+ check_directory_exists_validation!(check_direcotry_roots)
5
+
6
+ @check_target_paths = check_target_paths_by(check_direcotry_roots)
4
7
  end
5
8
 
6
9
  def execute
@@ -9,28 +12,52 @@ class DuplicatedFilenameChecker::Check
9
12
 
10
13
  private
11
14
 
12
- # select duplicate paths from survey target paths
15
+ # select duplicate paths from check target paths
13
16
  def duplicate_paths
14
- @survey_target_paths.select do |path|
15
- is_duplicate?(path.basename)
17
+ @check_target_paths.select do |file|
18
+ is_duplicate?(file.basename)
16
19
  end
17
20
  end
18
21
 
19
22
  def is_duplicate?(basename)
20
- survey_paths_basename_list.count(basename) > 1
23
+ basename_with_count[basename] > 1
21
24
  end
22
25
 
23
- # Baseames of survey_paths. It list is not uniq.
24
- # @example ['basename1', 'basename1', 'basename2', 'basename3']
25
- def survey_paths_basename_list
26
- @basename_list ||= @survey_target_paths.map(&:basename) #memorize
26
+ # @return [Hash] basename with same basename count.
27
+ # @example { "basename_a.png" => 1, "basename_b.png" => 3, "basename_c.png" => 1 }
28
+ def basename_with_count
29
+ unless @basename_count.nil? # memorize
30
+ return @basename_count
31
+ end
32
+
33
+ @basename_count = Hash.new(0)
34
+
35
+ @check_target_paths.each do |file|
36
+ @basename_count[file.basename] += 1
37
+ end
38
+
39
+ @basename_count
27
40
  end
28
41
 
29
- def survey_target_paths_by(root_paths)
42
+ def check_target_paths_by(root_paths)
30
43
  # get paths in subdirectory
31
44
  paths = root_paths.map{|root| Dir.glob("#{root}/**/*.*") }.flatten
32
45
 
33
46
  # exchange to FileProfile
34
47
  paths.map{|path| DuplicatedFilenameChecker::FileProfile.new(path) }
35
48
  end
49
+
50
+ def argument_size_validation!(check_direcotry_roots)
51
+ unless check_direcotry_roots.size > 0
52
+ raise ArgumentError.new('Specify the argument. Argument is survey target root paths.')
53
+ end
54
+ end
55
+
56
+ def check_directory_exists_validation!(check_direcotry_roots)
57
+ check_direcotry_roots.each do |dir|
58
+ unless File.exists?(dir)
59
+ raise ArgumentError.new("No such directory: #{dir}")
60
+ end
61
+ end
62
+ end
36
63
  end
@@ -18,6 +18,6 @@ class DuplicatedFilenameChecker::FileProfile
18
18
  end
19
19
 
20
20
  def stat
21
- File.stat path
21
+ File.stat @file_path
22
22
  end
23
23
  end
@@ -0,0 +1,58 @@
1
+ class DuplicatedFilenameChecker::Formatter
2
+ def initialize(result_of_duplicate_filename_checker_check_execute)
3
+ @duplicate_file_profiles = result_of_duplicate_filename_checker_check_execute
4
+ end
5
+
6
+ def exclude_basename(exclude_basename_regexp)
7
+ @exclude_basename_regexp = exclude_basename_regexp
8
+ end
9
+
10
+ def hash
11
+ duplicate_file_profiles_with_filter
12
+ end
13
+
14
+ def only_basename
15
+ duplicate_file_profiles_with_filter.keys
16
+ end
17
+
18
+ # @example
19
+ # ### duplicate_filename.sample
20
+ # 1. /Users/nagai_shinya/gem/duplicated_filename_checker/test/sample_for_test/dir_a1/duplicate_filename.sample
21
+ # * md5: 5258bf47639b8f906c1a17aee86c54dd
22
+ # * mtime: 2015-03-07 13:44:05 +0900
23
+ #
24
+ # 2. /Users/nagai_shinya/gem/duplicated_filename_checker/test/sample_for_test/dir_b1/dir_b2/duplicate_filename.sample
25
+ # * md5: 5258bf47639b8f906c1a17aee86c54dd
26
+ # * mtime: 2015-03-07 13:44:05 +0900
27
+ def markdown
28
+ duplicate_file_profiles_with_filter.map do |basename, duplicate_file_profiles|
29
+ [
30
+ "## #{basename}\n",
31
+ "#{file_profile_to_markdown(duplicate_file_profiles)}",
32
+ ]
33
+ end.flatten.join
34
+ end
35
+
36
+ private
37
+
38
+ def duplicate_file_profiles_with_filter
39
+ unless @exclude_basename_regexp
40
+ return @duplicate_file_profiles
41
+ end
42
+
43
+ @duplicate_file_profiles.select do |basename, _|
44
+ !(basename =~ Regexp.new(@exclude_basename_regexp))
45
+ end
46
+ end
47
+
48
+ def file_profile_to_markdown(duplicate_file_profiles)
49
+ duplicate_file_profiles.map.with_index(1) do |file_profile, index|
50
+ [
51
+ "#{index}. #{file_profile.path}\n",
52
+ " * md5: #{file_profile.md5_digest}\n",
53
+ " * mtime: #{file_profile.stat.mtime}\n",
54
+ "\n"
55
+ ]
56
+ end.join
57
+ end
58
+ end
@@ -1,3 +1,3 @@
1
1
  module DuplicatedFilenameChecker
2
- VERSION = "0.1.0"
2
+ VERSION = "0.3.0"
3
3
  end
@@ -1,28 +1,69 @@
1
1
  require 'minitest_helper'
2
2
 
3
- class TestCheck < MiniTest::Unit::TestCase
4
- def setup
5
- survey_dir_path_1 = './test/sample_for_test/dir_a1'
6
- survey_dir_path_2 = './test/sample_for_test/dir_b1'
7
- @sample_filename = 'duplicate_filename.sample'
3
+ describe DuplicatedFilenameChecker::Check do
4
+ describe '#initialize' do
8
5
 
9
- @check = DuplicatedFilenameChecker::Check.new(survey_dir_path_1, survey_dir_path_2)
6
+ describe 'arguments no given.' do
7
+ it 'raise' do
8
+ assert_raises(ArgumentError){ DuplicatedFilenameChecker::Check.new }
9
+ end
10
+ end
11
+
12
+ describe 'survey target directory is no exists.' do
13
+ it 'raise' do
14
+ assert_raises(ArgumentError){ DuplicatedFilenameChecker::Check.new('/not_exists_dir') }
15
+ end
16
+ end
10
17
  end
11
18
 
12
- def test_execute
13
- duplicate_file_paths = @check.execute
19
+ describe '#execute' do
20
+ describe 'survey target has duplicate basename files' do
21
+ before do
22
+ survey_dir_path_1 = './test/sample_for_test/dir_a1'
23
+ survey_dir_path_2 = './test/sample_for_test/dir_b1'
24
+ @sample_filenames = ['duplicate_filename_1.sample', 'duplicate_filename_2.png']
25
+
26
+ @check = DuplicatedFilenameChecker::Check.new(survey_dir_path_1, survey_dir_path_2)
27
+ @check_result = @check.execute
28
+ end
29
+
30
+ it 'key is duplicate filename' do
31
+ assert @check_result.keys.any?{|basename| @sample_filenames.include? basename }
32
+ end
33
+
34
+ describe 'value is duplicate file profiles' do
35
+ before do
36
+ @profiles = @check_result.values
37
+ end
38
+
39
+ it 'prfiles is DuplicatedFilenameChecker::FileProfile' do
40
+ @profiles.flatten.each do |path|
41
+ assert path.class == DuplicatedFilenameChecker::FileProfile
42
+ end
43
+ end
14
44
 
15
- assert(duplicate_file_paths.class == Hash)
45
+ it 'proflies.first all basename is same' do
46
+ @profiles.flatten.each do |path|
47
+ assert @sample_filenames.include? path.basename
48
+ end
49
+ end
16
50
 
17
- # key is duplicate filename
18
- basename = duplicate_file_paths.keys.first
19
- assert(basename == @sample_filename)
51
+ it 'proflies.first path is different' do
52
+ paths = @profiles.flatten.map(&:path)
53
+ assert paths == paths.uniq
54
+ end
55
+ end
56
+ end
20
57
 
21
- # value is duplicate file paths
22
- filepaths = duplicate_file_paths.values.first
58
+ describe 'survey target has not duplicate basename file' do
59
+ before do
60
+ @check = DuplicatedFilenameChecker::Check.new('./test/sample_for_test/dir_a1')
61
+ @check_result = @check.execute
62
+ end
23
63
 
24
- assert filepaths.all?{ |path| path.class == DuplicatedFilenameChecker::FileProfile }
25
- assert filepaths.all?{ |path| path.basename == @sample_filename } # all basename is same
26
- assert filepaths.map(&:path) == filepaths.map(&:path).uniq # all path is different
64
+ it 'result is empty hash' do
65
+ assert @check_result == {}
66
+ end
67
+ end
27
68
  end
28
69
  end
@@ -2,7 +2,7 @@ require 'minitest_helper'
2
2
 
3
3
  class TestFileProfile < MiniTest::Unit::TestCase
4
4
  def setup
5
- @sample_filename = 'duplicate_filename.sample'
5
+ @sample_filename = 'duplicate_filename_1.sample'
6
6
  @sample_relative_path = File.join('./test/sample_for_test/dir_a1/', @sample_filename)
7
7
  @sample_fullpath = File.join(test_fullpath, 'sample_for_test/dir_a1/', @sample_filename)
8
8
  @sample_md5_digest = '5258bf47639b8f906c1a17aee86c54dd'
@@ -0,0 +1,54 @@
1
+ require 'minitest_helper'
2
+
3
+ describe DuplicatedFilenameChecker::Formatter do
4
+ before do
5
+ survey_dir_path_1 = './test/sample_for_test/dir_a1'
6
+ survey_dir_path_2 = './test/sample_for_test/dir_b1'
7
+ @sample_filename = 'duplicate_filename_1.sample'
8
+
9
+ @check_result = DuplicatedFilenameChecker::Check.new(survey_dir_path_1, survey_dir_path_2).execute
10
+ @formatter = DuplicatedFilenameChecker::Formatter.new(@check_result)
11
+ end
12
+
13
+ describe '#hash' do
14
+ it 'like plain result' do
15
+ assert @formatter.hash == @check_result
16
+ end
17
+ end
18
+
19
+ describe '#only_basename' do
20
+ it 'show only basenames' do
21
+ assert @formatter.only_basename.sort == ['duplicate_filename_1.sample', 'duplicate_filename_2.png'].sort
22
+ end
23
+ end
24
+
25
+ describe '#markdown' do
26
+ it 'first line has ##' do
27
+ first_line = @formatter.markdown.split("\n")[0]
28
+ assert first_line =~ /##/
29
+ end
30
+
31
+ it 'first line has basname' do
32
+ first_line = @formatter.markdown.split("\n")[0]
33
+ puts @formatter.markdown
34
+ assert first_line =~ /#{@sample_filename}/
35
+ end
36
+
37
+ it 'second line has path' do
38
+ second_line = @formatter.markdown.split("\n")[1]
39
+ duplicate_file_list = @check_result.values.first
40
+ assert duplicate_file_list.any?{|file| second_line =~ /#{file.path}/ }
41
+ end
42
+ end
43
+
44
+ describe '#exclude_basename' do
45
+ before do
46
+ @formatter.exclude_basename('.sample')
47
+ end
48
+
49
+ it 'ignored specified basename' do
50
+ assert @formatter.only_basename == ['duplicate_filename_2.png']
51
+ assert @formatter.hash.keys == ['duplicate_filename_2.png']
52
+ end
53
+ end
54
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: duplicated_filename_checker
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Shinya131
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-03-06 00:00:00.000000000 Z
11
+ date: 2015-03-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -73,12 +73,16 @@ files:
73
73
  - lib/duplicated_filename_checker.rb
74
74
  - lib/duplicated_filename_checker/check.rb
75
75
  - lib/duplicated_filename_checker/file_profile.rb
76
+ - lib/duplicated_filename_checker/formatter.rb
76
77
  - lib/duplicated_filename_checker/version.rb
77
78
  - test/minitest_helper.rb
78
- - test/sample_for_test/dir_a1/duplicate_filename.sample
79
- - test/sample_for_test/dir_b1/dir_b2/duplicate_filename.sample
79
+ - test/sample_for_test/dir_a1/duplicate_filename_1.sample
80
+ - test/sample_for_test/dir_a1/duplicate_filename_2.png
81
+ - test/sample_for_test/dir_b1/dir_b2/duplicate_filename_1.sample
82
+ - test/sample_for_test/dir_b1/dir_b2/duplicate_filename_2.png
80
83
  - test/test_check.rb
81
84
  - test/test_file_profile.rb
85
+ - test/test_formatter.rb
82
86
  homepage: https://github.com/Shinya131/duplicated_filename_checker
83
87
  licenses:
84
88
  - MIT
@@ -105,7 +109,10 @@ specification_version: 4
105
109
  summary: This gem is check duplicated filename in multiple directory.
106
110
  test_files:
107
111
  - test/minitest_helper.rb
108
- - test/sample_for_test/dir_a1/duplicate_filename.sample
109
- - test/sample_for_test/dir_b1/dir_b2/duplicate_filename.sample
112
+ - test/sample_for_test/dir_a1/duplicate_filename_1.sample
113
+ - test/sample_for_test/dir_a1/duplicate_filename_2.png
114
+ - test/sample_for_test/dir_b1/dir_b2/duplicate_filename_1.sample
115
+ - test/sample_for_test/dir_b1/dir_b2/duplicate_filename_2.png
110
116
  - test/test_check.rb
111
117
  - test/test_file_profile.rb
118
+ - test/test_formatter.rb