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 +4 -4
- data/.travis.yml +1 -1
- data/README.md +11 -1
- data/bin/dup-filename +17 -24
- data/lib/duplicated_filename_checker.rb +1 -0
- data/lib/duplicated_filename_checker/check.rb +38 -11
- data/lib/duplicated_filename_checker/file_profile.rb +1 -1
- data/lib/duplicated_filename_checker/formatter.rb +58 -0
- data/lib/duplicated_filename_checker/version.rb +1 -1
- data/test/sample_for_test/dir_a1/{duplicate_filename.sample → duplicate_filename_1.sample} +0 -0
- data/test/sample_for_test/dir_a1/duplicate_filename_2.png +0 -0
- data/test/sample_for_test/dir_b1/dir_b2/{duplicate_filename.sample → duplicate_filename_1.sample} +0 -0
- data/test/sample_for_test/dir_b1/dir_b2/duplicate_filename_2.png +0 -0
- data/test/test_check.rb +58 -17
- data/test/test_file_profile.rb +1 -1
- data/test/test_formatter.rb +54 -0
- metadata +13 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f0bee9d09d0dc3b70e60cfc8e6b383f08e6070b8
|
4
|
+
data.tar.gz: f2dfc12500b29bfd22c9752dbf1dab479123be30
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6cc1ee617589e8e23bce4a5c4f9e2f6b9110b302658cc60fa3acf28b8d7187469fdac4739e6254d6f70c7d2ace7082eb1c23598d35d5629f8fc97382cef4ebea
|
7
|
+
data.tar.gz: da5031d498c68fd85b3da4c06da79b2d65c769815462e3c9f19146e4d776847c679e173057ca3f26718309462e7d3d4f00918274c6fab1c1ed4924ab171288ca
|
data/.travis.yml
CHANGED
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
|
+
```
|
data/bin/dup-filename
CHANGED
@@ -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
|
-
#
|
6
|
-
|
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
|
-
|
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
|
-
#
|
19
|
-
|
20
|
-
|
21
|
-
|
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
|
-
|
27
|
-
|
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
|
-
|
21
|
+
# show
|
22
|
+
if only_basename
|
23
|
+
puts result.only_basename
|
24
|
+
else
|
25
|
+
puts result.markdown
|
34
26
|
end
|
27
|
+
|
@@ -1,6 +1,9 @@
|
|
1
1
|
class DuplicatedFilenameChecker::Check
|
2
|
-
def initialize(*
|
3
|
-
|
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
|
15
|
+
# select duplicate paths from check target paths
|
13
16
|
def duplicate_paths
|
14
|
-
@
|
15
|
-
is_duplicate?(
|
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
|
-
|
23
|
+
basename_with_count[basename] > 1
|
21
24
|
end
|
22
25
|
|
23
|
-
#
|
24
|
-
# @example
|
25
|
-
def
|
26
|
-
|
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
|
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
|
@@ -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
|
File without changes
|
File without changes
|
data/test/sample_for_test/dir_b1/dir_b2/{duplicate_filename.sample → duplicate_filename_1.sample}
RENAMED
File without changes
|
File without changes
|
data/test/test_check.rb
CHANGED
@@ -1,28 +1,69 @@
|
|
1
1
|
require 'minitest_helper'
|
2
2
|
|
3
|
-
|
4
|
-
|
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
|
-
|
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
|
-
|
13
|
-
|
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
|
-
|
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
|
-
|
18
|
-
|
19
|
-
|
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
|
-
|
22
|
-
|
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
|
-
|
25
|
-
|
26
|
-
|
64
|
+
it 'result is empty hash' do
|
65
|
+
assert @check_result == {}
|
66
|
+
end
|
67
|
+
end
|
27
68
|
end
|
28
69
|
end
|
data/test/test_file_profile.rb
CHANGED
@@ -2,7 +2,7 @@ require 'minitest_helper'
|
|
2
2
|
|
3
3
|
class TestFileProfile < MiniTest::Unit::TestCase
|
4
4
|
def setup
|
5
|
-
@sample_filename = '
|
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.
|
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-
|
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/
|
79
|
-
- test/sample_for_test/
|
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/
|
109
|
-
- test/sample_for_test/
|
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
|