gibbler 0.8.4 → 0.8.5

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGES.txt CHANGED
@@ -1,5 +1,10 @@
1
1
  GIBBLER, CHANGES
2
2
 
3
+ #### 0.8.5 (2010-12-23) ###############################
4
+
5
+ * CHANGE: Gibbler::Complex will skip fields with no __gibbler method
6
+ * ADDED: Gibbler.debug=
7
+
3
8
 
4
9
  #### 0.8.4 (2010-06-19) ###############################
5
10
 
data/Rakefile CHANGED
@@ -1,85 +1,64 @@
1
- require 'rubygems'
2
- require 'rake/clean'
3
- require 'rake/gempackagetask'
4
- require 'fileutils'
5
- include FileUtils
1
+ require "rubygems"
2
+ require "rake"
3
+ require "rake/clean"
4
+ require 'yaml'
6
5
 
7
6
  begin
8
7
  require 'hanna/rdoctask'
9
8
  rescue LoadError
10
9
  require 'rake/rdoctask'
11
10
  end
12
-
13
-
14
- task :default => :package
15
11
 
16
- # CONFIG =============================================================
17
-
18
- # Change the following according to your needs
19
- README = "README.rdoc"
20
- CHANGES = "CHANGES.txt"
21
- LICENSE = "LICENSE.txt"
22
-
23
- # Files and directories to be deleted when you run "rake clean"
24
- CLEAN.include [ 'pkg', '*.gem', '.config', 'doc']
25
-
26
- name = 'gibbler'
27
- load "#{name}.gemspec"
28
- version = @spec.version
29
-
30
- # That's it! The following defaults should allow you to get started
31
- # on other things.
32
-
33
-
34
- # TESTS/SPECS =========================================================
35
-
36
-
37
-
38
- # INSTALL =============================================================
12
+ config = YAML.load_file("VERSION.yml")
13
+ task :default => ["build"]
14
+ CLEAN.include [ 'pkg', 'doc' ]
15
+ name = "gibbler"
39
16
 
40
- Rake::GemPackageTask.new(@spec) do |p|
41
- p.need_tar = true if RUBY_PLATFORM !~ /mswin/
17
+ begin
18
+ require "jeweler"
19
+ Jeweler::Tasks.new do |gem|
20
+ gem.version = "#{config[:MAJOR]}.#{config[:MINOR]}.#{config[:PATCH]}"
21
+ gem.name = name
22
+ gem.rubyforge_project = gem.name
23
+ gem.summary = "Gibbler: Git-like hashes for Ruby objects"
24
+ gem.description = gem.summary
25
+ gem.email = "delano@solutious.com"
26
+ gem.homepage = "http://github.com/delano/gibbler"
27
+ gem.authors = ["Delano Mandelbaum"]
28
+ gem.add_dependency("attic", ">= 0.4.0")
29
+ end
30
+ Jeweler::GemcutterTasks.new
31
+ rescue LoadError
32
+ puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler"
42
33
  end
43
34
 
