couchrest_model 1.0.0.beta8 → 1.0.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.
- data/.gitignore +9 -0
- data/{spec/spec.opts → .rspec} +0 -1
- data/Gemfile +4 -0
- data/Gemfile.lock +77 -0
- data/README.md +144 -57
- data/Rakefile +12 -43
- data/VERSION +1 -0
- data/couchrest_model.gemspec +35 -0
- data/history.txt +23 -1
- data/init.rb +1 -0
- data/lib/couchrest/model/associations.rb +17 -1
- data/lib/couchrest/model/base.rb +5 -5
- data/lib/couchrest/model/casted_model.rb +2 -2
- data/lib/couchrest/model/class_proxy.rb +6 -0
- data/lib/couchrest/model/collection.rb +3 -0
- data/lib/couchrest/model/configuration.rb +51 -0
- data/lib/couchrest/model/design_doc.rb +2 -5
- data/lib/couchrest/model/document_queries.rb +20 -3
- data/lib/couchrest/model/persistence.rb +15 -1
- data/lib/couchrest/model/properties.rb +97 -23
- data/lib/couchrest/model/property.rb +5 -4
- data/lib/couchrest/model/property_protection.rb +71 -0
- data/lib/couchrest/model/typecast.rb +12 -7
- data/lib/couchrest/model/view.rb +190 -0
- data/lib/couchrest/model/views.rb +3 -3
- data/lib/couchrest/model.rb +1 -1
- data/lib/couchrest/railtie.rb +3 -2
- data/lib/couchrest_model.rb +7 -14
- data/lib/rails/generators/couchrest_model/model/model_generator.rb +2 -1
- data/spec/.gitignore +1 -0
- data/spec/couchrest/base_spec.rb +3 -3
- data/spec/couchrest/casted_model_spec.rb +63 -49
- data/spec/couchrest/class_proxy_spec.rb +6 -0
- data/spec/couchrest/configuration_spec.rb +78 -0
- data/spec/couchrest/persistence_spec.rb +10 -4
- data/spec/couchrest/{attribute_protection_spec.rb → property_protection_spec.rb} +29 -2
- data/spec/couchrest/property_spec.rb +61 -0
- data/spec/couchrest/subclass_spec.rb +2 -2
- data/spec/couchrest/view_spec.rb +6 -0
- data/spec/fixtures/more/article.rb +1 -1
- data/spec/spec_helper.rb +4 -3
- metadata +96 -32
- data/lib/couchrest/model/attribute_protection.rb +0 -74
- data/lib/couchrest/model/attributes.rb +0 -75
@@ -92,8 +92,8 @@ describe "Subclassing a Model" do
|
|
92
92
|
OnlineCourse.design_doc['views'].keys.should_not include('by_title')
|
93
93
|
end
|
94
94
|
|
95
|
-
it "should have an all view with a guard clause for
|
96
|
-
OnlineCourse.design_doc['views']['all']['map'].should =~ /if \(doc\['
|
95
|
+
it "should have an all view with a guard clause for model == subclass name in the map function" do
|
96
|
+
OnlineCourse.design_doc['views']['all']['map'].should =~ /if \(doc\['#{OnlineCourse.model_type_key}'\] == 'OnlineCourse'\)/
|
97
97
|
end
|
98
98
|
end
|
99
99
|
|
data/spec/couchrest/view_spec.rb
CHANGED
@@ -273,6 +273,12 @@ describe "Model views" do
|
|
273
273
|
u = Unattached.first :database=>@db
|
274
274
|
u.title.should =~ /\A...\z/
|
275
275
|
end
|
276
|
+
|
277
|
+
it "should get last" do
|
278
|
+
u = Unattached.last :database=>@db
|
279
|
+
u.title.should == "aaa"
|
280
|
+
end
|
281
|
+
|
276
282
|
it "should barf on all_design_doc_versions if no database given" do
|
277
283
|
lambda{Unattached.all_design_doc_versions}.should raise_error
|
278
284
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
|
+
require "bundler/setup"
|
1
2
|
require "rubygems"
|
2
|
-
require "
|
3
|
+
require "rspec" # Satisfies Autotest and anyone else not using the Rake tasks
|
3
4
|
|
4
5
|
require File.join(File.dirname(__FILE__), '..','lib','couchrest_model')
|
5
6
|
# check the following file to see how to use the spec'd features.
|
@@ -10,7 +11,7 @@ unless defined?(FIXTURE_PATH)
|
|
10
11
|
|
11
12
|
COUCHHOST = "http://127.0.0.1:5984"
|
12
13
|
TESTDB = 'couchrest-model-test'
|
13
|
-
TEST_SERVER = CouchRest.new
|
14
|
+
TEST_SERVER = CouchRest.new COUCHHOST
|
14
15
|
TEST_SERVER.default_database = TESTDB
|
15
16
|
DB = TEST_SERVER.database(TESTDB)
|
16
17
|
end
|
@@ -24,7 +25,7 @@ def reset_test_db!
|
|
24
25
|
DB
|
25
26
|
end
|
26
27
|
|
27
|
-
|
28
|
+
RSpec.configure do |config|
|
28
29
|
config.before(:all) { reset_test_db! }
|
29
30
|
|
30
31
|
config.after(:all) do
|
metadata
CHANGED
@@ -1,14 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: couchrest_model
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
5
|
-
prerelease:
|
4
|
+
hash: 23
|
5
|
+
prerelease:
|
6
6
|
segments:
|
7
7
|
- 1
|
8
8
|
- 0
|
9
9
|
- 0
|
10
|
-
|
11
|
-
version: 1.0.0.beta8
|
10
|
+
version: 1.0.0
|
12
11
|
platform: ruby
|
13
12
|
authors:
|
14
13
|
- J. Chris Anderson
|
@@ -20,7 +19,7 @@ autorequire:
|
|
20
19
|
bindir: bin
|
21
20
|
cert_chain: []
|
22
21
|
|
23
|
-
date:
|
22
|
+
date: 2011-01-16 00:00:00 -02:00
|
24
23
|
default_executable:
|
25
24
|
dependencies:
|
26
25
|
- !ruby/object:Gem::Dependency
|
@@ -31,12 +30,12 @@ dependencies:
|
|
31
30
|
requirements:
|
32
31
|
- - ~>
|
33
32
|
- !ruby/object:Gem::Version
|
34
|
-
hash:
|
33
|
+
hash: 21
|
35
34
|
segments:
|
36
35
|
- 1
|
37
36
|
- 0
|
38
|
-
-
|
39
|
-
version: 1.0.
|
37
|
+
- 1
|
38
|
+
version: 1.0.1
|
40
39
|
type: :runtime
|
41
40
|
version_requirements: *id001
|
42
41
|
- !ruby/object:Gem::Dependency
|
@@ -55,54 +54,101 @@ dependencies:
|
|
55
54
|
type: :runtime
|
56
55
|
version_requirements: *id002
|
57
56
|
- !ruby/object:Gem::Dependency
|
58
|
-
name:
|
57
|
+
name: activemodel
|
59
58
|
prerelease: false
|
60
59
|
requirement: &id003 !ruby/object:Gem::Requirement
|
61
60
|
none: false
|
62
61
|
requirements:
|
63
62
|
- - ~>
|
64
63
|
- !ruby/object:Gem::Version
|
65
|
-
hash:
|
64
|
+
hash: 7
|
66
65
|
segments:
|
67
|
-
- 2
|
68
66
|
- 3
|
69
|
-
-
|
70
|
-
|
67
|
+
- 0
|
68
|
+
- 0
|
69
|
+
version: 3.0.0
|
71
70
|
type: :runtime
|
72
71
|
version_requirements: *id003
|
73
72
|
- !ruby/object:Gem::Dependency
|
74
|
-
name:
|
73
|
+
name: tzinfo
|
75
74
|
prerelease: false
|
76
75
|
requirement: &id004 !ruby/object:Gem::Requirement
|
77
76
|
none: false
|
78
77
|
requirements:
|
79
78
|
- - ~>
|
80
79
|
- !ruby/object:Gem::Version
|
81
|
-
hash:
|
80
|
+
hash: 63
|
82
81
|
segments:
|
83
|
-
- 3
|
84
|
-
- 0
|
85
82
|
- 0
|
86
|
-
-
|
87
|
-
|
83
|
+
- 3
|
84
|
+
- 22
|
85
|
+
version: 0.3.22
|
88
86
|
type: :runtime
|
89
87
|
version_requirements: *id004
|
90
88
|
- !ruby/object:Gem::Dependency
|
91
|
-
name:
|
89
|
+
name: railties
|
92
90
|
prerelease: false
|
93
91
|
requirement: &id005 !ruby/object:Gem::Requirement
|
94
92
|
none: false
|
95
93
|
requirements:
|
96
94
|
- - ~>
|
97
95
|
- !ruby/object:Gem::Version
|
98
|
-
hash:
|
96
|
+
hash: 7
|
99
97
|
segments:
|
100
|
-
- 0
|
101
98
|
- 3
|
102
|
-
-
|
103
|
-
|
99
|
+
- 0
|
100
|
+
- 0
|
101
|
+
version: 3.0.0
|
104
102
|
type: :runtime
|
105
103
|
version_requirements: *id005
|
104
|
+
- !ruby/object:Gem::Dependency
|
105
|
+
name: rspec
|
106
|
+
prerelease: false
|
107
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
108
|
+
none: false
|
109
|
+
requirements:
|
110
|
+
- - ">="
|
111
|
+
- !ruby/object:Gem::Version
|
112
|
+
hash: 15
|
113
|
+
segments:
|
114
|
+
- 2
|
115
|
+
- 0
|
116
|
+
- 0
|
117
|
+
version: 2.0.0
|
118
|
+
type: :runtime
|
119
|
+
version_requirements: *id006
|
120
|
+
- !ruby/object:Gem::Dependency
|
121
|
+
name: rspec
|
122
|
+
prerelease: false
|
123
|
+
requirement: &id007 !ruby/object:Gem::Requirement
|
124
|
+
none: false
|
125
|
+
requirements:
|
126
|
+
- - ">="
|
127
|
+
- !ruby/object:Gem::Version
|
128
|
+
hash: 15
|
129
|
+
segments:
|
130
|
+
- 2
|
131
|
+
- 0
|
132
|
+
- 0
|
133
|
+
version: 2.0.0
|
134
|
+
type: :development
|
135
|
+
version_requirements: *id007
|
136
|
+
- !ruby/object:Gem::Dependency
|
137
|
+
name: rack-test
|
138
|
+
prerelease: false
|
139
|
+
requirement: &id008 !ruby/object:Gem::Requirement
|
140
|
+
none: false
|
141
|
+
requirements:
|
142
|
+
- - ">="
|
143
|
+
- !ruby/object:Gem::Version
|
144
|
+
hash: 5
|
145
|
+
segments:
|
146
|
+
- 0
|
147
|
+
- 5
|
148
|
+
- 7
|
149
|
+
version: 0.5.7
|
150
|
+
type: :development
|
151
|
+
version_requirements: *id008
|
106
152
|
description: CouchRest Model provides aditional features to the standard CouchRest Document class such as properties, view designs, associations, callbacks, typecasting and validations.
|
107
153
|
email: jchris@apache.org
|
108
154
|
executables: []
|
@@ -114,21 +160,27 @@ extra_rdoc_files:
|
|
114
160
|
- README.md
|
115
161
|
- THANKS.md
|
116
162
|
files:
|
163
|
+
- .gitignore
|
164
|
+
- .rspec
|
165
|
+
- Gemfile
|
166
|
+
- Gemfile.lock
|
117
167
|
- LICENSE
|
118
168
|
- README.md
|
119
169
|
- Rakefile
|
120
170
|
- THANKS.md
|
171
|
+
- VERSION
|
172
|
+
- couchrest_model.gemspec
|
121
173
|
- history.txt
|
174
|
+
- init.rb
|
122
175
|
- lib/couchrest/model.rb
|
123
176
|
- lib/couchrest/model/associations.rb
|
124
|
-
- lib/couchrest/model/attribute_protection.rb
|
125
|
-
- lib/couchrest/model/attributes.rb
|
126
177
|
- lib/couchrest/model/base.rb
|
127
178
|
- lib/couchrest/model/callbacks.rb
|
128
179
|
- lib/couchrest/model/casted_array.rb
|
129
180
|
- lib/couchrest/model/casted_model.rb
|
130
181
|
- lib/couchrest/model/class_proxy.rb
|
131
182
|
- lib/couchrest/model/collection.rb
|
183
|
+
- lib/couchrest/model/configuration.rb
|
132
184
|
- lib/couchrest/model/design_doc.rb
|
133
185
|
- lib/couchrest/model/document_queries.rb
|
134
186
|
- lib/couchrest/model/errors.rb
|
@@ -136,6 +188,7 @@ files:
|
|
136
188
|
- lib/couchrest/model/persistence.rb
|
137
189
|
- lib/couchrest/model/properties.rb
|
138
190
|
- lib/couchrest/model/property.rb
|
191
|
+
- lib/couchrest/model/property_protection.rb
|
139
192
|
- lib/couchrest/model/support/couchrest.rb
|
140
193
|
- lib/couchrest/model/support/hash.rb
|
141
194
|
- lib/couchrest/model/typecast.rb
|
@@ -143,21 +196,24 @@ files:
|
|
143
196
|
- lib/couchrest/model/validations/casted_model.rb
|
144
197
|
- lib/couchrest/model/validations/locale/en.yml
|
145
198
|
- lib/couchrest/model/validations/uniqueness.rb
|
199
|
+
- lib/couchrest/model/view.rb
|
146
200
|
- lib/couchrest/model/views.rb
|
147
201
|
- lib/couchrest/railtie.rb
|
148
202
|
- lib/couchrest_model.rb
|
149
203
|
- lib/rails/generators/couchrest_model.rb
|
150
204
|
- lib/rails/generators/couchrest_model/model/model_generator.rb
|
151
205
|
- lib/rails/generators/couchrest_model/model/templates/model.rb
|
206
|
+
- spec/.gitignore
|
152
207
|
- spec/couchrest/assocations_spec.rb
|
153
208
|
- spec/couchrest/attachment_spec.rb
|
154
|
-
- spec/couchrest/attribute_protection_spec.rb
|
155
209
|
- spec/couchrest/base_spec.rb
|
156
210
|
- spec/couchrest/casted_model_spec.rb
|
157
211
|
- spec/couchrest/casted_spec.rb
|
158
212
|
- spec/couchrest/class_proxy_spec.rb
|
213
|
+
- spec/couchrest/configuration_spec.rb
|
159
214
|
- spec/couchrest/inherited_spec.rb
|
160
215
|
- spec/couchrest/persistence_spec.rb
|
216
|
+
- spec/couchrest/property_protection_spec.rb
|
161
217
|
- spec/couchrest/property_spec.rb
|
162
218
|
- spec/couchrest/subclass_spec.rb
|
163
219
|
- spec/couchrest/validations.rb
|
@@ -184,15 +240,14 @@ files:
|
|
184
240
|
- spec/fixtures/views/test_view/only-map.js
|
185
241
|
- spec/fixtures/views/test_view/test-map.js
|
186
242
|
- spec/fixtures/views/test_view/test-reduce.js
|
187
|
-
- spec/spec.opts
|
188
243
|
- spec/spec_helper.rb
|
189
244
|
has_rdoc: true
|
190
245
|
homepage: http://github.com/couchrest/couchrest_model
|
191
246
|
licenses: []
|
192
247
|
|
193
248
|
post_install_message:
|
194
|
-
rdoc_options:
|
195
|
-
|
249
|
+
rdoc_options: []
|
250
|
+
|
196
251
|
require_paths:
|
197
252
|
- lib
|
198
253
|
required_ruby_version: !ruby/object:Gem::Requirement
|
@@ -218,24 +273,28 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
218
273
|
requirements: []
|
219
274
|
|
220
275
|
rubyforge_project:
|
221
|
-
rubygems_version: 1.
|
276
|
+
rubygems_version: 1.4.2
|
222
277
|
signing_key:
|
223
278
|
specification_version: 3
|
224
279
|
summary: Extends the CouchRest Document for advanced modelling.
|
225
280
|
test_files:
|
226
281
|
- spec/couchrest/assocations_spec.rb
|
227
282
|
- spec/couchrest/attachment_spec.rb
|
228
|
-
- spec/couchrest/attribute_protection_spec.rb
|
229
283
|
- spec/couchrest/base_spec.rb
|
230
284
|
- spec/couchrest/casted_model_spec.rb
|
231
285
|
- spec/couchrest/casted_spec.rb
|
232
286
|
- spec/couchrest/class_proxy_spec.rb
|
287
|
+
- spec/couchrest/configuration_spec.rb
|
233
288
|
- spec/couchrest/inherited_spec.rb
|
234
289
|
- spec/couchrest/persistence_spec.rb
|
290
|
+
- spec/couchrest/property_protection_spec.rb
|
235
291
|
- spec/couchrest/property_spec.rb
|
236
292
|
- spec/couchrest/subclass_spec.rb
|
237
293
|
- spec/couchrest/validations.rb
|
238
294
|
- spec/couchrest/view_spec.rb
|
295
|
+
- spec/fixtures/attachments/README
|
296
|
+
- spec/fixtures/attachments/couchdb.png
|
297
|
+
- spec/fixtures/attachments/test.html
|
239
298
|
- spec/fixtures/base.rb
|
240
299
|
- spec/fixtures/more/article.rb
|
241
300
|
- spec/fixtures/more/card.rb
|
@@ -250,4 +309,9 @@ test_files:
|
|
250
309
|
- spec/fixtures/more/sale_invoice.rb
|
251
310
|
- spec/fixtures/more/service.rb
|
252
311
|
- spec/fixtures/more/user.rb
|
312
|
+
- spec/fixtures/views/lib.js
|
313
|
+
- spec/fixtures/views/test_view/lib.js
|
314
|
+
- spec/fixtures/views/test_view/only-map.js
|
315
|
+
- spec/fixtures/views/test_view/test-map.js
|
316
|
+
- spec/fixtures/views/test_view/test-reduce.js
|
253
317
|
- spec/spec_helper.rb
|
@@ -1,74 +0,0 @@
|
|
1
|
-
module CouchRest
|
2
|
-
module Model
|
3
|
-
module AttributeProtection
|
4
|
-
# Attribute protection from mass assignment to CouchRest properties
|
5
|
-
#
|
6
|
-
# Protected methods will be removed from
|
7
|
-
# * new
|
8
|
-
# * update_attributes
|
9
|
-
# * upate_attributes_without_saving
|
10
|
-
# * attributes=
|
11
|
-
#
|
12
|
-
# There are two modes of protection
|
13
|
-
# 1) Declare accessible poperties, assume all the rest are protected
|
14
|
-
# property :name, :accessible => true
|
15
|
-
# property :admin # this will be automatically protected
|
16
|
-
#
|
17
|
-
# 2) Declare protected properties, assume all the rest are accessible
|
18
|
-
# property :name # this will not be protected
|
19
|
-
# property :admin, :protected => true
|
20
|
-
#
|
21
|
-
# Note: you cannot set both flags in a single class
|
22
|
-
|
23
|
-
def self.included(base)
|
24
|
-
base.extend(ClassMethods)
|
25
|
-
end
|
26
|
-
|
27
|
-
module ClassMethods
|
28
|
-
def accessible_properties
|
29
|
-
properties.select { |prop| prop.options[:accessible] }
|
30
|
-
end
|
31
|
-
|
32
|
-
def protected_properties
|
33
|
-
properties.select { |prop| prop.options[:protected] }
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
def accessible_properties
|
38
|
-
self.class.accessible_properties
|
39
|
-
end
|
40
|
-
|
41
|
-
def protected_properties
|
42
|
-
self.class.protected_properties
|
43
|
-
end
|
44
|
-
|
45
|
-
def remove_protected_attributes(attributes)
|
46
|
-
protected_names = properties_to_remove_from_mass_assignment.map { |prop| prop.name }
|
47
|
-
return attributes if protected_names.empty?
|
48
|
-
|
49
|
-
attributes.reject! do |property_name, property_value|
|
50
|
-
protected_names.include?(property_name.to_s)
|
51
|
-
end
|
52
|
-
|
53
|
-
attributes || {}
|
54
|
-
end
|
55
|
-
|
56
|
-
private
|
57
|
-
|
58
|
-
def properties_to_remove_from_mass_assignment
|
59
|
-
has_protected = !protected_properties.empty?
|
60
|
-
has_accessible = !accessible_properties.empty?
|
61
|
-
|
62
|
-
if !has_protected && !has_accessible
|
63
|
-
[]
|
64
|
-
elsif has_protected && !has_accessible
|
65
|
-
protected_properties
|
66
|
-
elsif has_accessible && !has_protected
|
67
|
-
properties.reject { |prop| prop.options[:accessible] }
|
68
|
-
else
|
69
|
-
raise "Set either :accessible or :protected for #{self.class}, but not both"
|
70
|
-
end
|
71
|
-
end
|
72
|
-
end
|
73
|
-
end
|
74
|
-
end
|
@@ -1,75 +0,0 @@
|
|
1
|
-
module CouchRest
|
2
|
-
module Model
|
3
|
-
module Attributes
|
4
|
-
|
5
|
-
## Support for handling attributes
|
6
|
-
#
|
7
|
-
# This would be better in the properties file, but due to scoping issues
|
8
|
-
# this is not yet possible.
|
9
|
-
#
|
10
|
-
|
11
|
-
def prepare_all_attributes(doc = {}, options = {})
|
12
|
-
apply_all_property_defaults
|
13
|
-
if options[:directly_set_attributes]
|
14
|
-
directly_set_read_only_attributes(doc)
|
15
|
-
else
|
16
|
-
remove_protected_attributes(doc)
|
17
|
-
end
|
18
|
-
directly_set_attributes(doc) unless doc.nil?
|
19
|
-
end
|
20
|
-
|
21
|
-
# Takes a hash as argument, and applies the values by using writer methods
|
22
|
-
# for each key. It doesn't save the document at the end. Raises a NoMethodError if the corresponding methods are
|
23
|
-
# missing. In case of error, no attributes are changed.
|
24
|
-
def update_attributes_without_saving(hash)
|
25
|
-
# Remove any protected and update all the rest. Any attributes
|
26
|
-
# which do not have a property will simply be ignored.
|
27
|
-
attrs = remove_protected_attributes(hash)
|
28
|
-
directly_set_attributes(attrs)
|
29
|
-
end
|
30
|
-
alias :attributes= :update_attributes_without_saving
|
31
|
-
|
32
|
-
# Takes a hash as argument, and applies the values by using writer methods
|
33
|
-
# for each key. Raises a NoMethodError if the corresponding methods are
|
34
|
-
# missing. In case of error, no attributes are changed.
|
35
|
-
def update_attributes(hash)
|
36
|
-
update_attributes_without_saving hash
|
37
|
-
save
|
38
|
-
end
|
39
|
-
|
40
|
-
private
|
41
|
-
|
42
|
-
def directly_set_attributes(hash)
|
43
|
-
hash.each do |attribute_name, attribute_value|
|
44
|
-
if self.respond_to?("#{attribute_name}=")
|
45
|
-
self.send("#{attribute_name}=", hash.delete(attribute_name))
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
def directly_set_read_only_attributes(hash)
|
51
|
-
property_list = self.properties.map{|p| p.name}
|
52
|
-
hash.each do |attribute_name, attribute_value|
|
53
|
-
next if self.respond_to?("#{attribute_name}=")
|
54
|
-
if property_list.include?(attribute_name)
|
55
|
-
write_attribute(attribute_name, hash.delete(attribute_name))
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
def set_attributes(hash)
|
61
|
-
attrs = remove_protected_attributes(hash)
|
62
|
-
directly_set_attributes(attrs)
|
63
|
-
end
|
64
|
-
|
65
|
-
def check_properties_exist(attrs)
|
66
|
-
property_list = self.properties.map{|p| p.name}
|
67
|
-
attrs.each do |attribute_name, attribute_value|
|
68
|
-
raise NoMethodError, "Property #{attribute_name} not created" unless respond_to?("#{attribute_name}=") or property_list.include?(attribute_name)
|
69
|
-
end
|
70
|
-
end
|
71
|
-
|
72
|
-
end
|
73
|
-
end
|
74
|
-
end
|
75
|
-
|