active_record-framing 0.1.0.pre.1 → 0.1.0.pre.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: db9fa84eb9a0af089cf82457843e6b46c05178f0dd3679253df766ba17755ec1
4
- data.tar.gz: 37c02526ee91a9fbe029b9f4f740cac732738ddf9c18a189f7b6ba56a2614c10
3
+ metadata.gz: 8dd6c0a413bc426a0a22dee85cb7077ffb21c47fb77e5cf411a47478961002d1
4
+ data.tar.gz: 5c7b93bcd554161bf4020f5f3d3cec8882d31ec0b9da86ef26b72b08f70d146d
5
5
  SHA512:
6
- metadata.gz: 734a4dff29f64d57563c622088256f8e3f12d992d4f4943c8eec959e47bab3e0ce91cf4058691e7b7a391cc98a4d35b689ec95c5ac6d15d13bdd69c5cb99fa04
7
- data.tar.gz: 3abe8e57cf9d98312ab3e651fe48964854a03bb68e1577755249ad0dd33ba4dee615246229acf5c299d4593e8ea44ede1115a309b1de721ea259b5e7a02145f4
6
+ metadata.gz: 04f3c99ff11c241b3a0915d06e4c32cf171bd31b18314ac23f7c2536ad8d35aefaac73bdcfe4cbb4c6476a04db3bfcf03fdbde902865ea8dc761671d9894efed
7
+ data.tar.gz: b19fcf8ef79262680551b65f0dffe47d5c0cb2b1216d5c7c149dd7d7037067f3b5785dd87d2aa6d5ce0dc8d749d440f0864a6c4360b7bf1d30273475d42f0ebb
data/CHANGELOG.md CHANGED
@@ -1,53 +1,4 @@
1
- # DeletedAt
1
+ # ActiveRecord::Framing
2
2
 
3
- ## 0.5.0 _(June 25, 2018)_
4
- - Removed use of invasive views in preference of sub-selects
5
- - Dropped support for Ruby 2.0, 2.1, 2.2
6
- - Dropped support for Rails 4.1
7
- - Default `active_record-framing` options using `Proc`
8
-
9
- ## 0.4.0 _(Never Released)_
10
- - Specs for Rails 4.0-5.1
11
- - Uses `combustion` gem for cleaner and more comprehensive testing
12
- - Added badges to ReadMe
13
- - Using `:prepend` to leverage ancestry chain
14
- - Add logger for internal use
15
- - DRYd up init code
16
- - Removed partially supported features
17
- - Added DSL in migrations/schema for adding `active_record-framing` timestamps to tables
18
-
19
- ## 0.3.0 _(May 10, 2017)_
20
- - Add specs
21
- - Clean up dependencies
22
- - Auto-init models after installing views
23
- - Remove chained `create` methods
24
-
25
- ## 0.2.6 _(April 06, 2017)_
26
- - Add warning when no DB connection present
27
-
28
- ## 0.2.5 _(March 28, 2017)_
29
- - Extract injections to `.load` method
30
-
31
- ## 0.2.4 _(February 03, 2017)_
32
- - Use `becomes` to mask `::All` etc classes
33
-
34
- ## 0.2.3 _(February 03, 2017)_
35
- - Chain `create!` method to work properly
36
-
37
- ## 0.2.2 _(February 03, 2017)_
38
- - Chain `create` method to work properly
39
-
40
- ## 0.2.1 _(February 03, 2017)_
41
- - More reliable table name handling
42
- - Changed API for installing views (e.g. `destroy_deleted_view`, `uninstall_deleted_view`)
43
-
44
- ## 0.1.1 _(January 31, 2017)_
45
- - Added instructions to readme
46
- - Fixes stack-too-deep edge-case (by moving to `:include` over `:prepend`)
47
-
48
- ## 0.1.0 _(January 30, 2017)_
49
- - Renames primary table to `model_name/all`
50
- - Creates views for each model using `active_record-framing`
51
- - `model_name/deleted`
52
- - `model_name/present`
53
- - Classes created to read from views (`::All`, `::Present`, `::Deleted`)
3
+ ## 0.1.0 _(May 08, 2019)_
4
+ - Initial Release
data/README.md CHANGED
@@ -62,22 +62,6 @@ WITH "admins" AS
62
62
  (SELECT "users".* )
