object_attorney 1.1.2 → 1.2.1
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.
- checksums.yaml +8 -8
- data/lib/object_attorney/association_reflection.rb +33 -0
- data/lib/object_attorney/helpers.rb +19 -0
- data/lib/object_attorney/nested_objects.rb +16 -15
- data/lib/object_attorney/orm.rb +2 -2
- data/lib/object_attorney/version.rb +1 -1
- data/lib/object_attorney.rb +11 -12
- data/object_attorney.gemspec +1 -0
- data/spec/object_attorney/bulk_posts_form_child_spec.rb +2 -2
- data/spec/spec_helper.rb +3 -1
- data/spec/support/models/bulk_posts_form_child.rb +12 -0
- data/spec/support/models/item.rb +3 -0
- metadata +20 -2
checksums.yaml
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
---
|
|
2
2
|
!binary "U0hBMQ==":
|
|
3
3
|
metadata.gz: !binary |-
|
|
4
|
-
|
|
4
|
+
ZDBmMmQ5OTNkMjI2MzRkZGVkNjM5NzgwMDg1NzQ0ZjYzNjhiODUwMQ==
|
|
5
5
|
data.tar.gz: !binary |-
|
|
6
|
-
|
|
6
|
+
YmQxOGY0OGNiMzEyNDQzOTcxOGM3MGRmZjhiOTVlYTdiOTdlNGVmMw==
|
|
7
7
|
SHA512:
|
|
8
8
|
metadata.gz: !binary |-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
9
|
+
ZTU2YjYyYzQ4M2JkZDJjZTZlZTg1N2JjMjNmM2JkZjhmMzczNWRiZjQ1MTBk
|
|
10
|
+
YzZkYzBiNDg2ZjlhMTU5ZGNhZDIzNWJmNDI4MTQzZWFiYWFjYmQzZjBhZWRl
|
|
11
|
+
ZjZlYWY1MDk4ZmVlZThkMGE1YTE5OTg1ODVlOTZmMDJjNjIxNjc=
|
|
12
12
|
data.tar.gz: !binary |-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
13
|
+
NzY5MmJjMTMxMWU0NzVlYzZlZDYwNzM3YzNkM2Y0MzY2ZWIxYWU3MTUwNWYx
|
|
14
|
+
NWUxNzE3NWUzNWMzZjc4YjI5YjQ3YTM1Y2Q1YWQ2YWZjZDllOGVjM2YzODMw
|
|
15
|
+
YzRkYTA0ODI4NTMwZjRkZTU5MWM3MDJkYWQxYWNlYzA0ZmFiOTY=
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
module ObjectAttorney
|
|
2
|
+
|
|
3
|
+
class AssociationReflection
|
|
4
|
+
attr_reader :klass, :macro, :options, :name
|
|
5
|
+
|
|
6
|
+
def initialize(association, options)
|
|
7
|
+
options = options.is_a?(Hash) ? options : { class_name: options }
|
|
8
|
+
|
|
9
|
+
@name = association
|
|
10
|
+
@macro = options[:macro] || macro_default(association)
|
|
11
|
+
@klass = options[:class_name] || klass_default(association)
|
|
12
|
+
@options = options
|
|
13
|
+
|
|
14
|
+
@klass = @klass.constantize if @klass.is_a?(String)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
private ################################# private
|
|
18
|
+
|
|
19
|
+
def macro_default(association)
|
|
20
|
+
Helpers.plural?(association) ? :has_many : :belongs_to
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def klass_default(association)
|
|
24
|
+
if Helpers.plural?(association)
|
|
25
|
+
association.to_s.singularize.camelize
|
|
26
|
+
else
|
|
27
|
+
association.to_s.camelize
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
module ObjectAttorney
|
|
2
|
+
|
|
3
|
+
module Helpers
|
|
4
|
+
|
|
5
|
+
extend self
|
|
6
|
+
|
|
7
|
+
def plural?(string)
|
|
8
|
+
string = string.to_s
|
|
9
|
+
string == string.pluralize
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def try_or_return(object, method, default_value)
|
|
13
|
+
returning_value = object.try(method)
|
|
14
|
+
returning_value.nil? ? default_value : returning_value
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
end
|
|
@@ -116,28 +116,29 @@ module ObjectAttorney
|
|
|
116
116
|
|
|
117
117
|
module ClassMethods
|
|
118
118
|
|
|
119
|
-
def accepts_nested_objects(
|
|
120
|
-
|
|
121
|
-
self.
|
|
122
|
-
|
|
119
|
+
def accepts_nested_objects(nested_object_name, options = {})
|
|
120
|
+
reflection = AssociationReflection.new(nested_object_name, options)
|
|
121
|
+
self.instance_variable_set("@#{nested_object_name}_reflection", reflection)
|
|
122
|
+
self.instance_variable_set("@association_reflections", association_reflections | [reflection])
|
|
123
|
+
|
|
124
|
+
self.send(:attr_accessor, "#{nested_object_name}_attributes".to_sym)
|
|
125
|
+
define_method(nested_object_name) { nested_getter(nested_object_name) }
|
|
123
126
|
end
|
|
124
127
|
|
|
125
|
-
def
|
|
126
|
-
|
|
128
|
+
def association_reflections
|
|
129
|
+
self.instance_variable_get("@association_reflections") || zuper_method('association_reflections') || []
|
|
127
130
|
end
|
|
128
131
|
|
|
129
|
-
def
|
|
130
|
-
self.instance_variable_get("
|
|
132
|
+
def reflect_on_association(association)
|
|
133
|
+
self.instance_variable_get("@#{association}_reflection") || zuper_method('reflect_on_association', association)
|
|
131
134
|
end
|
|
132
135
|
|
|
133
|
-
|
|
136
|
+
def reflect_on_all_associations(macro = nil)
|
|
137
|
+
macro ? association_reflections.select { |reflection| reflection.macro == macro } : association_reflections
|
|
138
|
+
end
|
|
134
139
|
|
|
135
|
-
def
|
|
136
|
-
|
|
137
|
-
define_method(nested_object_name) do
|
|
138
|
-
nested_getter(nested_object_name)
|
|
139
|
-
end
|
|
140
|
-
end
|
|
140
|
+
def nested_objects
|
|
141
|
+
association_reflections.map(&:name)
|
|
141
142
|
end
|
|
142
143
|
|
|
143
144
|
end
|
data/lib/object_attorney/orm.rb
CHANGED
|
@@ -6,11 +6,11 @@ module ObjectAttorney
|
|
|
6
6
|
end
|
|
7
7
|
|
|
8
8
|
def new_record?
|
|
9
|
-
try_or_return(represented_object, :new_record?, true)
|
|
9
|
+
Helpers.try_or_return(represented_object, :new_record?, true)
|
|
10
10
|
end
|
|
11
11
|
|
|
12
12
|
def persisted?
|
|
13
|
-
try_or_return(represented_object, :persisted?, false)
|
|
13
|
+
Helpers.try_or_return(represented_object, :persisted?, false)
|
|
14
14
|
end
|
|
15
15
|
|
|
16
16
|
def save
|
data/lib/object_attorney.rb
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
require "object_attorney/version"
|
|
2
|
+
require "object_attorney/helpers"
|
|
3
|
+
require "object_attorney/association_reflection"
|
|
2
4
|
require "object_attorney/nested_objects"
|
|
3
5
|
require "object_attorney/orm"
|
|
4
6
|
require 'active_record'
|
|
@@ -44,7 +46,7 @@ module ObjectAttorney
|
|
|
44
46
|
end
|
|
45
47
|
|
|
46
48
|
def validate_represented_object
|
|
47
|
-
valid = override_validations? ? true : try_or_return(represented_object, :valid?, true)
|
|
49
|
+
valid = override_validations? ? true : Helpers.try_or_return(represented_object, :valid?, true)
|
|
48
50
|
import_represented_object_errors unless valid
|
|
49
51
|
valid
|
|
50
52
|
end
|
|
@@ -81,23 +83,20 @@ module ObjectAttorney
|
|
|
81
83
|
marked_for_destruction?
|
|
82
84
|
end
|
|
83
85
|
|
|
84
|
-
def try_or_return(object, method, default_value)
|
|
85
|
-
returning_value = object.try(method)
|
|
86
|
-
returning_value.nil? ? default_value : returning_value
|
|
87
|
-
end
|
|
88
|
-
|
|
89
86
|
module ClassMethods
|
|
90
87
|
|
|
91
|
-
def represents(represented_object_name,
|
|
92
|
-
self.instance_variable_set("@
|
|
88
|
+
def represents(represented_object_name, options = {})
|
|
89
|
+
self.instance_variable_set("@represented_object_reflection", AssociationReflection.new(represented_object_name, options))
|
|
93
90
|
|
|
94
|
-
define_method(represented_object_name)
|
|
95
|
-
|
|
96
|
-
|
|
91
|
+
define_method(represented_object_name) { represented_object }
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
def represented_object_reflection
|
|
95
|
+
self.instance_variable_get("@represented_object_reflection") || zuper_method('represented_object_reflection')
|
|
97
96
|
end
|
|
98
97
|
|
|
99
98
|
def represented_object_class
|
|
100
|
-
|
|
99
|
+
represented_object_reflection.try(:klass)
|
|
101
100
|
end
|
|
102
101
|
|
|
103
102
|
def zuper_method(method_name, *args)
|
data/object_attorney.gemspec
CHANGED
|
@@ -2,7 +2,7 @@ require "spec_helper"
|
|
|
2
2
|
|
|
3
3
|
describe BulkPostsFormChild do
|
|
4
4
|
|
|
5
|
-
it "Creating multiple Posts, with a tabless model 'BulkPostsFormChild' has if it had 'accepts_nested_attributes_for :posts'" do
|
|
5
|
+
it "Creating multiple Posts, with a tabless model 'BulkPostsFormChild' has if it had 'accepts_nested_attributes_for :posts'", current: true do
|
|
6
6
|
params = {
|
|
7
7
|
bulk_post: {
|
|
8
8
|
admin: true,
|
|
@@ -49,7 +49,7 @@ describe BulkPostsFormChild do
|
|
|
49
49
|
}
|
|
50
50
|
}
|
|
51
51
|
}
|
|
52
|
-
|
|
52
|
+
|
|
53
53
|
existing_post = Post.create(title: "My title1")
|
|
54
54
|
BulkPostsFormChild.new(params[:bulk_post]).save
|
|
55
55
|
existing_post.reload
|
data/spec/spec_helper.rb
CHANGED
|
@@ -13,13 +13,15 @@ require 'object_attorney'
|
|
|
13
13
|
require 'support/database_setup'
|
|
14
14
|
require 'support/active_model/validations'
|
|
15
15
|
require 'support/models/post'
|
|
16
|
+
require 'support/models/item'
|
|
16
17
|
require 'support/models/post_form'
|
|
17
18
|
require 'support/models/post_form_child'
|
|
18
19
|
require 'support/models/bulk_posts_form'
|
|
19
20
|
require 'support/models/bulk_posts_form_child'
|
|
20
21
|
|
|
21
22
|
RSpec.configure do |config|
|
|
22
|
-
|
|
23
|
+
config.filter_run :current
|
|
24
|
+
|
|
23
25
|
I18n.enforce_available_locales = false
|
|
24
26
|
|
|
25
27
|
# see: http://iain.nl/testing-activerecord-in-isolation
|
|
@@ -2,6 +2,18 @@ class BulkPostsFormChild < BulkPostsForm
|
|
|
2
2
|
|
|
3
3
|
attr_accessor :admin
|
|
4
4
|
|
|
5
|
+
accepts_nested_objects :items
|
|
6
|
+
|
|
5
7
|
validates_presence_of :admin
|
|
6
8
|
|
|
9
|
+
##################### BODY BELLOW THIS LINE ####################
|
|
10
|
+
|
|
11
|
+
def build_item(attributes = {}, item = nil)
|
|
12
|
+
Item.new(attributes, item)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def existing_items
|
|
16
|
+
[]
|
|
17
|
+
end
|
|
18
|
+
|
|
7
19
|
end
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: object_attorney
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.1
|
|
4
|
+
version: 1.2.1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- João Gonçalves
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2013-12-
|
|
11
|
+
date: 2013-12-18 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: bundler
|
|
@@ -38,6 +38,20 @@ dependencies:
|
|
|
38
38
|
- - ! '>='
|
|
39
39
|
- !ruby/object:Gem::Version
|
|
40
40
|
version: '0'
|
|
41
|
+
- !ruby/object:Gem::Dependency
|
|
42
|
+
name: activerecord
|
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
|
44
|
+
requirements:
|
|
45
|
+
- - ! '>='
|
|
46
|
+
- !ruby/object:Gem::Version
|
|
47
|
+
version: '0'
|
|
48
|
+
type: :development
|
|
49
|
+
prerelease: false
|
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
51
|
+
requirements:
|
|
52
|
+
- - ! '>='
|
|
53
|
+
- !ruby/object:Gem::Version
|
|
54
|
+
version: '0'
|
|
41
55
|
description: Form Object pattern implementation for Rails
|
|
42
56
|
email:
|
|
43
57
|
- goncalves.joao@gmail.com
|
|
@@ -56,6 +70,8 @@ files:
|
|
|
56
70
|
- db/migrate/20131205114900_create_posts.rb
|
|
57
71
|
- db/schema.rb
|
|
58
72
|
- lib/object_attorney.rb
|
|
73
|
+
- lib/object_attorney/association_reflection.rb
|
|
74
|
+
- lib/object_attorney/helpers.rb
|
|
59
75
|
- lib/object_attorney/nested_objects.rb
|
|
60
76
|
- lib/object_attorney/nested_uniqueness_validator.rb
|
|
61
77
|
- lib/object_attorney/orm.rb
|
|
@@ -71,6 +87,7 @@ files:
|
|
|
71
87
|
- spec/support/database_setup.rb
|
|
72
88
|
- spec/support/models/bulk_posts_form.rb
|
|
73
89
|
- spec/support/models/bulk_posts_form_child.rb
|
|
90
|
+
- spec/support/models/item.rb
|
|
74
91
|
- spec/support/models/post.rb
|
|
75
92
|
- spec/support/models/post_form.rb
|
|
76
93
|
- spec/support/models/post_form_child.rb
|
|
@@ -110,6 +127,7 @@ test_files:
|
|
|
110
127
|
- spec/support/database_setup.rb
|
|
111
128
|
- spec/support/models/bulk_posts_form.rb
|
|
112
129
|
- spec/support/models/bulk_posts_form_child.rb
|
|
130
|
+
- spec/support/models/item.rb
|
|
113
131
|
- spec/support/models/post.rb
|
|
114
132
|
- spec/support/models/post_form.rb
|
|
115
133
|
- spec/support/models/post_form_child.rb
|