44
- task :release => [ :rdoc, :package ]
45
- task :install => [ :rdoc, :package ] do
46
- sh %{sudo gem install pkg/#{name}-#{version}.gem}
47
- end
48
- task :uninstall => [ :clean ] do
49
- sh %{sudo gem uninstall #{name}}
35
+
36
+ Rake::RDocTask.new do |rdoc|
37
+ version = "#{config[:MAJOR]}.#{config[:MINOR]}.#{config[:PATCH]}"
38
+ rdoc.rdoc_dir = "doc"
39
+ rdoc.title = "#{name} #{version}"
40
+ rdoc.rdoc_files.include("README*")
41
+ rdoc.rdoc_files.include("LICENSE.txt")
42
+ rdoc.rdoc_files.include("bin/*.rb")
43
+ rdoc.rdoc_files.include("lib/**/*.rb")
50
44
  end
51
45
 
52
46
 
53
- # RUBYFORGE RELEASE / PUBLISH TASKS ==================================
47
+ # Rubyforge Release / Publish Tasks ==================================
54
48
 
55
- if @spec.rubyforge_project
56
- desc 'Publish website to rubyforge'
57
- task 'publish:rdoc' => 'doc/index.html' do
58
- sh "scp -rp doc/* rubyforge.org:/var/www/gforge-projects/#{name}/"
59
- end
49
+ #about 'Publish website to rubyforge'
50
+ task 'publish:rdoc' => 'doc/index.html' do
51
+ #sh "scp -rp doc/* rubyforge.org:/var/www/gforge-projects/#{name}/"
52
+ end
60
53
 
61
- desc 'Public release to rubyforge'
62
- task 'publish:gem' => [:package] do |t|
63
- sh <<-end
64
- rubyforge add_release -o Any -a #{CHANGES} -f -n #{README} #{name} #{name} #{@spec.version} pkg/#{name}-#{@spec.version}.gem &&
65
- rubyforge add_file -o Any -a #{CHANGES} -f -n #{README} #{name} #{name} #{@spec.version} pkg/#{name}-#{@spec.version}.tgz
66
- end
54
+ #about 'Public release to rubyforge'
55
+ task 'publish:gem' => [:package] do |t|
56
+ sh <<-end
57
+ rubyforge add_release -o Any -a CHANGES.txt -f -n README.md #{name} #{name} #{@spec.version} pkg/#{name}-#{@spec.version}.gem &&
58
+ rubyforge add_file -o Any -a CHANGES.txt -f -n README.md #{name} #{name} #{@spec.version} pkg/#{name}-#{@spec.version}.tgz
67
59
  end
68
60
  end
69
61
 
70
62
 
71
63
 
72
- # RUBY DOCS TASK ==================================
73
-
74
- Rake::RDocTask.new do |t|
75
- t.rdoc_dir = 'doc'
76
- t.title = @spec.summary
77
- t.options << '--line-numbers'
78
- t.options << '--charset' << 'utf-8'
79
- t.rdoc_files.include(LICENSE)
80
- t.rdoc_files.include(README)
81
- t.rdoc_files.include(CHANGES)
82
- t.rdoc_files.include('lib/**/*.rb')
83
- end
84
-
85
64
 
data/VERSION.yml ADDED
@@ -0,0 +1,4 @@
1
+ ---
2
+ :MAJOR: 0
3
+ :MINOR: 8
4
+ :PATCH: 5
data/gibbler.gemspec CHANGED
@@ -1,45 +1,71 @@
1
- @spec = Gem::Specification.new do |s|
2
- s.name = "gibbler"
3
- s.rubyforge_project = "gibbler"
4
- s.version = "0.8.4"
5
- s.summary = "Gibbler: Git-like hashes for Ruby objects"
6
- s.description = s.summary
7
- s.author = "Delano Mandelbaum"
8
- s.email = "delano@solutious.com"
9
- s.homepage = "http://github.com/delano/gibbler"
10
-
11
- # = EXECUTABLES =
12
- # The list of executables in your project (if any). Don't include the path,
13
- # just the base filename.
14
- s.executables = %w[]
15
-
16
- # Directories to extract rdocs from
17
- s.require_paths = %w[lib]
18
-
19
- # Specific files to include rdocs from
20
- s.extra_rdoc_files = ["README.rdoc", "LICENSE.txt"]
21
- s.has_rdoc = true
22
-
23
- # Update --main to reflect the default page to display
24
- s.rdoc_options = ["--line-numbers", "--title", s.summary, "--main", "README.rdoc"]
25
-
26
- # = DEPENDENCIES =
27
- s.add_dependency 'attic', '>= 0.4.0'
28
-
29
- # = MANIFEST =
30
- s.files = %w(
31
- CHANGES.txt
32
- LICENSE.txt
33
- README.rdoc
34
- Rakefile
35
- gibbler.gemspec
36
- lib/gibbler.rb
37
- lib/gibbler/aliases.rb
38
- lib/gibbler/history.rb
39
- lib/gibbler/mixins.rb
40
- )
41
-
42
- s.has_rdoc = true
43
- s.rubygems_version = '1.3.0'
44
-
45
- end
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{gibbler}
8
+ s.version = "0.8.5"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Delano Mandelbaum"]
12
+ s.date = %q{2010-12-23}
13
+ s.description = %q{Gibbler: Git-like hashes for Ruby objects}
14
+ s.email = %q{delano@solutious.com}
15
+ s.extra_rdoc_files = [
16
+ "LICENSE.txt",
17
+ "README.rdoc"
18
+ ]
19
+ s.files = [
20
+ "CHANGES.txt",
21
+ "LICENSE.txt",
22
+ "README.rdoc",
23
+ "Rakefile",
24
+ "VERSION.yml",
25
+ "gibbler.gemspec",
26
+ "lib/gibbler.rb",
27
+ "lib/gibbler/aliases.rb",
28
+ "lib/gibbler/history.rb",
29
+ "lib/gibbler/mixins.rb",
30
+ "try/01_mixins_try.rb",
31
+ "try/02_compat_try.rb",
32
+ "try/05_gibbler_digest_try.rb",
33
+ "try/10_basic_try.rb",
34
+ "try/11_basic_sha256_try.rb",
35
+ "try/14_extended_try.rb",
36
+ "try/15_file_try.rb",
37
+ "try/16_uri_try.rb",
38
+ "try/17_complex_object_try.rb",
39
+ "try/18_proc_try.rb",
40
+ "try/20_time_try.rb",
41
+ "try/30_secret_try.rb",
42
+ "try/50_history_try.rb",
43
+ "try/51_hash_history_try.rb",
44
+ "try/52_array_history_try.rb",
45
+ "try/53_string_history_try.rb",
46
+ "try/57_arbitrary_history_try.rb",
47
+ "try/59_history_exceptions_try.rb",
48
+ "try/80_performance_try.rb",
49
+ "try/90_alias_try.rb"
50
+ ]
51
+ s.homepage = %q{http://github.com/delano/gibbler}
52
+ s.rdoc_options = ["--charset=UTF-8"]
53
+ s.require_paths = ["lib"]
54
+ s.rubyforge_project = %q{gibbler}
55
+ s.rubygems_version = %q{1.3.7}
56
+ s.summary = %q{Gibbler: Git-like hashes for Ruby objects}
57
+
58
+ if s.respond_to? :specification_version then
59
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
60
+ s.specification_version = 3
61
+
62
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
63
+ s.add_runtime_dependency(%q<attic>, [">= 0.4.0"])
64
+ else
65
+ s.add_dependency(%q<attic>, [">= 0.4.0"])
66
+ end
67
+ else
68
+ s.add_dependency(%q<attic>, [">= 0.4.0"])
69
+ end
70
+ end
71
+
data/lib/gibbler.rb CHANGED
@@ -15,7 +15,17 @@ require 'digest/sha1'
15
15
  # "Hola, Tanneritos"
16
16
  #
17
17
  module Gibbler
18
- VERSION = "0.8.4"
18
+ module VERSION
19
+ def self.to_s
20
+ load_config
21
+ [@version[:MAJOR], @version[:MINOR], @version[:PATCH]].join('.')
22
+ end
23
+ alias_method :inspect, :to_s
24
+ def self.load_config
25
+ require 'yaml'
26
+ @version ||= YAML.load_file(File.join(GIBBLER_LIB_HOME, '..', 'VERSION.yml'))
27
+ end
28
+ end
19
29
 
20
30
  @default_base = 16
21
31
  @secret = nil
@@ -223,6 +233,7 @@ module Gibbler
223
233
  def self.debug?; @@gibbler_debug; end
224
234
  def self.enable_debug; @@gibbler_debug = true; end
225
235
  def self.disable_debug; @@gibbler_debug = false; end
236
+ def self.debug=(v); @@gibbler_debug = v; end
226
237
  # Returns the current digest class.
227
238
  def self.digest_type; @@gibbler_digest_type; end
228
239
 
@@ -314,6 +325,10 @@ module Gibbler
314
325
  gibbler_debug :gibbler_fields, gibbler_fields
315
326
  gibbler_fields.each do |n|
316
327
  value = instance_variable_get("@#{n}")
328
+ unless value.respond_to? :__gibbler
329
+ gibbler_debug klass, :skipping, n
330
+ next
331
+ end
317
332
  d << '%s:%s:%s' % [value.class, n, value.__gibbler(digest_type)]
318
333
  end
319
334
  d = d.join(':').__gibbler(digest_type)
@@ -0,0 +1,6 @@
1
+ require 'gibbler'
2
+
3
+ ## has String#clear
4
+ "".respond_to? :clear
5
+ #=> true
6
+
@@ -0,0 +1,14 @@
1
+ require 'gibbler'
2
+
3
+ ## Gibbler Objects have gibbler_cache method
4
+ "kimmy".respond_to? :gibbler_cache
5
+ #=> true
6
+
7
+ ## Gibbler Objects have __gibbler_cache method
8
+ "kimmy".respond_to? :__gibbler_cache
9
+ #=> true
10
+
11
+ ## __gibbler_cache returns the same value as gibbler_cache
12
+ @a = "kimmy" and @a.gibbler
13
+ @a.gibbler_cache
14
+ #=> @a.__gibbler_cache
@@ -0,0 +1,41 @@
1
+ require 'gibbler'
2
+
3
+ ## has short method
4
+ "kimmy".gibbler.short
5
+ #=> Gibbler::Digest.new("c8027100")
6
+
7
+ # can Gibbler::Digest#short
8
+ Gibbler::Digest.new("1234567890").short
9
+ #=> Gibbler::Digest.new("12345678")
10
+
11
+ # == is strict (only exact matches)
12
+ Gibbler::Digest.new("1234567890") != "12345678"
13
+ #=> true
14
+
15
+ # === is relaxed (allows partial matches)
16
+ Gibbler::Digest.new("1234567890") === "12345678"
17
+ #=> true
18
+
19
+ # supports base36 output
20
+ Gibbler::Digest.new("1234567890").base36
21
+ #=> 'zx2tc40'
22
+
23
+ # base36 works on digests too
24
+ "kimmy".gibbler.base36
25
+ #=> 'nd2w8270caslmly0ix3s8ruh0y8yjdt'
26
+
27
+ # base36 digests can be short too
28
+ "kimmy".gibbler.base36.short
29
+ #=> 'nd2w8270'
30
+
31
+ # to_s returns a string and can accept a base
32
+ "kimmy".gibbler.to_s(16)
33
+ #=> "kimmy".gibbler.base(16).to_s
34
+
35
+ # base takes a base
36
+ "kimmy".gibbler.base(17)
37
+ #=> '12gaabd69eg5b32gf69a7a021c22g977d4gf46d6'
38
+
39
+ # to_s can take a base
40
+ "kimmy".gibbler.to_s(36)
41
+ #=> "kimmy".gibbler.base36
@@ -0,0 +1,130 @@
1
+ require 'gibbler'
2
+
3
+ #Gibbler.enable_debug
4
+
5
+ # include Gibbler raises exception
6
+ begin
7
+ a = Class.new
8
+ a.send :include, Gibbler
9
+ rescue RuntimeError
10
+ :success
11
+ end
12
+ #=> :success
13
+
14
+ # Symbol digests are consistent
15
+ :kimmy.gibbler
16
+ #=> '52be7494a602d85ff5d8a8ab4ffe7f1b171587df'
17
+
18
+ # String digests are consistent
19
+ 'kimmy'.gibbler
20
+ #=> 'c8027100ecc54945ab15ddac529230e38b1ba6a1'
21
+
22
+ # String and Symbol return different digests
23
+ :kimmy.gibbler != "kimmy".gibbler
24
+ #=> true
25
+
26
+ # Class digests are consistent
27
+ Class.gibbler
28
+ #=> '25ac269ae3ef18cdb4143ad02ca315afb5026de9'
29
+
30
+ # Fixnum instance digests are consistent
31
+ 1.gibbler
32
+ #=> 'a9cad665549bd22a4346fcf602d9d3c3b0482bbe'
33
+
34
+ # Bignum instance
35
+ 100000000000.gibbler
36
+ #=> '608256db120251843843bba57e9b2c7adb7342aa'
37
+
38
+ # Empty Hash instance digests are consistent
39
+ Hash.new.gibbler
40
+ #=> '4fdcadc66a38feb9c57faf3c5a18d5e76a6d29bf'
41
+
42
+ # Populated Hash instance
43
+ { :a => [1,2,3, [4,5,6]], :b => { :c => Class } }.gibbler
44
+ #=> "1d4b62e1e9f2c097b0cefb6877bf47c2015cdd21"
45
+
46
+ # Empty Array instance
47
+ Array.new.gibbler
48
+ #=> '48fda57c05684c9e5c3259557851943572183a21'
49
+
50
+ # Populated Array instance
51
+ [1, 2, :runtime, [3, "four", [Object, true]]].gibbler
52
+ #=> "3e1d79d113a409a96a13ca3879fc4c42027aa74b"
53
+
54
+ # Knows when a Hash has not changed
55
+ a = { :magic => true }
56
+ a.gibbler
57
+ a[:magic] = true
58
+ a.gibbled?
59
+ # => false
60
+
61
+ # Knows when a Hash has changed
62
+ a = { :magic => true }
63
+ a.gibbler
64
+ a[:magic] = false
65
+ a.gibbled?
66
+ #=> true
67
+
68
+ # Two Symbol digests don't cross streams
69
+ a, b = :something, :anything
70
+ a.gibbler
71
+ b.gibbler
72
+ [a.gibbler_cache.short, b.gibbler_cache.short]
73
+ #=> ["667ce086", "92d5f7cd"]
74
+
75
+ # Two String digests don't cross streams"
76
+ a, b = 'something', 'anything'
77
+ a.gibbler
78
+ b.gibbler
79
+ [a.gibbler_cache.short, b.gibbler_cache.short]
80
+ #=> ["ce0c7694", "c13b2f02"]
81
+
82
+ ## DISABLED: If gibbler/history is required, there will be an
83
+ ## additional attic_var (:gibbler_history), but only if the
84
+ ## gibbler_history method has been called already (the history
85
+ ## remains nil by default). The fix is not straightfroward and
86
+ ## tests are not important anyway so disabling them is fine.
87
+ ## Symbol has list of attic vars", [:gibbler_cache]
88
+ # Symbol.attic_vars
89
+ #end
90
+ #
91
+ ## String has list of attic vars", [:gibbler_cache]
92
+ # String.attic_vars
93
+ #end
94
+ #
95
+ ## Hash has list of attic vars", [:gibbler_cache]
96
+ # Hash.attic_vars
97
+ #end
98
+
99
+ # Freezing an object will update the digest
100
+ a = { :a => 1 }
101
+ pre = a.gibbler;
102
+ a[:a] = 2
103
+ post = a.freeze.gibbler
104
+ pre != post && post == a.gibbler_cache
105
+ #=> true
106
+
107
+ # works on arbitrary objects"
108
+ class ::FullHouse
109
+ include Gibbler::Complex
110
+ attr_accessor :roles
111
+ end
112
+ a = FullHouse.new
113
+ a.roles = [:jesse, :joey, :danny, :kimmy, :michelle, :dj, :stephanie]
114
+ a.gibbler
115
+ #=> "fa5f741275b6b27932537e1946042b0286286e1d"
116
+
117
+ # TODO: Update for Attic 0.4
118
+ # doesn't reveal @__gibbler_digest__ instance variable", false
119
+ a = {}
120
+ a.gibbler # We need to gibbler first so it sets a value to the instance var
121
+ val = RUBY_VERSION >= '1.9' ? :'@__gibbler_digest__' : '@__gibbler_digest__'
122
+ a.instance_variables.member? val
123
+ #=> false
124
+
125
+ # previous digest"
126
+ a = "kimmy"
127
+ a.gibbler
128
+ a.gibbler_cache
129
+ #=> 'c8027100ecc54945ab15ddac529230e38b1ba6a1'
130
+
@@ -0,0 +1,28 @@
1
+ require 'gibbler'
2
+
3
+ # NOTE: JRuby requires that we use OpenSSL::Digest::SHA256
4
+ if Tryouts.sysinfo.vm == :java
5
+ require 'openssl'
6
+ Gibbler.digest_type = OpenSSL::Digest::SHA256
7
+ else
8
+ Gibbler.digest_type = Digest::SHA256
9
+ end
10
+
11
+ ## A Symbol can gibbler
12
+ :anything.gibbler
13
+ #=> '754f87ca720ec256633a286d9270d68478850b2abd7b0ae65021cb769ae70c08'
14
+
15
+ ## Class can gibbler
16
+ Class.gibbler
17
+ #=> 'd345c0afb4e8da0133a3946d3bd9b2622b0acdd8d6cc1237470cc637a9e4777f'
18
+
19
+ ## TrueClass can gibbler
20
+ TrueClass.gibbler
21
+ #=> 'b7b874a9bff7825caa57750a900652354ac601b77497b694d313f658c69d25b4'
22
+
23
+ # Empty Hash instance
24
+ {}.gibbler
25
+ #=> '88d2bcbd68ce593fd2e0e06f276f7301357516291b95c0c53038e61a9bf091e5'
26
+
27
+ Gibbler.digest_type = Digest::SHA1
28
+
@@ -0,0 +1,78 @@
1
+ require 'gibbler'
2
+
3
+ ## true can gibbler
4
+ true.gibbler
5
+ #=> 'f2b0150c84c5c834406ec9cdec989a0fa938b4ad'
6
+
7
+ # false can gibbler
8
+ false.gibbler
9
+ #=> 'abee839edf5f9c101c505c28987ca35c31c7fc8d'
10
+
11
+ # TrueClass can gibbler
12
+ TrueClass.gibbler
13
+ #=> '583fb214ec50d2c4a123cc52de0c65e801d13516'
14
+
15
+ # FalseClass can gibbler
16
+ FalseClass.gibbler
17
+ #=> '11f262be475ddf38a25888e9f6ec82f384a7c58b'
18
+
19
+ # Class can gibbler
20
+ Class.gibbler
21
+ #=> '25ac269ae3ef18cdb4143ad02ca315afb5026de9'
22
+
23
+ # Object can gibbler
24
+ Object.gibbler
25
+ #=> '5620e4a8b10ec6830fece61d33f5d3e9a349b4c2'
26
+
27
+ # Class instance can gibbler
28
+ Class.new.gibbler
29
+ #=> '083feec632e6cd5347e3fb3c7048365c3a0d710e'
30
+
31
+ # Module can gibbler
32
+ Module.gibbler
33
+ #=> '7295241e929ffd7cc974cf8d4481291e070937fc'
34
+
35
+ # Module instance can gibbler
36
+ Module.new.gibbler
37
+ #=> '6b5a192fd377dfc5c2828a3ad6105b68b6db33d5'
38
+
39
+ # Proc can gibbler"
40
+ Proc.gibbler
41
+ #=> '8640f7abcbcb80e3825ed827bf36819e26119e16'
42
+
43
+ # Range instance (..) can gibbler
44
+ (1..100).gibbler
45
+ #=> '5450635218fd16e594976e87abd0955529e28248'
46
+
47
+ # Range ... is different than ..
48
+ (1...100).gibbler != (1..100).gibbler
49
+ #=> true
50
+
51
+ # Range instance with Floats can gibbler
52
+ (0.1...1.5).gibbler
53
+ #=> '9d3cd5a21c17cfa0b4bb685730bd07994c486ba2'
54
+
55
+ # Range instance with one Float can gibbler
56
+ (0.1..1).gibbler
57
+ #=> 'c725659ca0f3fa3c9ab807bb2db4b718e2dca042'
58
+
59
+ # Range (..) doesn't equal range (...)"
60
+ ('a'..'e').gibbler != ('a'...'e').gibbler
61
+ #=> true
62
+
63
+ # nil has a gibbler
64
+ nil.gibbler
65
+ #=> '06fdf26b2a64e90cd35ea9162d9cc48c9f6bb13c'
66
+
67
+ # Module can gibbler
68
+ Module.gibbler
69
+ #=> '7295241e929ffd7cc974cf8d4481291e070937fc'
70
+
71
+ # Module instance can gibbler
72
+ Module.new.gibbler
73
+ #=> '6b5a192fd377dfc5c2828a3ad6105b68b6db33d5'
74
+
75
+ # Class can gibbler
76
+ Class.gibbler
77
+ #=> '25ac269ae3ef18cdb4143ad02ca315afb5026de9'
78
+
@@ -0,0 +1,36 @@
1
+ require 'tempfile'
2
+ require 'gibbler'
3
+
4
+ @tempfile = "tryouts-9000-awesome.txt"
5
+
6
+ ## File can gibbler
7
+ file = File.new(File.join('.', 'CHANGES.txt'))
8
+ file.gibbler
9
+ #=> 'c052e87bd0acb7e08c98dad7f8b09b4382a08ef6'
10
+
11
+ ## Gibbler is different for each path
12
+ file1 = File.new(File.join('.', 'CHANGES.txt'))
13
+ file2 = File.new(File.join('.', 'README.rdoc'))
14
+ file1.gibbler == file2.gibbler
15
+ #=> false
16
+
17
+ # TempFile can gibbler
18
+ Tempfile.new('gibbler').respond_to? :gibbler
19
+ #=> true
20
+
21
+ # TempFile digests change
22
+ Tempfile.new('gibbler').gibbler != Tempfile.new('gibbler').gibbler
23
+ #=> true
24
+
25
+ # File doesn't care about file contents
26
+ f = File.open @tempfile, 'w'
27
+ f.puts "World's Finest Number: " << "#{rand}"
28
+ f.close
29
+ File.new(@tempfile).gibbler
30
+ #=> '6d93f752fc23f36bffa5ddf9ee97d04be82efbdb'
31
+
32
+ ## JRuby doesn't like to use File.new with directories
33
+ ###=> '92cbcb7de73d7748b28d9e911f461013de34410f'
34
+ ### "File gibbler cares about trailing slash (/tmp/)", File.new(__FILE__)
35
+
36
+ File.unlink @tempfile if File.exists? @tempfile
data/try/16_uri_try.rb ADDED
@@ -0,0 +1,28 @@
1
+ require 'uri'
2
+ require 'gibbler'
3
+
4
+ # "URI::HTTP can gibbler"
5
+ uri = URI.parse "http://localhost:3114/spaceship"
6
+ uri.gibbler
7
+ #=> "9efe60a5db66aecf9b5fb8655b0bab0fcc7bd0c5"
8
+
9
+ # "URI::HTTPS can gibbler"
10
+ uri = URI.parse "https://localhost:3114/spaceship"
11
+ uri.gibbler
12
+ #=> "b75d3c34e60d6feafa796ddbb51e45710f6b106d"
13
+
14
+ # "URI::HTTP is trailing slash sensitive"
15
+ uri = URI.parse "http://localhost:3114/spaceship/"
16
+ uri.gibbler
17
+ #=> "191b0072b95ca0c79ed75e6deb5b28562dd9e5b9"
18
+
19
+ # "URI::Generic can gibbler"
20
+ uri = URI.parse "localhost:3114/spaceship"
21
+ uri.gibbler
22
+ #=> "d378372934326947113489d1f36f4853bef90a65"
23
+
24
+ # "URI::FTP can gibbler"
25
+ uri = URI.parse "ftp://localhost:3114/spaceship"
26
+ uri.gibbler
27
+ #=> "9d0543b31afebac9e8d38c56a0cf12070779f790"
28
+
@@ -0,0 +1,27 @@
1
+ require 'gibbler'
2
+
3
+ # arbitrary objects can specify instance variables to gibbler
4
+ class ::FullHouse
5
+ include Gibbler::Complex
6
+ attr_accessor :roles
7
+ attr_accessor :stamp
8
+ attr_accessor :ready
9
+ gibbler :roles
10
+ end
11
+ a = FullHouse.new
12
+ a.roles = [:jesse, :joey, :danny, :kimmy, :michelle, :dj, :stephanie]
13
+ a.stamp = Time.now
14
+ a.ready = true
15
+ a.gibbler
16
+ #=> "fa5f741275b6b27932537e1946042b0286286e1d"
17
+
18
+ # arbitrary objects can append more instance variables later on
19
+ class ::FullHouse
20
+ gibbler :stamp, :ready
21
+ end
22
+ a = FullHouse.new
23
+ a.roles = [:jesse, :joey, :danny, :kimmy, :michelle, :dj, :stephanie]
24
+ a.stamp = Time.parse('2009-08-25 16:43:53 UTC')
25
+ a.ready = true
26
+ a.gibbler
27
+ #=> "fbdce0d97a856e7106bec418d585c914914b8aa5"
@@ -0,0 +1,35 @@
1
+ require 'gibbler'
2
+
3
+ class ::MyProc < Proc; end
4
+
5
+ ## Proc.new can gibbler
6
+ Proc.new() { }.gibbler
7
+ #=> '12075835e94be34438376cd7a54c8db7e746f15d'
8
+
9
+ # Proc can gibbler
10
+ Proc.gibbler
11
+ #=> '8640f7abcbcb80e3825ed827bf36819e26119e16'
12
+
13
+ ## proc can gibbler
14
+ proc {}.gibbler
15
+ #=> '12075835e94be34438376cd7a54c8db7e746f15d'
16
+
17
+ # lambda can gibbler
18
+ lambda {}.gibbler
19
+ #=> '12075835e94be34438376cd7a54c8db7e746f15d'
20
+
21
+ # lambda gibbler is not aware of arity
22
+ lambda { |v| }.gibbler
23
+ #=> '12075835e94be34438376cd7a54c8db7e746f15d'
24
+
25
+ # proc gibbler is not aware of arity
26
+ proc { |v| }.gibbler
27
+ #=> '12075835e94be34438376cd7a54c8db7e746f15d'
28
+
29
+ # Proc gibbler is not aware of proc payload"
30
+ proc { |v| 1; }.gibbler
31
+ #=> '12075835e94be34438376cd7a54c8db7e746f15d'
32
+
33
+ # MyProc has a different digest
34
+ MyProc.new() { }.gibbler
35
+ #=> "c979a45653acaddcb9c1581a7de49c94ac96e128"
@@ -0,0 +1,27 @@
1
+ require 'date'
2
+ require 'gibbler'
3
+
4
+ # "Date instance can gibbler
5
+ Date.parse('2009-08-25').gibbler
6
+ #=> 'c8403fc35481fdf7f6f4a0e7262b1c9610bdebaa'
7
+
8
+ # "Time instance can gibbler
9
+ Time.parse('2009-08-25 16:43:53 UTC').gibbler
10
+ #=> '73b4635fc63b8dd32b622776201f98a37478be90'
11
+
12
+ # "Time instance can gibbler with single digit values
13
+ Time.parse('2009-01-01 01:01:01 UTC').gibbler
14
+ #=> 'd35546d6517c02f2a219ecfa2261a5274d217cb7'
15
+
16
+ # "DateTime instance can gibbler
17
+ DateTime.parse('2009-08-25T17:00:40+00:00').gibbler
18
+ #=> 'ad64c7694a50becf55c53485dce5d0013ff65785'
19
+
20
+ # "Time digest is based on UTC
21
+ Time.parse('2009-08-25 16:43:53 UTC').gibbler
22
+ #=> Time.parse('2009-08-25 12:43:53 -04:00').gibbler
23
+
24
+ # "DateTime digest is based on UTC
25
+ DateTime.parse('2009-08-25T17:00:40+00:00').gibbler
26
+ #=> DateTime.parse('2009-08-25T13:00:40-04:00').gibbler
27
+
@@ -0,0 +1,21 @@
1
+ require 'uri'
2
+ require 'gibbler'
3
+
4
+ # "Can set a sexy global secret
5
+ Gibbler.secret = 'kimmy'.gibbler
6
+ Gibbler.secret
7
+ #=> "c8027100ecc54945ab15ddac529230e38b1ba6a1"
8
+
9
+ # "When the secret is set, digests are different
10
+ 'kimmy'.gibbler
11
+ #=> "62e645351505cb89a0b06a0f5df8383ea754f71d"
12
+
13
+ # "When the secret is set, digests are different (again)
14
+ Gibbler.secret = :kimmy.gibbler
15
+ 'kimmy'.gibbler
16
+ #=> "e5f8a3d8e4a2dc99717984726efc910dab0c18f4"
17
+
18
+ # "Reset the secret back to nil
19
+ Gibbler.secret = nil
20
+ 'kimmy'.gibbler
21
+ #=> "c8027100ecc54945ab15ddac529230e38b1ba6a1"
@@ -0,0 +1,30 @@
1
+ require 'gibbler'
2
+ require 'gibbler/history'
3
+
4
+ # can convert short digest into long
5
+ a = { :magic => :original }
6
+ g = a.gibbler_commit.short
7
+ a.gibbler_find_long(g)
8
+ #=> "d7049916ddb25e6cc438b1028fb957e5139f9910"
9
+
10
+ # can return most recent stamp
11
+ a = { :magic => :original }
12
+ a.gibbler_commit
13
+ a.gibbler_stamp.class
14
+ #=> Time
15
+
16
+ # can return history
17
+ a = { :magic => :original }
18
+ a.gibbler_commit
19
+ a[:magic] = :changed
20
+ a.gibbler_commit
21
+ a.gibbler_history
22
+ #=> ["d7049916ddb25e6cc438b1028fb957e5139f9910", "0b11c377fccd44554a601e5d2b135c46dc1c4cb1"]
23
+
24
+ # can return history (short)
25
+ a = { :magic => :original }
26
+ a.gibbler_commit
27
+ a[:magic] = :changed
28
+ a.gibbler_commit
29
+ a.gibbler_history(:short)
30
+ #=> ["d7049916", "0b11c377"]
@@ -0,0 +1,71 @@
1
+ require 'gibbler'
2
+ require 'gibbler/history'
3
+
4
+ class ::Hash
5
+ include Gibbler::History
6
+ end
7
+
8
+ ## "doesn't reveal self.__gibbler_history instance variable",
9
+ a = {}
10
+ a.gibbler # We need to gibbler first so it sets a value to the instance var
11
+ val = RUBY_VERSION >= '1.9' ? :'self.__gibbler_history' : 'self.__gibbler_history'
12
+ a.instance_variables.member? val
13
+ #=> false
14
+
15
+ # can take a Hash snapshot
16
+ a = { :magic => :original }
17
+ a.gibbler_commit
18
+ #=> 'd7049916ddb25e6cc438b1028fb957e5139f9910'
19
+
20
+ # "return a Hash history"
21
+ a = { :magic => :original }
22
+ a.gibbler_commit
23
+ a[:magic] = :updated
24
+ a.gibbler_commit
25
+ a.gibbler_history
26
+ #=> ['d7049916ddb25e6cc438b1028fb957e5139f9910', 'b668098e16d08898532bf3aa33ce2253a3a4150e']
27
+
28
+ # "can revert Hash"
29
+ a = { :magic => :original }
30
+ a.gibbler_commit
31
+ a[:magic] = :updated
32
+ a.gibbler_revert!
33
+ #=> 'd7049916ddb25e6cc438b1028fb957e5139f9910'
34
+
35
+ # "knows a valid gibble"
36
+ a = { :magic => :original }
37
+ a.gibbler_commit
38
+ a.gibbler_valid? 'd7049916ddb25e6cc438b1028fb957e5139f9910'
39
+ #=> true
40
+
41
+ # "knows an invalid gibble"
42
+ a = { :magic => :original }
43
+ a.gibbler_commit
44
+ a.gibbler_valid? '2222222222222222222222222222222222222222'
45
+ #=> false
46
+
47
+ # "can revert to any valid gibble"
48
+ a = { :magic => :original }
49
+ a.gibbler_commit
50
+ a[:magic] = :updated
51
+ a.gibbler_commit
52
+ a[:magic] = :changed
53
+ a.gibbler_commit
54
+ a.gibbler_revert! 'd7049916ddb25e6cc438b1028fb957e5139f9910'
55
+ a
56
+ #=> Hash[:magic => :original]
57
+
58
+ # "revert does nothing if digest is the same as current one"
59
+ a = { :magic => :original }
60
+ a.gibbler_commit
61
+ a.gibbler_revert!
62
+ a
63
+ #=> Hash[:magic => :original]
64
+
65
+ # "can revert using short gibbler_commit"
66
+ a = { :magic => :original }
67
+ a.gibbler_commit
68
+ a[:magic] = :updated
69
+ a.gibbler_revert! 'd7049916'
70
+ #=> 'd7049916ddb25e6cc438b1028fb957e5139f9910'
71
+
@@ -0,0 +1,35 @@
1
+ require 'gibbler'
2
+ require 'gibbler/history'
3
+
4
+ class Array
5
+ include Gibbler::History
6
+ end
7
+
8
+ # "can take a Array snapshot"
9
+ a = [:jesse]
10
+ a.gibbler_commit
11
+ #=> 'd95fcabb498ae282f356eba63da541e4f72c6efa'
12
+
13
+ # "return an Array history"
14
+ a = [:jesse]
15
+ a.gibbler_commit
16
+ a << :joey
17
+ a.gibbler_commit
18
+ a.gibbler_history
19
+ #=> ['d95fcabb498ae282f356eba63da541e4f72c6efa', 'eebcb2e84e828b1a7207af4d588cf41fd4c6393a']
20
+
21
+ # "can revert Array"
22
+ a = [:jesse]
23
+ a.gibbler_commit
24
+ a << :joey
25
+ a.gibbler_revert!
26
+ #=> 'd95fcabb498ae282f356eba63da541e4f72c6efa'
27
+
28
+ # Raises exception when no history
29
+ begin
30
+ a = [:jesse]
31
+ a.gibbler_revert!
32
+ rescue Gibbler::NoHistory
33
+ :success
34
+ end
35
+ #=> :success
@@ -0,0 +1,29 @@
1
+ require 'gibbler'
2
+ require 'gibbler/history'
3
+
4
+ class String
5
+ include Gibbler::History
6
+ end
7
+
8
+ # "can take a String snapshot"
9
+ a = "kimmy"
10
+ a.gibbler_commit
11
+ #=> 'c8027100ecc54945ab15ddac529230e38b1ba6a1'
12
+
13
+ # "return a String history"
14
+ a = "kimmy"
15
+ a.gibbler_commit
16
+ a << " gibbler"
17
+ a.gibbler_commit
18
+ a.gibbler_history
19
+ #=> ['c8027100ecc54945ab15ddac529230e38b1ba6a1', '692c05d3186baf2da36e87b7bc5fe53ef13b902e']
20
+
21
+ # "can revert String"
22
+ a = "kimmy"
23
+ a.gibbler_commit
24
+ a << " gibbler"
25
+ a.gibbler
26
+ a.gibbler_revert!
27
+ #=> 'c8027100ecc54945ab15ddac529230e38b1ba6a1'
28
+
29
+
@@ -0,0 +1,31 @@
1
+ require 'gibbler'
2
+ require 'gibbler/history'
3
+
4
+ class ::FullHouse
5
+ include Gibbler::Complex
6
+ include Gibbler::History
7
+ attr_accessor :roles
8
+ end
9
+
10
+ # "can take a FullHouse snapshot"
11
+ a = FullHouse.new
12
+ a.gibbler_commit
13
+ #=> '4192d4cb59975813f117a51dcd4454ac16df6703'
14
+
15
+ # "return a FullHouse history"
16
+ a = FullHouse.new
17
+ a.gibbler_commit
18
+ a.roles = [:jesse]
19
+ a.gibbler_commit
20
+ a.gibbler_history
21
+ #=> ['4192d4cb59975813f117a51dcd4454ac16df6703', '05219bdee8ec6300b579f2ba8ce55d851d10928b']
22
+
23
+ # "can revert FullHouse"
24
+ a = FullHouse.new
25
+ a.gibbler_commit
26
+ a.roles = [:jesse]
27
+ a.gibbler
28
+ a.gibbler_revert!
29
+ #=> '4192d4cb59975813f117a51dcd4454ac16df6703'
30
+
31
+
@@ -0,0 +1,31 @@
1
+ require 'gibbler'
2
+ require 'gibbler/history'
3
+
4
+
5
+ # "raises exception when reverting to unknown gibble"
6
+ begin
7
+ a = {}
8
+ a.gibbler_commit
9
+ a.gibbler_revert! '2222222222222222222222222222222222222222'
10
+ rescue Gibbler::BadDigest
11
+ :success
12
+ end
13
+ #=> :success
14
+
15
+ # "raises exception when reverting and there's no history"
16
+ begin
17
+ a = []
18
+ a.gibbler_revert!
19
+ rescue Gibbler::NoHistory
20
+ :success
21
+ end
22
+ #=> :success
23
+
24
+ # "raises exception when reverting an unsupported object"
25
+ begin
26
+ :kimmy.gibbler_revert!
27
+ rescue NoMethodError
28
+ :success
29
+ end
30
+ #=> :success
31
+
@@ -0,0 +1,82 @@
1
+ ## DISABLED. Tryouts 2.0 doesn't do performance
2
+ ##
3
+ #
4
+ # library :gibbler, File.dirname(__FILE__), '..', 'lib'
5
+ # group "Performance"
6
+ #
7
+ # tryouts "Speed", :benchmark do
8
+ # # NOTE: gibbler is slower when history is enabled.
9
+ # drill "Setup variables" do
10
+ # @@array = (1..1000).map { rand }
11
+ # values = (1..1000).map { rand }
12
+ # zipped = @@array.zip(values)
13
+ # @@hash = Hash[*zipped]
14
+ # end
15
+ #
16
+ # drill "Array#hash", 5 do
17
+ # @@array.hash
18
+ # end
19
+ #
20
+ #
21
+ # # dream :mean, 0.21
22
+ # drill "Array#gibbler", 5 do
23
+ # @@array.gibbler
24
+ # end
25
+ #
26
+ # drill "Hash#hash", 5 do
27
+ # @@hash.hash
28
+ # end
29
+ #
30
+ # # dream :mean, 1.4
31
+ # drill "Hash#gibbler", 5 do
32
+ # @@hash.gibbler
33
+ # end
34
+ #
35
+ # end
36
+ #
37
+ # repetitions = 10 # at 100_000 hash shows errors
38
+ # sample_size = 1..100
39
+ #
40
+ # tryouts "Uniqueness", :api do
41
+ #
42
+ # drill "Array#hash, all unique", 0 do
43
+ # seen = []
44
+ # repetitions.times do
45
+ # srand
46
+ # seen << ((sample_size).map { rand }).hash
47
+ # end
48
+ # seen.size - seen.uniq.size
49
+ # end
50
+ #
51
+ # drill "Hash#hash, all unique", 0 do
52
+ # seen = []
53
+ # repetitions.times do
54
+ # srand
55
+ # seen << Hash[*(sample_size).map { rand }.zip((sample_size).map { rand })].hash
56
+ # end
57
+ # seen.size - seen.uniq.size
58
+ # end
59
+ #
60
+ # drill "Array#gibbler, all unique", 0 do
61
+ # seen = []
62
+ # repetitions.times do
63
+ # srand
64
+ # seen << ((sample_size).map { rand }).gibbler
65
+ # end
66
+ # seen.size - seen.uniq.size
67
+ # end
68
+ #
69
+ # drill "Hash#gibbler, all unique", 0 do
70
+ # seen = []
71
+ # repetitions.times do
72
+ # srand
73
+ # seen << Hash[*(sample_size).map { rand }.zip((sample_size).map { rand })].gibbler
74
+ # end
75
+ # seen.size - seen.uniq.size
76
+ # end
77
+ #
78
+ #
79
+ #
80
+ #
81
+ #
82
+ # end
@@ -0,0 +1,47 @@
1
+ require 'gibbler/aliases'
2
+ require 'gibbler/history'
3
+
4
+
5
+ # "has digest"
6
+ :kimmy.gibbler == :kimmy.digest
7
+ #=> true
8
+
9
+ # "has digest_cache", true
10
+ a = :kimmy.gibbler
11
+ a.gibbler_cache == a.digest_cache
12
+ #=> true
13
+
14
+ # "has changed?"
15
+ a = "kimmy"
16
+ a.digest
17
+ a << '+ dj'
18
+ a.gibbled?
19
+ #=> true
20
+
21
+ # "can convert short digest into long"
22
+ a = { :magic => :original }
23
+ g = a.commit.short
24
+ a.find_long g
25
+ #=> "d7049916ddb25e6cc438b1028fb957e5139f9910"
26
+
27
+ # "can return most recent stamp"
28
+ a = { :magic => :original }
29
+ a.commit
30
+ a.stamp.class
31
+ #=> Time
32
+
33
+ # "can return history"
34
+ a = { :magic => :original }
35
+ a.commit
36
+ a[:magic] = :changed
37
+ a.commit
38
+ a.history
39
+ #=> ["d7049916ddb25e6cc438b1028fb957e5139f9910", "0b11c377fccd44554a601e5d2b135c46dc1c4cb1"]
40
+
41
+ # "can return history (short)"
42
+ a = { :magic => :original }
43
+ a.commit
44
+ a[:magic] = :changed
45
+ a.commit
46
+ a.history(:short)
47
+ #=> ["d7049916", "0b11c377"]
metadata CHANGED
@@ -1,7 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gibbler
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.4
4
+ hash: 53
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 8
9
+ - 5
10
+ version: 0.8.5
5
11
  platform: ruby
6
12
  authors:
7
13
  - Delano Mandelbaum
@@ -9,19 +15,25 @@ autorequire:
9
15
  bindir: bin
10
16
  cert_chain: []
11
17
 
12
- date: 2010-06-19 00:00:00 -04:00
18
+ date: 2010-12-23 00:00:00 -05:00
13
19
  default_executable:
14
20
  dependencies:
15
21
  - !ruby/object:Gem::Dependency
16
22
  name: attic
17
- type: :runtime
18
- version_requirement:
19
- version_requirements: !ruby/object:Gem::Requirement
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
20
26
  requirements:
21
27
  - - ">="
22
28
  - !ruby/object:Gem::Version
29
+ hash: 15
30
+ segments:
31
+ - 0
32
+ - 4
33
+ - 0
23
34
  version: 0.4.0
24
- version:
35
+ type: :runtime
36
+ version_requirements: *id001
25
37
  description: "Gibbler: Git-like hashes for Ruby objects"
26
38
  email: delano@solutious.com
27
39
  executables: []
@@ -29,47 +41,70 @@ executables: []
29
41
  extensions: []
30
42
 
31
43
  extra_rdoc_files:
32
- - README.rdoc
33
44
  - LICENSE.txt
45
+ - README.rdoc
34
46
  files:
35
47
  - CHANGES.txt
36
48
  - LICENSE.txt
37
49
  - README.rdoc
38
50
  - Rakefile
51
+ - VERSION.yml
39
52
  - gibbler.gemspec
40
53
  - lib/gibbler.rb
41
54
  - lib/gibbler/aliases.rb
42
55
  - lib/gibbler/history.rb
43
56
  - lib/gibbler/mixins.rb
57
+ - try/01_mixins_try.rb
58
+ - try/02_compat_try.rb
59
+ - try/05_gibbler_digest_try.rb
60
+ - try/10_basic_try.rb
61
+ - try/11_basic_sha256_try.rb
62
+ - try/14_extended_try.rb
63
+ - try/15_file_try.rb
64
+ - try/16_uri_try.rb
65
+ - try/17_complex_object_try.rb
66
+ - try/18_proc_try.rb
67
+ - try/20_time_try.rb
68
+ - try/30_secret_try.rb
69
+ - try/50_history_try.rb
70
+ - try/51_hash_history_try.rb
71
+ - try/52_array_history_try.rb
72
+ - try/53_string_history_try.rb
73
+ - try/57_arbitrary_history_try.rb
74
+ - try/59_history_exceptions_try.rb
75
+ - try/80_performance_try.rb
76
+ - try/90_alias_try.rb
44
77
  has_rdoc: true
45
78
  homepage: http://github.com/delano/gibbler
46
79
  licenses: []
47
80
 
48
81
  post_install_message:
49
82
  rdoc_options:
50
- - --line-numbers
51
- - --title
52
- - "Gibbler: Git-like hashes for Ruby objects"
53
- - --main
54
- - README.rdoc
83
+ - --charset=UTF-8
55
84
  require_paths:
56
85
  - lib
57
86
  required_ruby_version: !ruby/object:Gem::Requirement
87
+ none: false
58
88
  requirements:
59
89
  - - ">="
60
90
  - !ruby/object:Gem::Version
91
+ hash: 3
92
+ segments:
93
+ - 0
61
94
  version: "0"
62
- version:
63
95
  required_rubygems_version: !ruby/object:Gem::Requirement
96
+ none: false
64
97
  requirements:
65
98
  - - ">="
66
99
  - !ruby/object:Gem::Version
100
+ hash: 3
101
+ segments:
102
+ - 0
67
103
  version: "0"
68
- version:
69
104
  requirements: []
70
105
 
71
106
  rubyforge_project: gibbler
72
- rubygems_version: 1.3.5
107
+ rubygems_version: 1.3.7
73
108
  signing_key:
74
109
  specification_version: 3
75
110
  summary: "Gibbler: Git-like hashes for Ruby objects"