blendris 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
data/Manifest CHANGED
@@ -4,7 +4,6 @@ PostInstall.txt
4
4
  README.markdown
5
5
  Rakefile
6
6
  autotest/discover.rb
7
- blendris.gemspec
8
7
  lib/blendris.rb
9
8
  lib/blendris/accessor.rb
10
9
  lib/blendris/errors.rb
data/README.markdown CHANGED
@@ -1,6 +1,6 @@
1
1
  # Blendris #
2
2
 
3
- * http://github.com/alexmchale/blendris
3
+ http://github.com/alexmchale/blendris
4
4
 
5
5
 
6
6
 
@@ -20,13 +20,13 @@ PLEASE DON'T USE IT FOR ANYTHING IMPORTANT YET!!!
20
20
 
21
21
  # REQUIREMENTS #
22
22
 
23
- * Blendris uses the redis RubyGem.
23
+ Blendris uses the redis RubyGem.
24
24
 
25
25
 
26
26
 
27
27
  # INSTALL #
28
28
 
29
- * gem install blendris
29
+ gem install blendris
30
30
 
31
31
 
32
32
 
data/Rakefile CHANGED
@@ -9,7 +9,7 @@ require "redis"
9
9
  require "fileutils"
10
10
  require "./lib/blendris"
11
11
 
12
- Echoe.new("blendris", "0.0.2") do |p|
12
+ Echoe.new("blendris", "0.0.3") do |p|
13
13
 
14
14
  p.description = "A redis library for Ruby"
15
15
  p.url = "http://github.com/alexmchale/blendris"
data/blendris.gemspec CHANGED
@@ -2,16 +2,16 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = %q{blendris}
5
- s.version = "0.0.2"
5
+ s.version = "0.0.3"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
8
8
  s.authors = ["Alex McHale"]
9
9
  s.cert_chain = ["/Users/amchale/Dropbox/Security/gem-public_cert.pem"]
10
- s.date = %q{2010-02-11}
10
+ s.date = %q{2010-02-15}
11
11
  s.description = %q{A redis library for Ruby}
12
12
  s.email = %q{alexmchale@gmail.com}
13
13
  s.extra_rdoc_files = ["README.markdown", "lib/blendris.rb", "lib/blendris/accessor.rb", "lib/blendris/errors.rb", "lib/blendris/integer.rb", "lib/blendris/list.rb", "lib/blendris/model.rb", "lib/blendris/node.rb", "lib/blendris/reference.rb", "lib/blendris/reference_base.rb", "lib/blendris/reference_set.rb", "lib/blendris/set.rb", "lib/blendris/string.rb", "lib/blendris/types.rb", "lib/blendris/utils.rb", "tasks/rspec.rake"]
