zip_content_comparator 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,10 @@
1
+ # -*- ruby -*-
2
+ # configuration file for autotest from ZenTest
3
+
4
+ #require 'test_notifier/runner/autotest' # gem install test_notifier
5
+ begin
6
+ require 'test_notifier/autotest' # gem install test_notifier -v 0.1.4
7
+ rescue LoadError
8
+ puts "Test Notifier (or a dependency) not available. Install it with: gem install test_notifier -v 0.1.4"
9
+ end
10
+ # Autotest::TestNotifier.preferred_notification_system = 'osd_cat'
@@ -0,0 +1 @@
1
+ nbproject/private
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2009 Szymon Jeż
2
+
3
+ MIT license
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,30 @@
1
+ = Zip File Content Comparator
2
+ An utility for comparing content of ZIP files.
3
+ It does not extract the files anywhere, its's using instead ZIP::ZipFile class
4
+ from rubyzip gem which enables to access ZIP files like a file system.
5
+ It uses MD5 to compare files.
6
+
7
+ == Use Case
8
+ It was written to compare JAR files to determine if it is necessary to
9
+ deploy (upload) them to a Java Webstart directory. Specific files, which changed
10
+ every build, contained in JAR files where ignored, which allowed to spot JAR files
11
+ which are the same for the end user and chose not to deploy them. This saved the
12
+ end user some downloading and reduced the server load.
13
+
14
+ For more info see documentation for #compare and #identical? methods.
15
+
16
+ == Example:
17
+ # using the #compare method:
18
+ identical_files, different_files = ZipContentComparator.compare('old_build/myapp.jar','new_build/myapp.jar')
19
+ list_of_changed_class_files = different_files.detect{ |file| file =~ /.class$/ } || []
20
+ # using the #identical? method:
21
+ ZipContentComparator.identical?('old_build/myapp.jar','new_build/myapp.jar', :detect_pattern => /.class$/)
22
+
23
+ See the source code if you want to use other methods of this class.
24
+
25
+ Author:: Szymon (jeznet) Jeż <szymon[at]jez[dot]net[dot]pl>
26
+
27
+ == Hints
28
+ - To generate the documentation for this project use: rake rdoc
29
+ - All test files which have real test should be included in the test_suite.rb file
30
+ - The test_suite.rb is the default Test suite and is tested in `rake test` command
@@ -0,0 +1,73 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+ require 'rake/clean'
4
+
5
+ begin
6
+ require 'jeweler'
7
+ Jeweler::Tasks.new do |gem|
8
+ gem.name = "zip_content_comparator"
9
+ gem.summary = %Q{An utility for comparing content of ZIP files.}
10
+ gem.description = <<-TEXT
11
+ An utility for comparing content of ZIP files.
12
+ It does not extract the files anywhere, its's using instead ZIP::ZipFile class
13
+ from rubyzip gem which enables to access ZIP files like a file system.
14
+ It uses MD5 to compare files.
15
+ TEXT
16
+ gem.email = "szymon@jez.net.pl"
17
+ gem.homepage = "http://github.com/jeznet/zip_content_comparator"
18
+ gem.authors = ["Szymon (jeznet) Jeż"]
19
+ gem.add_dependency('rubyzip', '>= 0.9.1')
20
+ # gem.requirements << ''
21
+ # gem.add_development_dependency "thoughtbot-shoulda"
22
+ # gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for additional settings
23
+ end
24
+ rescue LoadError
25
+ puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler"
26
+ end
27
+
28
+ require 'rake/testtask'
29
+ Rake::TestTask.new(:test) do |test|
30
+ test.libs << 'lib' << 'test'
31
+ # test.pattern = 'test/**/*_test.rb'
32
+ test.test_files = FileList['test/**/*suite.rb']
33
+ test.verbose = true
34
+ # require 'test_notifier/test_unit'
35
+ end
36
+
37
+ begin
38
+ require 'rcov/rcovtask'
39
+ Rcov::RcovTask.new do |test|
40
+ test.libs << 'test'
41
+ test.pattern = 'test/**/*_test.rb'
42
+ test.verbose = true
43
+ end
44
+ rescue LoadError
45
+ task :rcov do
46
+ abort "RCov is not available. In order to run rcov, you must: sudo gem install spicycode-rcov"
47
+ end
48
+ end
49
+
50
+ task :test => :check_dependencies
51
+
52
+ task :default => :test
53
+
54
+ require 'rake/rdoctask'
55
+ Rake::RDocTask.new do |rdoc|
56
+ if File.exist?('VERSION')
57
+ version = File.read('VERSION')
58
+ else
59
+ version = ""
60
+ end
61
+
62
+ rdoc.rdoc_dir = 'rdoc'
63
+ files =['README.rdoc', 'LICENSE', 'lib/**/*.rb']
64
+ rdoc.rdoc_files.add(files)
65
+ rdoc.main = "README" # page to start on
66
+ rdoc.title = "Zip File Content Comparator #{version}"
67
+ rdoc.rdoc_dir = 'doc/rdoc' # rdoc output folder
68
+ rdoc.options << '--line-numbers'
69
+ rdoc.options << '--charset=utf-8'
70
+ end
71
+
72
+ # load tasks
73
+ Dir['tasks/**/*.rake'].each { |rake| load rake }
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.1.0
@@ -0,0 +1,137 @@
1
+ #!/usr/bin/env -w ruby
2
+ begin
3
+ require 'rubygems'
4
+ require 'zip/zipfilesystem' # from gem: rubyzip
5
+ require 'md5'
6
+ rescue LoadError => e
7
+ $stderr.puts <<-STR
8
+ Problem loading gems. Please check if you have:
9
+ * rubygems (gem),
10
+ * rubyzip (gem),
11
+ * md5 (library),
12
+ in your load paths installed.
13
+ STR
14
+ $stderr.puts e
15
+ exit!
16
+ end
17
+
18
+ # == Zip File Content Comparator
19
+ # An utility for comparing content of ZIP files.
20
+ #
21
+ # It does not extract the files anywhere, its's using instead ZIP::ZipFile class
22
+ # from RubyGem: rubyzip which enables to access ZIP files like a file system.
23
+ # It uses MD5 to compare files.
24
+ # For more info see documentation for #compare and #identical? methods.
25
+ #
26
+ # === Example:
27
+ # # using the #compare method:
28
+ # identical_files, different_files = ZipContentComparator.compare('old_build/myapp.jar','new_build/myapp.jar')
29
+ # list_of_changed_class_files = different_files.detect{ |file| file =~ /.class$/ } || []
30
+ # # using the #identical? method:
31
+ # ZipContentComparator.identical?('old_build/myapp.jar','new_build/myapp.jar', :detect_pattern => /.class$/)
32
+ #
33
+ # See the source code if you want to use other methods of this class.
34
+ #
35
+ # Author:: Szymon (jeznet) Jeż <szymon@jez.net.pl>
36
+ class ZipContentComparator
37
+ def self.read_in_files(path_to_zipfile1, path_to_zipfile2)
38
+ zip_file1 = Zip::ZipFile.open(path_to_zipfile1) #{
39
+ zip_file2 = Zip::ZipFile.open(path_to_zipfile2)
40
+ return zip_file1, zip_file2
41
+ end
42
+
43
+ # recurrently builds and returns a list of all files and directories in a given path of the given ZIP file
44
+ def self.get_files_and_dirs_list(zip_file, path)
45
+ dirs = []
46
+ files = []
47
+ zip_file.dir.foreach(path) do |file_system_node|
48
+ path_to_node = (path == '.' ? file_system_node : File.join(path, file_system_node))
49
+ if zip_file.file.file?(path_to_node)
50
+ files << path_to_node
51
+ elsif zip_file.file.directory?(path_to_node)
52
+ dirs << path_to_node
53
+ end
54
+ end
55
+ unless dirs.empty?
56
+ dirs.each do |dir|
57
+ d,f = get_files_and_dirs_list(zip_file, dir) # Why is there no multi assign += operator? :'(
58
+ dirs += d
59
+ files += f
60
+ end
61
+ end
62
+ return dirs.sort, files.sort
63
+ end
64
+
65
+ # compare files in ZIP files using MD5
66
+ def self.compare_files(zip_file1, file_list1, zip_file2, file_list2)
67
+ different_files = []
68
+ identical_files = []
69
+ file_list1.each do |file1|
70
+ if zip_file2.file.exists?(file1)
71
+ hash1 = MD5.md5(zip_file1.file.read(file1))
72
+ hash2 = MD5.md5(zip_file2.file.read(file1))
73
+ if hash1 != hash2
74
+ #add files with different hashes
75
+ different_files << file1
76
+ else
77
+ identical_files << file1
78
+ end
79
+ else
80
+ # add files not existing in zip_file2
81
+ different_files << file1
82
+ end
83
+ end
84
+ file_list2.each do |file2|
85
+ # add files not existing in zip_file1 (new in zip_file2)
86
+ unless zip_file1.file.exists?(file2)
87
+ different_files << file2
88
+ end
89
+ end
90
+ return identical_files, different_files
91
+ end
92
+
93
+ # Compares two ZIP files. Takes two paths to ZIP files. Compares them and
94
+ # returns a list of files (exactly paths + file names) which are identical in both
95
+ # of them and a list of files which are different (changed, added, deleted).
96
+ def self.compare(path_to_zipfile1, path_to_zipfile2)
97
+ zipfile1, zipfile2 = read_in_files(path_to_zipfile1, path_to_zipfile2)
98
+ directory_list1, file_list1 = get_files_and_dirs_list(zipfile1, '.')
99
+ directory_list2, file_list2 = get_files_and_dirs_list(zipfile2, '.')
100
+ identical_files, different_files = compare_files(zipfile1, file_list1, zipfile2, file_list2)
101
+ return identical_files, different_files
102
+ end
103
+
104
+ # Checks if the content of two given ZIP files is identical.
105
+ # It compares the files contained in them. Regular Expression patterns can be used to
106
+ # select which files will be compared to determine if the ZIP files are identical.
107
+ #
108
+ # optional arguments are:
109
+ # Regexp :detect_pattern - used to select those files which will be used to determine if
110
+ # the ZIP files are identical. Default is /.*/
111
+ # Regexp :ignore_patter - used to ignore files which will be used to determine if
112
+ # the ZIP files are identical
113
+ def self.identical?(path_to_zipfile1, path_to_zipfile2, options = {})
114
+ options = {:detect_pattern => /.*/, :ignore_patter => nil}.merge(options)
115
+ identical_files, different_files = self.compare(path_to_zipfile1, path_to_zipfile2)
116
+ if options[:detect_pattern].is_a?(Regexp)
117
+ different_files = different_files.detect{ |file| file =~ options[:detect_pattern] } || []
118
+ end
119
+ if options[:ignore_patter].is_a?(Regexp)
120
+ different_files = different_files.delete_if{ |file| file =~ options[:ignore_patter] } || []
121
+ end
122
+ return different_files.empty?
123
+ end
124
+ end
125
+
126
+ # when ran as a script
127
+ if $0 == __FILE__
128
+ if ARGV[0] and ARGV[1]
129
+ identical_files, different_files = ZipContentComparator.compare(ARGV[0].strip.to_s, ARGV[1].strip.to_s)
130
+ puts "Identical files:"
131
+ puts identical_files.inspect
132
+ puts "Different files:"
133
+ puts different_files.inspect
134
+ else
135
+ puts 'Error. Please provide arguments 1 and 2 (paths to files to compare)'
136
+ end
137
+ end
@@ -0,0 +1,10 @@
1
+ auxiliary.org-netbeans-modules-editor-indent.CodeStyle.project.tab-size=8
2
+ auxiliary.org-netbeans-modules-editor-indent.CodeStyle.project.text-limit-width=80
3
+ auxiliary.org-netbeans-modules-editor-indent.CodeStyle.usedProfile=default
4
+ javac.classpath=
5
+ platform.active=default
6
+ source.encoding=UTF-8
7
+ spec.src.dir=spec
8
+ src.dir=lib
9
+ src.tasks.dir=tasks
10
+ test.src.dir=test
@@ -0,0 +1,17 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project xmlns="http://www.netbeans.org/ns/project/1">
3
+ <type>org.netbeans.modules.ruby.rubyproject</type>
4
+ <configuration>
5
+ <data xmlns="http://www.netbeans.org/ns/ruby-project/1">
6
+ <name>Zip File Content Comparator</name>
7
+ <source-roots>
8
+ <root id="src.dir"/>
9
+ <root id="src.tasks.dir" name="Rake Tasks"/>
10
+ </source-roots>
11
+ <test-roots>
12
+ <root id="test.src.dir"/>
13
+ <root id="spec.src.dir"/>
14
+ </test-roots>
15
+ </data>
16
+ </configuration>
17
+ </project>
@@ -0,0 +1,5 @@
1
+ require 'test/unit'
2
+
3
+ # Add your testcases here
4
+
5
+ require 'test/test_zip_content_comparator.rb'
@@ -0,0 +1,136 @@
1
+ $:.unshift File.join(File.dirname(__FILE__),'..','lib')
2
+
3
+ require 'test/unit'
4
+ require 'zip_content_comparator'
5
+ require 'pp'
6
+
7
+ class Test_zip_content_comparator < Test::Unit::TestCase
8
+ TEST_DATA_PATH = 'test/data/zip_content_comparator'
9
+ def setup
10
+ # HOOK: improve test file names (reference file, the same as reference file,
11
+ # totally diferent file, a bit different file)
12
+ @reference = File.join(TEST_DATA_PATH, 'reference_test_file.zip')
13
+ @identical = File.join(TEST_DATA_PATH, 'identical_to_reference_test_file.zip')
14
+ @one_file_added = File.join(TEST_DATA_PATH, 'one_file_added.zip')
15
+ @one_file_changed = File.join(TEST_DATA_PATH, 'one_file_changed.zip')
16
+ @one_file_deleted = File.join(TEST_DATA_PATH, 'one_file_deleted.zip')
17
+ @one_file_added_deleted_and_changed = File.join(TEST_DATA_PATH, 'one_file_added_deleted_and_changed.zip')
18
+ @modified_class_file = File.join(TEST_DATA_PATH, 'modified_class_file.zip')
19
+ end
20
+
21
+ def test_001_read_in_zipfiles
22
+ zip_file1, zip_file2 = ZipContentComparator.read_in_files(@reference, @one_file_added)
23
+ assert zip_file1
24
+ assert zip_file2
25
+ assert_kind_of Zip::ZipFile, zip_file1
26
+ assert_kind_of Zip::ZipFile, zip_file2
27
+ end
28
+
29
+ def test_002_get_files_and_dirs_list
30
+ zip_file1, zip_file2 = ZipContentComparator.read_in_files(@reference, @reference)
31
+ directory_list, file_list = ZipContentComparator.get_files_and_dirs_list(zip_file1, '.')
32
+ assert ! directory_list.empty?
33
+ assert ! file_list.empty?
34
+ assert_not_equal directory_list, file_list
35
+ assert_equal ["prime", "even", "even/moultiplicityof6"].sort, directory_list
36
+ assert_equal ["1", "3", "5.class", "even/2", "even/4", "even/moultiplicityof6/6",
37
+ "even/moultiplicityof6/12.class", "prime/1", "prime/2", "prime/3", "prime/5.class"].sort,
38
+ file_list
39
+ end
40
+
41
+ # Tests if the MD5 digest is equal for identical files placed in two separate ZIP files
42
+ # systems (ZIP files). Every test file is in a different ZIP file.
43
+ def test_003_md5_in_zipfilesystem_works
44
+ file1 = Zip::ZipFile.open(@reference)
45
+ file2 = Zip::ZipFile.open(@identical)
46
+ directory_list1, file_list1 = ZipContentComparator.get_files_and_dirs_list(file1, '.')
47
+ directory_list2, file_list2 = ZipContentComparator.get_files_and_dirs_list(file2, '.')
48
+ assert_equal MD5.md5(file1.file.read(file_list1[0])),
49
+ MD5.md5(file2.file.read(file_list2[0]))
50
+ end
51
+
52
+ def test_004_compare_identical_zip_files
53
+ zip_file1, zip_file2 = ZipContentComparator.read_in_files(@reference, @identical)
54
+ directory_list1, file_list1 = ZipContentComparator.get_files_and_dirs_list(zip_file1, '.')
55
+ directory_list2, file_list2 = ZipContentComparator.get_files_and_dirs_list(zip_file2, '.')
56
+ identical_files, different_files = ZipContentComparator.compare_files(zip_file1, file_list1, zip_file2, file_list2)
57
+ assert different_files.empty?
58
+ assert ! identical_files.empty?
59
+ end
60
+
61
+ def test_012_compare_identical_zip_files
62
+ identical_files, different_files = ZipContentComparator.compare(@reference, @identical)
63
+ assert different_files.empty?
64
+ assert !identical_files.empty?
65
+ assert_equal 11, identical_files.size
66
+ end
67
+
68
+ def test_013_compare_different_zip_files
69
+ identical_files, different_files = ZipContentComparator.compare(@reference, @one_file_changed)
70
+ assert ! different_files.empty?
71
+ assert ! identical_files.empty?
72
+ assert_equal 1, different_files.size
73
+ assert_equal 10, identical_files.size
74
+ assert_equal ['3'], different_files
75
+ end
76
+ def test_014_compare_different_zip_files
77
+ identical_files, different_files = ZipContentComparator.compare(@reference, @one_file_added)
78
+ assert ! different_files.empty?
79
+ assert ! identical_files.empty?
80
+ assert_equal 1, different_files.size
81
+ assert_equal 11, identical_files.size
82
+ assert_equal ['prime/7'], different_files
83
+ end
84
+ def test_015_compare_different_zip_files
85
+ identical_files, different_files = ZipContentComparator.compare(@reference, @one_file_deleted)
86
+ assert ! different_files.empty?
87
+ assert ! identical_files.empty?
88
+ assert_equal 1, different_files.size
89
+ assert_equal 10, identical_files.size
90
+ assert_equal ['1'], different_files
91
+ end
92
+ def test_016_compare_different_zip_files
93
+ identical_files, different_files = ZipContentComparator.compare(@reference, @one_file_added_deleted_and_changed)
94
+ assert ! different_files.empty?
95
+ assert ! identical_files.empty?
96
+ assert_equal 3, different_files.size
97
+ assert_equal 9, identical_files.size
98
+ assert different_files.include?('1')
99
+ assert different_files.include?('prime/7')
100
+ assert different_files.include?('3')
101
+ end
102
+
103
+ def test_021_identical?
104
+ assert ZipContentComparator.identical?(@reference, @identical)
105
+ end
106
+ def test_022_not_identical
107
+ assert ! ZipContentComparator.identical?(@reference, @one_file_changed)
108
+ end
109
+ def test_023_identical_with_detect_pattern
110
+ assert ZipContentComparator.identical?(@reference, @identical,
111
+ :detect_pattern => /.class$/)
112
+ end
113
+ def test_024_not_identical_with_detect_pattern
114
+ assert ! ZipContentComparator.identical?(@reference, @modified_class_file,
115
+ :detect_pattern => /.class$/)
116
+ end
117
+ def test_025_identical_with_ignore_pattern
118
+ assert ZipContentComparator.identical?(@reference, @identical,
119
+ :ignore_pattern => /.class$/)
120
+ end
121
+ def test_026_not_identical_with_ignore_pattern
122
+ assert ! ZipContentComparator.identical?(@reference, @modified_class_file,
123
+ :ignore_pattern => /.class$/)
124
+ end
125
+
126
+ def test_041_example_from_doku_string
127
+ identical_files, different_files = ZipContentComparator.compare(@reference, @identical)
128
+ list_of_changed_class_files = different_files.detect{ |file| file =~ /.class$/ } || []
129
+ assert list_of_changed_class_files.empty?
130
+ end
131
+ def test_042_example_from_doku_string
132
+ identical_files, different_files = ZipContentComparator.compare(@reference, @modified_class_file)
133
+ list_of_changed_class_files = different_files.detect{ |file| file =~ /.class$/ } || []
134
+ assert ! list_of_changed_class_files.empty?
135
+ end
136
+ end
@@ -0,0 +1,67 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{zip_content_comparator}
8
+ s.version = "0.1.0"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Szymon (jeznet) Je\305\274"]
12
+ s.date = %q{2010-08-17}
13
+ s.description = %q{An utility for comparing content of ZIP files.
14
+ It does not extract the files anywhere, its's using instead ZIP::ZipFile class
15
+ from rubyzip gem which enables to access ZIP files like a file system.
16
+ It uses MD5 to compare files.
17
+ }
18
+ s.email = %q{szymon@jez.net.pl}
19
+ s.extra_rdoc_files = [
20
+ "LICENSE",
21
+ "README.rdoc"
22
+ ]
23
+ s.files = [
24
+ ".autotest",
25
+ ".gitignore",
26
+ "LICENSE",
27
+ "README.rdoc",
28
+ "Rakefile",
29
+ "VERSION",
30
+ "lib/zip_content_comparator.rb",
31
+ "nbproject/project.properties",
32
+ "nbproject/project.xml",
33
+ "test/data/zip_content_comparator/identical_to_reference_test_file.zip",
34
+ "test/data/zip_content_comparator/modified_class_file.zip",
35
+ "test/data/zip_content_comparator/one_file_added.zip",
36
+ "test/data/zip_content_comparator/one_file_added_deleted_and_changed.zip",
37
+ "test/data/zip_content_comparator/one_file_changed.zip",
38
+ "test/data/zip_content_comparator/one_file_deleted.zip",
39
+ "test/data/zip_content_comparator/reference_test_file.zip",
40
+ "test/test_suite.rb",
41
+ "test/test_zip_content_comparator.rb",
42
+ "zip_content_comparator.gemspec"
43
+ ]
44
+ s.homepage = %q{http://github.com/jeznet/zip_content_comparator}
45
+ s.rdoc_options = ["--charset=UTF-8"]
46
+ s.require_paths = ["lib"]
47
+ s.rubygems_version = %q{1.3.6}
48
+ s.summary = %q{An utility for comparing content of ZIP files.}
49
+ s.test_files = [
50
+ "test/test_suite.rb",
51
+ "test/test_zip_content_comparator.rb"
52
+ ]
53
+
54
+ if s.respond_to? :specification_version then
55
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
56
+ s.specification_version = 3
57
+
58
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
59
+ s.add_runtime_dependency(%q<rubyzip>, [">= 0.9.1"])
60
+ else
61
+ s.add_dependency(%q<rubyzip>, [">= 0.9.1"])
62
+ end
63
+ else
64
+ s.add_dependency(%q<rubyzip>, [">= 0.9.1"])
65
+ end
66
+ end
67
+
metadata ADDED
@@ -0,0 +1,100 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: zip_content_comparator
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 1
8
+ - 0
9
+ version: 0.1.0
10
+ platform: ruby
11
+ authors:
12
+ - "Szymon (jeznet) Je\xC5\xBC"
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2010-08-17 00:00:00 +02:00
18
+ default_executable:
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: rubyzip
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ">="
26
+ - !ruby/object:Gem::Version
27
+ segments:
28
+ - 0
29
+ - 9
30
+ - 1
31
+ version: 0.9.1
32
+ type: :runtime
33
+ version_requirements: *id001
34
+ description: |
35
+ An utility for comparing content of ZIP files.
36
+ It does not extract the files anywhere, its's using instead ZIP::ZipFile class
37
+ from rubyzip gem which enables to access ZIP files like a file system.
38
+ It uses MD5 to compare files.
39
+
40
+ email: szymon@jez.net.pl
41
+ executables: []
42
+
43
+ extensions: []
44
+
45
+ extra_rdoc_files:
46
+ - LICENSE
47
+ - README.rdoc
48
+ files:
49
+ - .autotest
50
+ - .gitignore
51
+ - LICENSE
52
+ - README.rdoc
53
+ - Rakefile
54
+ - VERSION
55
+ - lib/zip_content_comparator.rb
56
+ - nbproject/project.properties
57
+ - nbproject/project.xml
58
+ - test/data/zip_content_comparator/identical_to_reference_test_file.zip
59
+ - test/data/zip_content_comparator/modified_class_file.zip
60
+ - test/data/zip_content_comparator/one_file_added.zip
61
+ - test/data/zip_content_comparator/one_file_added_deleted_and_changed.zip
62
+ - test/data/zip_content_comparator/one_file_changed.zip
63
+ - test/data/zip_content_comparator/one_file_deleted.zip
64
+ - test/data/zip_content_comparator/reference_test_file.zip
65
+ - test/test_suite.rb
66
+ - test/test_zip_content_comparator.rb
67
+ - zip_content_comparator.gemspec
68
+ has_rdoc: true
69
+ homepage: http://github.com/jeznet/zip_content_comparator
70
+ licenses: []
71
+
72
+ post_install_message:
73
+ rdoc_options:
74
+ - --charset=UTF-8
75
+ require_paths:
76
+ - lib
77
+ required_ruby_version: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ segments:
82
+ - 0
83
+ version: "0"
84
+ required_rubygems_version: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ segments:
89
+ - 0
90
+ version: "0"
91
+ requirements: []
92
+
93
+ rubyforge_project:
94
+ rubygems_version: 1.3.6
95
+ signing_key:
96
+ specification_version: 3
97
+ summary: An utility for comparing content of ZIP files.
98
+ test_files:
99
+ - test/test_suite.rb
100
+ - test/test_zip_content_comparator.rb