63
63
  ```
64
64
 
65
- If you're starting with a brand-new table, the existing `timestamps` DSL has been extended to accept `deleted_at: true` as an option, for convenience. Or you can do it seperately as shown above.
66
-
67
- ```ruby
68
- class CreatCommentsTable < ActiveRecord::Migration
69
-
70
- def change
71
- create_table :comments do |t|
72
- # ...
73
- # to the `timestamps` DSL
74
- t.timestamps null: false, deleted_at: true
75
- end
76
- end
77
-
78
- end
79
- ```
80
-
81
65
  ## Development
82
66
 
83
67
  After checking out the repo, run `bundle` to install dependencies. Then, run `bundle exec rspec` to run the tests.
@@ -4,12 +4,16 @@ require "active_support/per_thread_registry"
4
4
 
5
5
  module ActiveRecord
6
6
  module Framing
7
- extend ActiveSupport::Concern
8
7
 
9
- included do
10
- include Default
11
- include Named
12
- include AttributeMethods
8
+ def self.prepended(subclass)
9
+ subclass.class_eval do
10
+ singleton_class.alias_method :unframed_all, :all
11
+ end
12
+
13
+ subclass.include Default
14
+ subclass.extend Named
15
+ subclass.include AttributeMethods
16
+ subclass.extend ClassMethods
13
17
  end
14
18
 
15
19
  module ClassMethods # :nodoc:
@@ -34,7 +34,7 @@ module ActiveRecord
34
34
  # Post.limit(10) # Fires "SELECT * FROM posts LIMIT 10"
35
35
  # }
36
36
  def unframed
37
- block_given? ? relation.framing { yield } : relation
37
+ block_given? ? unframed_all.framing { yield } : unframed_all
38
38
  end
39
39
 
40
40
  # Are there attributes associated with this frame?
@@ -116,12 +116,11 @@ module ActiveRecord
116
116
 
117
117
  if default_frame_override
118
118
  # The user has defined their own default frame method, so call that
119
- # evaluate_default_frame do
120
- # if frame = default_frame
121
- # (base_rel ||= relation).merge!(frame)
122
- # end
123
- # end
124
- warn "come back to me!"
119
+ evaluate_default_frame do
120
+ if frame = default_frame
121
+ (base_rel ||= relation).frame!(frame)
122
+ end
123
+ end
125
124
  elsif default_frames.any?
126
125
  # cte_table = arel_table
127
126
  cte_table = Arel::Table.new(table_name)
@@ -4,236 +4,188 @@ module ActiveRecord
4
4
  # = Active Record \Named \Frames
5
5
  module Framing
6
6
  module Named
7
- extend ActiveSupport::Concern
8
7
 
9
- module ClassMethods
10
- # Returns an ActiveRecord::Relation frame object.
11
- #
12
- # posts = Post.all
13
- # posts.size # Fires "select count(*) from posts" and returns the count
14
- # posts.each {|p| puts p.name } # Fires "select * from posts" and loads post objects
15
- #
16
- # fruits = Fruit.all
17
- # fruits = fruits.where(color: 'red') if options[:red_only]
18
- # fruits = fruits.limit(10) if limited?
19
- #
20
- # You can define a frame that applies to all finders using
21
- # {default_frame}[rdoc-ref:Framing::Default::ClassMethods#default_frame].
22
- # def all
23
- # super.tap do |rel|
24
- # if frame = framed_all
25
- # rel.with(frame)
26
- # end
27
- # end
28
- # end
29
-
30
- # alias this method?, framed_all
31
- # def all
32
- # # if current_scope
33
- # # current_scope.clone
34
- # # else
35
- # # default_scoped
36
- # # end
37
- # if current_frame
38
- # puts "#{name} has a current_frame: #{current_frame.to_sql}"
39
- # super.frame(current_frame.clone)
40
- # else
41
- # puts "#{name} is using a default_frame: #{default_framed.to_sql}" if default_framed
42
- # super.frame(default_framed)
43
- # end
44
- # end
45
-
46
- def all
47
- framed_all(super)
48
- end
49
-
50
- def framed_all(rel)
51
- if current_frame = self.current_frame
52
- if self == current_frame.klass
53
- current_frame.clone
54
- else
55
- rel.merge!(current_frame)
56
- end
8
+ # Returns an ActiveRecord::Relation frame object.
9
+ #
10
+ # posts = Post.all
11
+ # posts.size # Fires "select count(*) from posts" and returns the count
12
+ # posts.each {|p| puts p.name } # Fires "select * from posts" and loads post objects
13
+ #
14
+ # fruits = Fruit.all
15
+ # fruits = fruits.where(color: 'red') if options[:red_only]
16
+ # fruits = fruits.limit(10) if limited?
17
+ #
18
+ # You can define a frame that applies to all finders using
19
+ # {default_frame}[rdoc-ref:Framing::Default::ClassMethods#default_frame].
20
+ def all
21
+ rel = unframed_all
22
+ if current_frame = self.current_frame
23
+ if self == current_frame.klass
24
+ current_frame.clone
57
25
  else
58
- default_framed(rel)
26
+ rel.merge!(current_frame)
59
27
  end
28
+ else
29
+ default_framed(rel)
60
30
  end
31
+ end
61
32
 
62
- def const_missing(const_name)
63
- registered_frames[const_name]&.call() || super
64
- end
65
-
66
- def registered_frames
67
- @registered_frames ||= {}
68
- end
69
-
70
- def frame_for_association(frame = relation) # :nodoc:
71
- current_frame = self.current_frame
72
-
73
- if current_frame && current_frame.empty_frame?
74
- frame
75
- else
76
- default_framed(frame)
77
- end
78
- end
33
+ # def default_framed(frame = relation) # :nodoc:
34
+ def default_framed(frame = nil) # :nodoc:
35
+ !ignore_default_frame? && build_default_frame(frame) || frame
36
+ end
79
37
 
80
- # def default_framed(frame = relation) # :nodoc:
81
- def default_framed(frame = nil) # :nodoc:
82
- !ignore_default_frame? && build_default_frame(frame) || frame
38
+ # Adds a class method for retrieving and querying objects.
39
+ # The method is intended to return an ActiveRecord::Relation
40
+ # object, which is composable with other frames.
41
+ # If it returns +nil+ or +false+, an
42
+ # {all}[rdoc-ref:Framing::Named::ClassMethods#all] frame is returned instead.
43
+ #
44
+ # A \frame represents a narrowing of a database query, such as
45
+ # <tt>where(color: :red).select('shirts.*').includes(:washing_instructions)</tt>.
46
+ #
47
+ # class Shirt < ActiveRecord::Base
48
+ # frame :red, -> { where(color: 'red') }
49
+ # frame :dry_clean_only, -> { joins(:washing_instructions).where('washing_instructions.dry_clean_only = ?', true) }
50
+ # end
51
+ #
52
+ # The above calls to #frame define class methods <tt>Shirt.red</tt> and
53
+ # <tt>Shirt::DryCleanOnly</tt>. <tt>Shirt::Red</tt>, in effect,
54
+ # represents the query <tt>Shirt.where(color: 'red')</tt>.
55
+ #
56
+ # You should always pass a callable object to the frames defined
57
+ # with #frame. This ensures that the frame is re-evaluated each
58
+ # time it is called.
59
+ #
60
+ # Note that this is simply 'syntactic sugar' for defining an actual
61
+ # class method:
62
+ #
63
+ # class Shirt < ActiveRecord::Base
64
+ # def self.red
65
+ # where(color: 'red')
66
+ # end
67
+ # end
68
+ #
69
+ # Unlike <tt>Shirt.find(...)</tt>, however, the object returned by
70
+ # <tt>Shirt.red</tt> is not an Array but an ActiveRecord::Relation,
71
+ # which is composable with other frames; it resembles the association object
72
+ # constructed by a {has_many}[rdoc-ref:Associations::ClassMethods#has_many]
73
+ # declaration. For instance, you can invoke <tt>Shirt.red.first</tt>, <tt>Shirt.red.count</tt>,
74
+ # <tt>Shirt.red.where(size: 'small')</tt>. Also, just as with the
75
+ # association objects, named \frames act like an Array, implementing
76
+ # Enumerable; <tt>Shirt.red.each(&block)</tt>, <tt>Shirt.red.first</tt>,
77
+ # and <tt>Shirt.red.inject(memo, &block)</tt> all behave as if
78
+ # <tt>Shirt.red</tt> really was an array.
79
+ #
80
+ # These named \frames are composable. For instance,
81
+ # <tt>Shirt.red.dry_clean_only</tt> will produce all shirts that are
82
+ # both red and dry clean only. Nested finds and calculations also work
83
+ # with these compositions: <tt>Shirt.red.dry_clean_only.count</tt>
84
+ # returns the number of garments for which these criteria obtain.
85
+ # Similarly with <tt>Shirt.red.dry_clean_only.average(:thread_count)</tt>.
86
+ #
87
+ # All frames are available as class methods on the ActiveRecord::Base
88
+ # descendant upon which the \frames were defined. But they are also
89
+ # available to {has_many}[rdoc-ref:Associations::ClassMethods#has_many]
90
+ # associations. If,
91
+ #
92
+ # class Person < ActiveRecord::Base
93
+ # has_many :shirts
94
+ # end
95
+ #
96
+ # then <tt>elton.shirts.red.dry_clean_only</tt> will return all of
97
+ # Elton's red, dry clean only shirts.
98
+ #
99
+ # \Named frames can also have extensions, just as with
100
+ # {has_many}[rdoc-ref:Associations::ClassMethods#has_many] declarations:
101
+ #
102
+ # class Shirt < ActiveRecord::Base
103
+ # frame :red, -> { where(color: 'red') } do
104
+ # def dom_id
105
+ # 'red_shirts'
106
+ # end
107
+ # end
108
+ # end
109
+ #
110
+ # Frames cannot be used while creating/building a record.
111
+ #
112
+ # class Article < ActiveRecord::Base
113
+ # frame :published, -> { where(published: true) }
114
+ # end
115
+ #
116
+ # Article.published.new.published # => nil
117
+ # Article.published.create.published # => nil
118
+ #
119
+ # \Class methods on your model are automatically available
120
+ # on frames. Assuming the following setup:
121
+ #
122
+ # class Article < ActiveRecord::Base
123
+ # frame :published, -> { where(published: true) }
124
+ # frame :featured, -> { where(featured: true) }
125
+ #
126
+ # def self.latest_article
127
+ # order('published_at desc').first
128
+ # end
129
+ #
130
+ # def self.titles
131
+ # pluck(:title)
132
+ # end
133
+ # end
134
+ #
135
+ # We are able to call the methods like this:
136
+ #
137
+ # Article.published.featured.latest_article
138
+ # Article.featured.titles
139
+ def frame(frame_name, body, &block)
140
+ unless body.respond_to?(:call)
141
+ raise ArgumentError, "The frame body needs to be callable."
83
142
  end
84
143
 
85
- # Adds a class method for retrieving and querying objects.
86
- # The method is intended to return an ActiveRecord::Relation
87
- # object, which is composable with other frames.
88
- # If it returns +nil+ or +false+, an
89
- # {all}[rdoc-ref:Framing::Named::ClassMethods#all] frame is returned instead.
90
- #
91
- # A \frame represents a narrowing of a database query, such as
92
- # <tt>where(color: :red).select('shirts.*').includes(:washing_instructions)</tt>.
93
- #
94
- # class Shirt < ActiveRecord::Base
95
- # frame :red, -> { where(color: 'red') }
96
- # frame :dry_clean_only, -> { joins(:washing_instructions).where('washing_instructions.dry_clean_only = ?', true) }
97
- # end
98
- #
99
- # The above calls to #frame define class methods <tt>Shirt.red</tt> and
100
- # <tt>Shirt::DryCleanOnly</tt>. <tt>Shirt::Red</tt>, in effect,
101
- # represents the query <tt>Shirt.where(color: 'red')</tt>.
102
- #
103
- # You should always pass a callable object to the frames defined
104
- # with #frame. This ensures that the frame is re-evaluated each
105
- # time it is called.
106
- #
107
- # Note that this is simply 'syntactic sugar' for defining an actual
108
- # class method:
109
- #
110
- # class Shirt < ActiveRecord::Base
111
- # def self.red
112
- # where(color: 'red')
113
- # end
114
- # end
115
- #
116
- # Unlike <tt>Shirt.find(...)</tt>, however, the object returned by
117
- # <tt>Shirt.red</tt> is not an Array but an ActiveRecord::Relation,
118
- # which is composable with other frames; it resembles the association object
119
- # constructed by a {has_many}[rdoc-ref:Associations::ClassMethods#has_many]
120
- # declaration. For instance, you can invoke <tt>Shirt.red.first</tt>, <tt>Shirt.red.count</tt>,
121
- # <tt>Shirt.red.where(size: 'small')</tt>. Also, just as with the
122
- # association objects, named \frames act like an Array, implementing
123
- # Enumerable; <tt>Shirt.red.each(&block)</tt>, <tt>Shirt.red.first</tt>,
124
- # and <tt>Shirt.red.inject(memo, &block)</tt> all behave as if
125
- # <tt>Shirt.red</tt> really was an array.
126
- #
127
- # These named \frames are composable. For instance,
128
- # <tt>Shirt.red.dry_clean_only</tt> will produce all shirts that are
129
- # both red and dry clean only. Nested finds and calculations also work
130
- # with these compositions: <tt>Shirt.red.dry_clean_only.count</tt>
131
- # returns the number of garments for which these criteria obtain.
132
- # Similarly with <tt>Shirt.red.dry_clean_only.average(:thread_count)</tt>.
133
- #
134
- # All frames are available as class methods on the ActiveRecord::Base
135
- # descendant upon which the \frames were defined. But they are also
136
- # available to {has_many}[rdoc-ref:Associations::ClassMethods#has_many]
137
- # associations. If,
138
- #
139
- # class Person < ActiveRecord::Base
140
- # has_many :shirts
141
- # end
142
- #
143
- # then <tt>elton.shirts.red.dry_clean_only</tt> will return all of
144
- # Elton's red, dry clean only shirts.
145
- #
146
- # \Named frames can also have extensions, just as with
147
- # {has_many}[rdoc-ref:Associations::ClassMethods#has_many] declarations:
148
- #
149
- # class Shirt < ActiveRecord::Base
150
- # frame :red, -> { where(color: 'red') } do
151
- # def dom_id
152
- # 'red_shirts'
153
- # end
154
- # end
155
- # end
156
- #
157
- # Frames cannot be used while creating/building a record.
158
- #
159
- # class Article < ActiveRecord::Base
160
- # frame :published, -> { where(published: true) }
161
- # end
162
- #
163
- # Article.published.new.published # => nil
164
- # Article.published.create.published # => nil
165
- #
166
- # \Class methods on your model are automatically available
167
- # on frames. Assuming the following setup:
168
- #
169
- # class Article < ActiveRecord::Base
170
- # frame :published, -> { where(published: true) }
171
- # frame :featured, -> { where(featured: true) }
172
- #
173
- # def self.latest_article
174
- # order('published_at desc').first
175
- # end
176
- #
177
- # def self.titles
178
- # pluck(:title)
179
- # end
180
- # end
181
- #
182
- # We are able to call the methods like this:
183
- #
184
- # Article.published.featured.latest_article
185
- # Article.featured.titles
186
- def frame(frame_name, body, &block)
187
- unless body.respond_to?(:call)
188
- raise ArgumentError, "The frame body needs to be callable."
189
- end
190
-
191
- constant = frame_name.to_s.classify.to_sym
192
- arel_tn = "#{frame_name}/#{self.table_name}"
144
+ constant = frame_name.to_s.classify.to_sym
145
+ arel_tn = "#{frame_name}/#{self.table_name}"
193
146
 
194
- the_frame = body.respond_to?(:to_proc) ? body : body.method(:call)
195
- cte_relation = relation.merge!(relation.instance_exec(&the_frame) || relation)
147
+ the_frame = body.respond_to?(:to_proc) ? body : body.method(:call)
148
+ cte_relation = relation.merge!(relation.instance_exec(&the_frame) || relation)
196
149
 
197
- # self.const_set constant, Class.new(DelegateClass(self)) do |klass|
198
- delegator = self.name.to_sym
199
- self.const_set(constant, self.dup).class_eval do |klass|
200
- extend SingleForwardable
201
- def_delegator delegator, :type_caster
202
- def_delegator delegator, :table_name
150
+ # self.const_set constant, Class.new(DelegateClass(self)) do |klass|
151
+ delegator = self.name.to_sym
152
+ self.const_set(constant, self.dup).class_eval do |klass|
153
+ # self.const_set constant, Class.new do |klass|
154
+ extend SingleForwardable
155
+ def_delegators delegator, :type_caster, :table_name, :discriminate_class_for_record
203
156
 
204
- klass.default_frames = []
157
+ klass.default_frames = []
205
158
 
206
- @arel_table = klass.arel_table.dup.tap do |at|
207
- at.name = arel_tn
208
- end
209
-
210
- klass.current_frame = build_frame(cte_relation, &block)
159
+ @arel_table = klass.arel_table.dup.tap do |at|
160
+ at.name = arel_tn
211
161
  end
212
162
 
213
- if dangerous_class_const?(constant)
214
- raise ArgumentError, "You tried to define a frame named \"#{constant}\" " \
215
- "on the model \"#{self.constant}\", but Active Record already defined " \
216
- "a class method with the same name."
217
- end
163
+ klass.current_frame = build_frame(cte_relation, &block)
164
+ end
218
165
 
166
+ if dangerous_class_const?(constant)
167
+ raise ArgumentError, "You tried to define a frame named \"#{constant}\" " \
168
+ "on the model \"#{self.constant}\", but Active Record already defined " \
169
+ "a class method with the same name."
219
170
  end
220
171
 
221
- def build_frame(frame, &block)
222
- extension = Module.new(&block) if block
223
- relation.frame!(Arel::Nodes::As.new(arel_table, frame.arel)).tap do |rel|
224
- rel.extending!(extension) if extension
225
- end
172
+ end
173
+
174
+ def build_frame(frame, &block)
175
+ extension = Module.new(&block) if block
176
+ relation.frame!(Arel::Nodes::As.new(arel_table, frame.arel)).tap do |rel|
177
+ rel.extending!(extension) if extension
226
178
  end
179
+ end
227
180
 
228
- private
181
+ private
229
182
 
230
- def valid_frame_name?(name)
231
- if respond_to?(name, true) && logger
232
- logger.warn "Creating frame :#{name}. " \
233
- "Overwriting existing method #{self.name}.#{name}."
234
- end
183
+ def valid_frame_name?(name)
184
+ if respond_to?(name, true) && logger
185
+ logger.warn "Creating frame :#{name}. " \
186
+ "Overwriting existing method #{self.name}.#{name}."
235
187
  end
236
- end
188
+ end
237
189
  end
238
190
  end
239
191
  end
@@ -9,7 +9,7 @@ module ActiveRecord::Framing
9
9
  class Railtie < Rails::Railtie
10
10
  initializer 'active_record-framing.load' do |_app|
11
11
  ActiveSupport.on_load(:active_record) do
12
- ::ActiveRecord::Base.include(ActiveRecord::Framing)
12
+ ::ActiveRecord::Base.prepend(ActiveRecord::Framing)
13
13
  ::ActiveRecord::Relation.prepend(ActiveRecord::Framing::Relation)
14
14
  ::ActiveRecord::Relation.include(ActiveRecord::Framing::QueryMethods)
15
15
  ::ActiveRecord::Relation.prepend(ActiveRecord::Framing::SpawnMethods)
@@ -3,20 +3,6 @@ module ActiveRecord
3
3
  module Framing
4
4
  module Relation
5
5
 
6
- # def arel_without_frames
7
- # klass.ignore_default_frame
8
- # Thread.currently(:without_frames, true) do
9
- # @arel_without_frames ||= build_arel_without_frames
10
- # end
11
- # end
12
-
13
- # def build_arel_without_frames
14
- # @arel, old = nil, @arel
15
- # arel
16
- # ensure
17
- # @arel = old
18
- # end
19
-
20
6
  def build_arel(*)
21
7
  super.tap do |ar|
22
8
  unless ignore_default_frame?
@@ -26,11 +12,6 @@ module ActiveRecord
26
12
  # reflection.klass.type_caster
27
13
  # )
28
14
  build_frames(ar)
29
-
30
- frames_values.each do |k,v|
31
- puts "#{k} => #{v.to_sql}"
32
- end
33
-
34
15
  ar.with(*frames_values.values) if frames_values.any?
35
16
  end
36
17
  end
@@ -1,5 +1,5 @@
1
1
  module ActiveRecord
2
2
  module Framing
3
- VERSION = "0.1.0-1"
3
+ VERSION = "0.1.0-2"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active_record-framing
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0.pre.1
4
+ version: 0.1.0.pre.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dale Stevens