14
- s.files = ["History.txt", "Manifest", "PostInstall.txt", "README.markdown", "Rakefile", "autotest/discover.rb", "blendris.gemspec", "lib/blendris.rb", "lib/blendris/accessor.rb", "lib/blendris/errors.rb", "lib/blendris/integer.rb", "lib/blendris/list.rb", "lib/blendris/model.rb", "lib/blendris/node.rb", "lib/blendris/reference.rb", "lib/blendris/reference_base.rb", "lib/blendris/reference_set.rb", "lib/blendris/set.rb", "lib/blendris/string.rb", "lib/blendris/types.rb", "lib/blendris/utils.rb", "script/console", "script/destroy", "script/generate", "spec/list_spec.rb", "spec/model_spec.rb", "spec/redis-tools_spec.rb", "spec/ref_spec.rb", "spec/set_spec.rb", "spec/spec.opts", "spec/spec_helper.rb", "spec/string_spec.rb", "tasks/rspec.rake"]
14
+ s.files = ["History.txt", "Manifest", "PostInstall.txt", "README.markdown", "Rakefile", "autotest/discover.rb", "lib/blendris.rb", "lib/blendris/accessor.rb", "lib/blendris/errors.rb", "lib/blendris/integer.rb", "lib/blendris/list.rb", "lib/blendris/model.rb", "lib/blendris/node.rb", "lib/blendris/reference.rb", "lib/blendris/reference_base.rb", "lib/blendris/reference_set.rb", "lib/blendris/set.rb", "lib/blendris/string.rb", "lib/blendris/types.rb", "lib/blendris/utils.rb", "script/console", "script/destroy", "script/generate", "spec/list_spec.rb", "spec/model_spec.rb", "spec/redis-tools_spec.rb", "spec/ref_spec.rb", "spec/set_spec.rb", "spec/spec.opts", "spec/spec_helper.rb", "spec/string_spec.rb", "tasks/rspec.rake", "blendris.gemspec"]
15
15
  s.homepage = %q{http://github.com/alexmchale/blendris}
16
16
  s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Blendris", "--main", "README.markdown"]
17
17
  s.require_paths = ["lib"]
@@ -1,5 +1,8 @@
1
1
  module Blendris
2
2
 
3
+ # This module serves as a gateway to the Redis library. Any object
4
+ # that needs to access Redis directly should include it.
5
+
3
6
  module RedisAccessor
4
7
 
5
8
  include Utils
@@ -12,10 +15,8 @@ module Blendris
12
15
  $_redis_connection ||= Redis.new
13
16
  end
14
17
 
15
- def prefix
16
- RedisAccessor.prefix
17
- end
18
-
18
+ # Generate a key for the given model class with the given values list.
19
+ # This is used to determine a new object's key in the Model.create method.
19
20
  def generate_key(klass, values)
20
21
  value_index = 0
21
22
 
@@ -41,18 +42,14 @@ module Blendris
41
42
  end.compact.join(":")
42
43
  end
43
44
 
44
- def self.prefix
45
- $_redis_prefix ||= ""
46
- end
47
-
48
- def self.prefix=(prefix)
49
- $_redis_prefix = prefix.to_s
45
+ # Change which database we're accessing in Redis.
46
+ def self.database=(index)
47
+ $_redis_connection = Redis.new(:db => index.to_i)
50
48
  end
51
49
 
52
- def self.flush_keys
53
- redis.keys("#{prefix}*").each do |key|
54
- redis.del key
55
- end
50
+ # This will delete all keys in the current database. Dangerous!
51
+ def self.flushdb
52
+ redis.flushdb
56
53
  end
57
54
 
58
55
  end
@@ -1,5 +1,8 @@
1
1
  module Blendris
2
2
 
3
+ # RedisInteger is a string-value in Redis wrapped up to make
4
+ # sure that it is used as an integer.
5
+
3
6
  class RedisInteger
4
7
 
5
8
  include RedisNode
@@ -7,7 +10,7 @@ module Blendris
7
10
  def self.cast_to_redis(value, options = {})
8
11
  raise TypeError.new("#{value.class.name} is not an integer") unless value.kind_of? Fixnum
9
12
 
10
- value
13
+ value.to_s
11
14
  end
12
15
 
13
16
  def self.cast_from_redis(value, options = {})
data/lib/blendris/list.rb CHANGED
@@ -1,5 +1,7 @@
1
1
  module Blendris
2
2
 
3
+ # RedisList is a wrapper for the Redis LIST data type.
4
+
3
5
  class RedisList
4
6
 
5
7
  include RedisNode
@@ -8,6 +10,7 @@ module Blendris
8
10
  def initialize(key, options = {})
9
11
  @key = key.to_s
10
12
  @options = options
13
+ @on_change = options[:on_change]
11
14
  end
12
15
 
13
16
  def each
@@ -17,10 +20,14 @@ module Blendris
17
20
  end
18
21
 
19
22
  def <<(value)
20
- [ value ].flatten.compact.each do |v|
23
+ values = [ value ].flatten.compact
24
+
25
+ values.flatten.compact.each do |v|
21
26
  redis.rpush key, v
22
27
  end
23
28
 
29
+ notify_changed if values.count > 0
30
+
24
31
  self
25
32
  end
26
33
 
@@ -30,6 +37,8 @@ module Blendris
30
37
 
31
38
  def delete(value)
32
39
  redis.lrem key, 0, value
40
+ ensure
41
+ notify_changed
33
42
  end
34
43
 
35
44
  end
@@ -1,18 +1,29 @@
1
1
  module Blendris
2
2
 
3
+ # Model is the main driver for Blendris. All Blendris objects
4
+ # will inherit from it to function as a database model.
5
+
3
6
  class Model
4
7
 
5
8
  include RedisAccessor
6
9
 
7
10
  attr_reader :key
8
11
 
12
+ # Instantiate a new instance of this model. We do some basic
13
+ # checking to make sure that this object already exists in Redis
14
+ # as the requested type. This is to prevent keys being used in
15
+ # the wrong way.
16
+
17
+ # If the :verify option isn't set to false, then each field of
18
+ # this model is also verified.
19
+
9
20
  def initialize(new_key, options = {})
10
21
  @key = sanitize_key(new_key)
11
- actual_type = constantize(redis.get(prefix + key))
22
+ actual_type = constantize(redis.get(key))
12
23
 
13
24
  raise ArgumentError.new("#{self.class.name} second argument must be a hash") unless options.kind_of? Hash
14
- raise TypeError.new("#{prefix + key} does not exist, not a #{self.class.name} - you may want create instead of new") if !actual_type
15
- raise TypeError.new("#{prefix + key} is a #{actual_type}, not a #{self.class.name}") if actual_type != self.class
25
+ raise TypeError.new("#{key} does not exist, not a #{self.class.name} - you may want create instead of new") if !actual_type
26
+ raise TypeError.new("#{key} is a #{actual_type}, not a #{self.class.name}") if actual_type != self.class
16
27
 
17
28
  if options[:verify] != false
18
29
  parameters = self.class.local_parameters.find_all {|s| s.kind_of? Symbol}
@@ -23,16 +34,21 @@ module Blendris
23
34
  end
24
35
  end
25
36
 
37
+ # An object's id is considered to be the SHA1 digest of its key. This is
38
+ # to ensure that all objects that represent the same key return the same id.
26
39
  def id
27
40
  Digest::SHA1.hexdigest key
28
41
  end
29
42
 
43
+ # TODO: Create the methods in the initialize method instead of depending
44
+ # on method_missing to dispatch to the correct methods. This will make
45
+ # these objects better for mocking and stubbing.
30
46
  def method_missing(method_sym, *arguments)
31
47
  (name, setter) = method_sym.to_s.scan(/(.*[^=])(=)?/).first
32
48
 
33
49
  if node = redis_symbol(name)
34
50
  if setter
35
- return node.set *arguments
51
+ return node.set(*arguments)
36
52
  else
37
53
  return node.get
38
54
  end
@@ -41,6 +57,9 @@ module Blendris
41
57
  super
42
58
  end
43
59
 
60
+ # Look up the given symbol by its name. The list of symbols are defined
61
+ # when the model is declared.
62
+ # TODO: This can also probably go away when I remove the need for method_missing.
44
63
  def redis_symbol(name)
45
64
  subkey = self.subkey(name)
46
65
 
@@ -48,23 +67,44 @@ module Blendris
48
67
 
49
68
  return unless options
50
69
 
51
- options = options.merge(:model => self)
70
+ on_change = lambda { self.fire_on_change_for name }
71
+ options = options.merge(:model => self, :on_change => on_change)
52
72
 
53
73
  options[:type].new subkey, options
54
74
  end
55
75
 
56
- def subkey(key)
57
- sanitize_key "#{self.key}:#{key}"
76
+ # Calculate the key to address the given child node.
77
+ def subkey(child)
78
+ sanitize_key "#{self.key}:#{child}"
58
79
  end
59
80
 
81
+ # Compare two instances. If two instances have the same class and key, they are equal.
60
82
  def ==(other)
61
83
  return false unless self.class == other.class
62
84
  return self.key == other.key
63
85
  end
64
86
 
87
+ # Return a list of field names for this model.
88
+ def fields
89
+ self.class.redis_symbols.map {|name, field| name.to_s}
90
+ end
91
+
92
+ # Fire the list of blocks called when the given symbol changes.
93
+ def fire_on_change_for(symbol)
94
+ blocks = [ self.class.on_change_table[nil], self.class.on_change_table[symbol.to_s] ]
95
+
96
+ blocks.flatten!
97
+ blocks.compact!
98
+
99
+ blocks.each do |block|
100
+ self.instance_exec symbol.to_s, &block
101
+ end
102
+ end
103
+
65
104
  class << self
66
105
 
67
106
  include RedisAccessor
107
+ include Enumerable
68
108
 
69
109
  # This method will instantiate a new object with the correct key
70
110
  # and assign the values passed to it.
@@ -79,13 +119,14 @@ module Blendris
79
119
  end
80
120
 
81
121
  key = generate_key(self, args)
82
- current_model = redis.get(prefix + key)
122
+ current_model = redis.get(key)
83
123
 
84
124
  if current_model && current_model != self.name
85
125
  raise ArgumentError.new("#{key} is a #{current_model}, not a #{self.name}")
86
126
  end
87
127
 
88
- redis.set(prefix + key, self.name)
128
+ redis.set key, self.name
129
+ redis.sadd index_key, key
89
130
 
90
131
  obj = new(key, :verify => false)
91
132
 
@@ -105,6 +146,14 @@ module Blendris
105
146
  nil
106
147
  end
107
148
 
149
+ def each
150
+ RedisSet.new(index_key).each {|k| yield new(k)}
151
+ end
152
+
153
+ def index_key
154
+ "index:model:#{self.name}"
155
+ end
156
+
108
157
  # Defines a new data type for Blendris:Model construction.
109
158
  def type(name, klass)
110
159
  (class << self; self; end).instance_eval do
@@ -136,6 +185,27 @@ module Blendris
136
185
  options[:type].cast_to_redis value, options
137
186
  end
138
187
 
188
+ # Define a block to call when one of the given symbol values changes.
189
+ def on_change(*symbols, &block)
190
+ symbols.flatten!
191
+ symbols.compact!
192
+
193
+ if symbols.count == 0
194
+ on_change_table[nil] ||= []
195
+ on_change_table[nil] << block
196
+ else
197
+ symbols.each do |symbol|
198
+ on_change_table[symbol.to_s] ||= []
199
+ on_change_table[symbol.to_s] << block
200
+ end
201
+ end
202
+ end
203
+
204
+ # The hash of blocks called when fields on this object change.
205
+ def on_change_table
206
+ @on_change_table ||= {}
207
+ end
208
+
139
209
  end
140
210
 
141
211
  end
data/lib/blendris/node.rb CHANGED
@@ -1,16 +1,22 @@
1
1
  module Blendris
2
2
 
3
3
  # RedisNode is used to compose all Redis value wrapper classes.
4
+
4
5
  module RedisNode
5
6
 
6
7
  include RedisAccessor
7
8
 
9
+ attr_reader :key
10
+
8
11
  def initialize(key, options = {})
9
12
  @key = sanitize_key(key)
10
13
  @default = options[:default]
11
14
  @options = options
15
+ @on_change = options[:on_change]
12
16
 
13
- set(@default) if @default && !redis.exists(self.key)
17
+ if @default && !redis.exists(self.key)
18
+ redis.set key, self.class.cast_to_redis(@default, @options)
19
+ end
14
20
  end
15
21
 
16
22
  def set(value)
@@ -19,18 +25,18 @@ module Blendris
19
25
  else
20
26
  redis.del key
21
27
  end
28
+ ensure
29
+ notify_changed
22
30
  end
23
31
 
24
32
  def get
25
33
  self.class.cast_from_redis redis.get(self.key), @options
26
34
  end
27
35
 
28
- def key
29
- prefix + @key
30
- end
31
-
32
36
  def clear
33
37
  redis.del key
38
+ ensure
39
+ notify_changed
34
40
  end
35
41
 
36
42
  def type
@@ -41,6 +47,10 @@ module Blendris
41
47
  redis.exists key
42
48
  end
43
49
 
50
+ def notify_changed
51
+ @on_change.call if @on_change
52
+ end
53
+
44
54
  end
45
55
 
46
56
  end
@@ -1,5 +1,8 @@
1
1
  module Blendris
2
2
 
3
+ # RedisReference is a wrapper to a Redis string value and serves
4
+ # as a pointer to another blendris object.
5
+
3
6
  class RedisReference < RedisReferenceBase
4
7
 
5
8
  include RedisNode
@@ -22,7 +25,10 @@ module Blendris
22
25
  modified = true
23
26
  end
24
27
 
25
- apply_reverse_delete(old_obj) if modified
28
+ if modified
29
+ apply_reverse_delete(old_obj)
30
+ notify_changed
31
+ end
26
32
 
27
33
  obj
28
34
  end
@@ -1,5 +1,8 @@
1
1
  module Blendris
2
2
 
3
+ # RedisReferenceBase holds the methods that are common to
4
+ # RedisReference objects and RedisReferenceSet objects.
5
+
3
6
  class RedisReferenceBase
4
7
 
5
8
  include RedisNode
@@ -10,6 +13,7 @@ module Blendris
10
13
  @key = sanitize_key(key)
11
14
  @reverse = options[:reverse]
12
15
  @options = options
16
+ @on_change = options[:on_change]
13
17
 
14
18
  @klass = options[:class] || Model
15
19
  @klass = constantize(camelize @klass) if @klass.kind_of? String
@@ -52,7 +56,7 @@ module Blendris
52
56
  expect = constantize(expect) if expect.kind_of? String
53
57
  expect = Model unless expect.ancestors.include? Model
54
58
 
55
- klass = constantize(redis.get(prefix + refkey)) if refkey
59
+ klass = constantize(redis.get(refkey)) if refkey
56
60
 
57
61
  if klass == nil
58
62
  nil
@@ -1,5 +1,8 @@
1
1
  module Blendris
2
2
 
3
+ # RedisReferenceSet is a wrapper to a Redis set value and serves
4
+ # as a pointer to multiple other blendris objects.
5
+
3
6
  class RedisReferenceSet < RedisReferenceBase
4
7
 
5
8
  include RedisNode
@@ -9,6 +12,7 @@ module Blendris
9
12
  @refs ||= RedisSet.new(@key)
10
13
  end
11
14
 
15
+ # TODO set should be a real set, while << appends
12
16
  def set(*objs)
13
17
  objs.flatten!
14
18
  objs.compact!
@@ -20,6 +24,8 @@ module Blendris
20
24
  end
21
25
  end
22
26
 
27
+ notify_changed if objs.count > 0
28
+
23
29
  self
24
30
  end
25
31
  alias :<< :set
@@ -28,6 +34,7 @@ module Blendris
28
34
  if refkey = self.class.cast_to_redis(obj, @options)
29
35
  deleted = refs.delete(refkey)
30
36
  apply_reverse_delete(obj) if deleted
37
+ notify_changed
31
38
  deleted
32
39
  end
33
40
  end
data/lib/blendris/set.rb CHANGED
@@ -1,5 +1,7 @@
1
1
  module Blendris
2
2
 
3
+ # RedisSet is a wrapper to the Redis SET data type.
4
+
3
5
  class RedisSet
4
6
 
5
7
  include RedisNode
@@ -8,6 +10,7 @@ module Blendris
8
10
  def initialize(key, options = {})
9
11
  @key = key.to_s
10
12
  @options = options
13
+ @on_change = options[:on_change]
11
14
  end
12
15
 
13
16
  def each
@@ -24,6 +27,8 @@ module Blendris
24
27
  end
25
28
 
26
29
  self
30
+ ensure
31
+ notify_changed
27
32
  end
28
33
 
29
34
  def get
@@ -32,6 +37,8 @@ module Blendris
32
37
 
33
38
  def delete(value)
34
39
  redis.srem key, value
40
+ ensure
41
+ notify_changed
35
42
  end
36
43
 
37
44
  end
@@ -1,5 +1,7 @@
1
1
  module Blendris
2
2
 
3
+ # RedisString is a wrapper to the Redis string data type.
4
+
3
5
  class RedisString
4
6
 
5
7
  include RedisNode
@@ -1,5 +1,7 @@
1
1
  module Blendris
2
2
 
3
+ # Define what types are built into blendris models.
4
+
3
5
  class Model
4
6
 
5
7
  type :string, RedisString
@@ -1,5 +1,7 @@
1
1
  module Blendris
2
2
 
3
+ # This module provides a few utility methods that are used throughout Blendris.
4
+
3
5
  module Utils
4
6
 
5
7
  # Method lifted from Rails.
data/spec/model_spec.rb CHANGED
@@ -48,6 +48,21 @@ describe Model do
48
48
  fav.food.should == @onion
49
49
  end
50
50
 
51
+ it "should have a valid list of fields" do
52
+
53
+ fields = %w( name foods )
54
+
55
+ @vegetable.fields.should == fields
56
+
57
+ end
58
+
59
+ it "should use its on_change field correctly" do
60
+ @apple.calories.should == 0
61
+ @apple.description = "good"
62
+ @apple.description = "bad"
63
+ @apple.calories.should == 2
64
+ end
65
+
51
66
  context "with single reference" do
52
67
 
53
68
  it "should reverse to a single reference" do
@@ -177,4 +192,27 @@ describe Model do
177
192
 
178
193
  end
179
194
 
195
+ it "should enumerable all foods" do
196
+ Food.count.should == 5
197
+
198
+ count = 0
199
+
200
+ Food.each do |food|
201
+ count += 1
202
+ food.should be_a(Food)
203
+ end
204
+
205
+ count.should == 5
206
+ end
207
+
208
+ it "should call its on_change method for all fields" do
209
+ o = OnChangeTestModel.create
210
+ lambda { o.string = "test" }.should raise_exception TestEx
211
+ lambda { o.integer = 123 }.should raise_exception TestEx
212
+ lambda { o.set = [1,2,3] }.should raise_exception TestEx
213
+ lambda { o.list = [1,5,8] }.should raise_exception TestEx
214
+ lambda { o.ref = o }.should raise_exception TestEx
215
+ lambda { o.refs << o }.should raise_exception TestEx
216
+ end
217
+
180
218
  end
@@ -5,7 +5,7 @@ describe "redis connection accessor" do
5
5
  it "should connect for reading and writing" do
6
6
  extend RedisAccessor
7
7
 
8
- testkey = prefix + "test-string"
8
+ testkey = "test-string"
9
9
 
10
10
  redis.get(testkey).should == nil
11
11
  redis.set(testkey, "foo").should == true
data/spec/spec_helper.rb CHANGED
@@ -29,6 +29,10 @@ module TestFixtures
29
29
  refs :friends, :class => Food, :reverse => :friends
30
30
  ref :something
31
31
 
32
+ on_change :description do
33
+ self.calories += 1
34
+ end
35
+
32
36
  end
33
37
 
34
38
  class Category < Model
@@ -58,14 +62,29 @@ module TestFixtures
58
62
  refs :sister_sites, :class => Website, :reverse => :sister_sites
59
63
  end
60
64
 
65
+ class OnChangeTestModel < Blendris::Model
66
+ key "fixed"
67
+
68
+ string :string
69
+ integer :integer
70
+ set :set
71
+ list :list
72
+ ref :ref
73
+ refs :refs
74
+
75
+ on_change { raise TestEx.new }
76
+ end
77
+
78
+ class TestEx < Exception; end
79
+
61
80
  end
62
81
 
63
82
  Spec::Runner.configure do |config|
64
83
  include TestFixtures
65
84
 
66
85
  config.before(:each) do
67
- RedisAccessor.prefix = "blendris-spec:"
68
- RedisAccessor.flush_keys
86
+ RedisAccessor.database = 11
87
+ RedisAccessor.flushdb
69
88
 
70
89
  @vegetable = Category.create("vegetable")
71
90
  @onion = Food.create("onion")
@@ -80,7 +99,7 @@ Spec::Runner.configure do |config|
80
99
  end
81
100
 
82
101
  config.after(:each) do
83
- RedisAccessor.flush_keys
102
+ RedisAccessor.flushdb
84
103
  end
85
104
  end
86
105
 
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: blendris
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alex McHale
@@ -30,7 +30,7 @@ cert_chain:
30
30
  V3OoCfxVK/4Dqg==
31
31
  -----END CERTIFICATE-----
32
32
 
33
- date: 2010-02-11 00:00:00 -06:00
33
+ date: 2010-02-15 00:00:00 -06:00
34
34
  default_executable:
35
35
  dependencies: []
36
36
 
@@ -64,7 +64,6 @@ files:
64
64
  - README.markdown
65
65
  - Rakefile
66
66
  - autotest/discover.rb
67
- - blendris.gemspec
68
67
  - lib/blendris.rb
69
68
  - lib/blendris/accessor.rb
70
69
  - lib/blendris/errors.rb
@@ -91,6 +90,7 @@ files:
91
90
  - spec/spec_helper.rb
92
91
  - spec/string_spec.rb
93
92
  - tasks/rspec.rake
93
+ - blendris.gemspec
94
94
  has_rdoc: true
95
95
  homepage: http://github.com/alexmchale/blendris
96
96
  licenses: []
metadata.gz.sig CHANGED
Binary file