attr_encodable 0.1.2 → 0.1.3
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.
@@ -3,11 +3,11 @@ module Encodable
|
|
3
3
|
module ClassMethods
|
4
4
|
def attr_encodable(*attributes)
|
5
5
|
options = extract_encodable_options!(attributes)
|
6
|
-
|
7
|
-
unless @encodable_whitelist_started
|
6
|
+
unless @encodable_whitelist_started && @encodable_whitelist_started.key?(options[:as])
|
8
7
|
# Since we're white-listing, make sure we black-list every attribute to begin with
|
9
8
|
unencodable_attributes(options[:as]).push *column_names.map(&:to_sym)
|
10
|
-
@encodable_whitelist_started
|
9
|
+
@encodable_whitelist_started ||= {}
|
10
|
+
@encodable_whitelist_started[options[:as]] = true
|
11
11
|
end
|
12
12
|
|
13
13
|
attributes.each do |attribute|
|
@@ -21,7 +21,8 @@ module Encodable
|
|
21
21
|
end
|
22
22
|
|
23
23
|
if options[:as] != :default
|
24
|
-
|
24
|
+
columns = default_attributes(options[:as]).reject{|attribute| !column_names.include?(attribute.to_s)}
|
25
|
+
scope options[:as], select(columns.map {|column| "#{table_name}.#{column}" })
|
25
26
|
end
|
26
27
|
end
|
27
28
|
|
@@ -74,7 +75,7 @@ module Encodable
|
|
74
75
|
private
|
75
76
|
def extract_encodable_options!(attributes)
|
76
77
|
begin
|
77
|
-
attributes.last.assert_valid_keys(:
|
78
|
+
attributes.last.assert_valid_keys(:as, :prefix)
|
78
79
|
options = attributes.extract_options!
|
79
80
|
rescue ArgumentError
|
80
81
|
end if attributes.last.is_a?(Hash)
|
data/spec/attr_encodable_spec.rb
CHANGED
@@ -68,31 +68,31 @@ describe Encodable do
|
|
68
68
|
User.attr_encodable :id, :first_name
|
69
69
|
User.unencodable_attributes(:default).map(&:to_s).should == ['foo', 'bar', 'baz'] + User.column_names - ['id', 'first_name']
|
70
70
|
end
|
71
|
-
|
71
|
+
|
72
72
|
describe "at the parent model level" do
|
73
73
|
it "should not mess with to_json unless when attr_encodable and attr_unencodable are not set" do
|
74
74
|
@user.as_json.should == @user.attributes
|
75
75
|
end
|
76
|
-
|
76
|
+
|
77
77
|
it "should not mess with :include options" do
|
78
78
|
@user.as_json(:include => :permissions).should == @user.attributes.merge(:permissions => @user.permissions.as_json)
|
79
79
|
end
|
80
|
-
|
80
|
+
|
81
81
|
it "should not mess with :methods options" do
|
82
82
|
@user.as_json(:methods => :foobar).should == @user.attributes.merge(:foobar => "baz")
|
83
83
|
end
|
84
|
-
|
84
|
+
|
85
85
|
it "should allow me to whitelist attributes" do
|
86
86
|
User.attr_encodable :login, :first_name, :last_name
|
87
87
|
@user.as_json.should == @user.attributes.slice('login', 'first_name', 'last_name')
|
88
88
|
end
|
89
|
-
|
89
|
+
|
90
90
|
it "should allow me to blacklist attributes" do
|
91
91
|
User.attr_unencodable :login, :first_name, :last_name
|
92
92
|
@user.as_json.should == @user.attributes.except('login', 'first_name', 'last_name')
|
93
93
|
end
|
94
|
-
|
95
|
-
|
94
|
+
|
95
|
+
|
96
96
|
# Of note is the INSANITY of ActiveRecord in that it applies :only / :except to :include as well. Which is
|
97
97
|
# obviously insane. Similarly, it doesn't allow :methods to come along when :only is specified. Good god, what
|
98
98
|
# a shame.
|
@@ -100,33 +100,33 @@ describe Encodable do
|
|
100
100
|
User.attr_encodable :login, :first_name, :last_name
|
101
101
|
@user.as_json(:include => :permissions).should == @user.attributes.slice('login', 'first_name', 'last_name').merge(:permissions => @user.permissions.as_json)
|
102
102
|
end
|
103
|
-
|
103
|
+
|
104
104
|
it "should allow me to blacklist attributes without messing with :include and :methods" do
|
105
105
|
User.attr_unencodable :login, :first_name, :last_name
|
106
106
|
@user.as_json(:include => :permissions, :methods => :foobar).should == @user.attributes.except('login', 'first_name', 'last_name').merge(:permissions => @user.permissions.as_json, :foobar => "baz")
|
107
107
|
end
|
108
|
-
|
108
|
+
|
109
109
|
it "should not screw with :include if it's a hash" do
|
110
110
|
User.attr_unencodable :login, :first_name, :last_name
|
111
111
|
@user.as_json(:include => {:permissions => {:methods => :hello, :except => :id}}, :methods => :foobar).should == @user.attributes.except('login', 'first_name', 'last_name').merge(:permissions => @user.permissions.as_json(:methods => :hello, :except => :id), :foobar => "baz")
|
112
112
|
end
|
113
113
|
end
|
114
|
-
|
114
|
+
|
115
115
|
describe "at the child model level when the parent model has attr_encodable set" do
|
116
116
|
before :each do
|
117
117
|
User.attr_encodable :login, :first_name, :last_name
|
118
118
|
end
|
119
|
-
|
119
|
+
|
120
120
|
it "should not mess with to_json unless when attr_encodable and attr_unencodable are not set on the child, but are on the parent" do
|
121
121
|
@user.permissions.as_json.should == @user.permissions.map(&:attributes)
|
122
122
|
end
|
123
|
-
|
123
|
+
|
124
124
|
it "should not mess with :include options" do
|
125
125
|
# This is testing that the implicit ban on the :id attribute from User.attr_encodable is not
|
126
126
|
# applying to serialization of permissions
|
127
127
|
@user.as_json(:include => :permissions)[:permissions].first['id'].should_not be_nil
|
128
128
|
end
|
129
|
-
|
129
|
+
|
130
130
|
it "should inherit any attr_encodable options from the child model" do
|
131
131
|
User.attr_encodable :id
|
132
132
|
Permission.attr_encodable :name
|
@@ -145,33 +145,33 @@ describe Encodable do
|
|
145
145
|
# @user.as_json.should == @user.attributes.except('login', 'first_name', 'last_name')
|
146
146
|
# end
|
147
147
|
end
|
148
|
-
|
148
|
+
|
149
149
|
it "should let me specify automatic includes as well as attributes" do
|
150
150
|
User.attr_encodable :login, :first_name, :id, :permissions
|
151
151
|
@user.as_json.should == @user.attributes.slice('login', 'first_name', 'id').merge(:permissions => @user.permissions.as_json)
|
152
152
|
end
|
153
|
-
|
153
|
+
|
154
154
|
it "should let me specify methods as well as attributes" do
|
155
155
|
User.attr_encodable :login, :first_name, :id, :foobar
|
156
156
|
@user.as_json.should == @user.attributes.slice('login', 'first_name', 'id').merge(:foobar => "baz")
|
157
157
|
end
|
158
|
-
|
158
|
+
|
159
159
|
it "should allow me to only request certain whitelisted attributes and methods" do
|
160
160
|
User.attr_encodable :login, :first_name, :last_name, :foobar
|
161
161
|
@user.as_json(:only => [:login, :foobar]).should == {'login' => 'flipsasser', :foobar => 'baz'}
|
162
162
|
end
|
163
|
-
|
163
|
+
|
164
164
|
it "should allow me to use :only with aliased methods and attributes" do
|
165
165
|
User.attr_encodable :login => :login_eh, :first_name => :foist, :last_name => :last, :foobar => :baz
|
166
166
|
@user.as_json(:only => [:login, :foobar]).should == {'login_eh' => 'flipsasser', 'baz' => 'baz'}
|
167
167
|
end
|
168
|
-
|
168
|
+
|
169
169
|
describe "reassigning" do
|
170
170
|
it "should let me reassign attributes" do
|
171
171
|
User.attr_encodable :id => :identifier
|
172
172
|
@user.as_json.should == {'identifier' => @user.id}
|
173
173
|
end
|
174
|
-
|
174
|
+
|
175
175
|
it "should let me reassign attributes alongside regular attributes" do
|
176
176
|
User.attr_encodable :login, :last_name, :id => :identifier
|
177
177
|
@user.as_json.should == {'identifier' => 1, 'login' => 'flipsasser', 'last_name' => 'sasser'}
|
@@ -181,29 +181,29 @@ describe Encodable do
|
|
181
181
|
User.attr_encodable :id => :identifier, :first_name => :foobar
|
182
182
|
@user.as_json.should == {'identifier' => 1, 'foobar' => 'flip'}
|
183
183
|
end
|
184
|
-
|
184
|
+
|
185
185
|
it "should let me reassign :methods" do
|
186
186
|
User.attr_encodable :foobar => :w00t
|
187
187
|
@user.as_json.should == {'w00t' => 'baz'}
|
188
188
|
end
|
189
|
-
|
189
|
+
|
190
190
|
it "should let me reassign :include" do
|
191
191
|
User.attr_encodable :permissions => :deez_permissions
|
192
192
|
@user.as_json.should == {'deez_permissions' => @user.permissions.as_json}
|
193
193
|
end
|
194
|
-
|
194
|
+
|
195
195
|
it "should let me specify a prefix to a set of attr_encodable's" do
|
196
196
|
User.attr_encodable :id, :first_name, :foobar, :permissions, :prefix => :t
|
197
197
|
@user.as_json.should == {'t_id' => @user.id, 't_first_name' => @user.first_name, 't_foobar' => 'baz', 't_permissions' => @user.permissions.as_json}
|
198
198
|
end
|
199
199
|
end
|
200
|
-
|
200
|
+
|
201
201
|
it "should propagate down subclasses as well" do
|
202
202
|
User.attr_encodable :name
|
203
203
|
class SubUser < User; end
|
204
204
|
SubUser.unencodable_attributes.should == User.unencodable_attributes
|
205
205
|
end
|
206
|
-
|
206
|
+
|
207
207
|
describe "named groups" do
|
208
208
|
it "should be supported on a class-basis with a :name option" do
|
209
209
|
User.attr_unencodable :id
|
@@ -211,13 +211,13 @@ describe Encodable do
|
|
211
211
|
User.attr_encodable :id, :first_name, :last_name, :as => :short
|
212
212
|
User.all.as_json(:short).should == [{'id' => 1, 'first_name' => 'flip', 'last_name' => 'sasser'}]
|
213
213
|
end
|
214
|
-
|
214
|
+
|
215
215
|
it "should be supported on an instance-basis with a :name option" do
|
216
216
|
User.attr_encodable :id, :first_name, :last_name, :as => :short
|
217
217
|
@user.as_json.should == @user.attributes
|
218
218
|
@user.as_json(:short).should == {'id' => 1, 'first_name' => 'flip', 'last_name' => 'sasser'}
|
219
219
|
end
|
220
|
-
|
220
|
+
|
221
221
|
it "should also create a named_scope that limits the SELECT statement to the included attributes" do
|
222
222
|
User.attr_encodable :id, :as => :short
|
223
223
|
User.first.first_name.should == 'flip'
|
@@ -225,4 +225,35 @@ describe Encodable do
|
|
225
225
|
User.short.first.id.should == 1
|
226
226
|
end
|
227
227
|
end
|
228
|
+
|
229
|
+
describe "additive changes" do
|
230
|
+
it "should allow me to add columns after defining a default group" do
|
231
|
+
User.attr_encodable :id
|
232
|
+
@user.as_json.should == {'id' => 1}
|
233
|
+
User.attr_encodable :first_name
|
234
|
+
@user.as_json.should == {'id' => 1, 'first_name' => 'flip'}
|
235
|
+
end
|
236
|
+
|
237
|
+
it "should allow me to add columns after defining an alias" do
|
238
|
+
User.attr_encodable :id => :slug
|
239
|
+
@user.as_json.should == {'slug' => 1}
|
240
|
+
User.attr_encodable :first_name
|
241
|
+
@user.as_json.should == {'slug' => 1, 'first_name' => 'flip'}
|
242
|
+
end
|
243
|
+
|
244
|
+
it "should allow me to add columns after defining a group named 'other'" do
|
245
|
+
User.attr_encodable :id, :as => :other
|
246
|
+
@user.as_json(:other).should == {'id' => 1}
|
247
|
+
User.attr_encodable :first_name, :as => :other
|
248
|
+
@user.as_json(:other).should == {'id' => 1, 'first_name' => 'flip'}
|
249
|
+
end
|
250
|
+
|
251
|
+
it "should allow me to add columns after defining an alias on a group named 'other'" do
|
252
|
+
User.attr_encodable({:id => :slug}, :as => :other)
|
253
|
+
User.default_attributes(:other).should == [:id]
|
254
|
+
@user.as_json(:other).should == {'slug' => 1}
|
255
|
+
User.attr_encodable :first_name, :as => :other
|
256
|
+
@user.as_json(:other).should == {'slug' => 1, 'first_name' => 'flip'}
|
257
|
+
end
|
258
|
+
end
|
228
259
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: attr_encodable
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-10-
|
12
|
+
date: 2012-10-24 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rspec
|