encore 0.0.3 → 0.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 +4 -4
- data/.gitignore +0 -16
- data/.rubocop.yml +53 -0
- data/.travis.yml +10 -2
- data/LICENSE.md +1 -1
- data/README.md +105 -153
- data/Rakefile +10 -0
- data/encore.gemspec +16 -13
- data/gemfiles/{Gemfile.activerecord-3.2.x → Gemfile.activerecord-4.1} +1 -1
- data/lib/encore/config.rb +2 -0
- data/lib/encore/persister/errors_parser.rb +17 -0
- data/lib/encore/persister/instance.rb +85 -0
- data/lib/encore/persister/key_mapping.rb +15 -0
- data/lib/encore/persister/links_parser.rb +57 -0
- data/lib/encore/persister/param_injection.rb +15 -0
- data/lib/encore/serializer/base.rb +48 -0
- data/lib/encore/serializer/eager_loading_manager.rb +11 -0
- data/lib/encore/serializer/instance.rb +56 -0
- data/lib/encore/serializer/linked_resource_manager.rb +19 -0
- data/lib/encore/serializer/links_reflection_includer.rb +50 -0
- data/lib/encore/serializer/main_resource_links_manager/reflection_belongs_to.rb +13 -0
- data/lib/encore/serializer/main_resource_links_manager/reflection_has_many.rb +13 -0
- data/lib/encore/serializer/main_resource_links_manager/reflection_has_one.rb +13 -0
- data/lib/encore/serializer/main_resource_links_manager.rb +45 -0
- data/lib/encore/serializer/main_resource_manager.rb +13 -0
- data/lib/encore/serializer/meta_manager.rb +29 -0
- data/lib/encore/serializer/options_parser.rb +51 -0
- data/lib/encore/serializer/utils.rb +12 -0
- data/lib/encore/version.rb +1 -1
- data/lib/encore.rb +16 -8
- data/spec/encore/persister/belongs_to_links_spec.rb +46 -0
- data/spec/encore/persister/create_resources_spec.rb +55 -0
- data/spec/encore/persister/errors_resources_spec.rb +55 -0
- data/spec/encore/persister/has_many_links_spec.rb +49 -0
- data/spec/encore/persister/has_one_links_spec.rb +49 -0
- data/spec/encore/persister/key_mappings_spec.rb +66 -0
- data/spec/encore/persister/param_injection_spec.rb +46 -0
- data/spec/encore/persister/update_resources_spec.rb +37 -0
- data/spec/encore/serializer/linked/always_include_resources_spec.rb +85 -0
- data/spec/encore/serializer/linked/can_include_resources_spec.rb +69 -0
- data/spec/encore/serializer/linked/linked_resources_spec.rb +103 -0
- data/spec/encore/serializer/links_resource_spec.rb +294 -0
- data/spec/encore/serializer/main_meta_spec.rb +66 -0
- data/spec/encore/serializer/main_resource_spec.rb +37 -0
- data/spec/encore/serializer/no_paging_spec.rb +40 -0
- data/spec/encore_spec.rb +4 -0
- data/spec/spec_helper.rb +8 -21
- data/spec/support/macros/database/database_adapter.rb +9 -0
- data/spec/support/macros/database/sqlite3_adapter.rb +14 -0
- data/spec/support/macros/database_macros.rb +5 -16
- data/spec/support/macros/model_macros.rb +7 -22
- metadata +143 -72
- data/lib/encore/association/has_many_association.rb +0 -12
- data/lib/encore/association/has_one_association.rb +0 -12
- data/lib/encore/association.rb +0 -39
- data/lib/encore/attribute.rb +0 -42
- data/lib/encore/entity/input/associations.rb +0 -27
- data/lib/encore/entity/input/errors.rb +0 -8
- data/lib/encore/entity/input/exposed_attributes.rb +0 -37
- data/lib/encore/entity/input.rb +0 -73
- data/lib/encore/entity/output/json.rb +0 -14
- data/lib/encore/entity/output.rb +0 -13
- data/lib/encore/entity.rb +0 -44
- data/lib/encore/helpers/controller_helper.rb +0 -37
- data/lib/encore/helpers.rb +0 -1
- data/lib/encore/railtie.rb +0 -11
- data/spec/encore/entity/input/associations_spec.rb +0 -48
- data/spec/encore/entity/input/exposed_attributes_spec.rb +0 -46
- data/spec/encore/entity/input_spec.rb +0 -104
- data/spec/encore/entity/output/json_spec.rb +0 -76
- data/spec/encore/entity/output_spec.rb +0 -5
- data/spec/encore/entity_spec.rb +0 -31
- data/spec/encore/helpers/controller_helper_spec.rb +0 -59
metadata
CHANGED
@@ -1,140 +1,220 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: encore
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: '0.1'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
|
-
-
|
7
|
+
- Simon Prévost
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2014-05-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: activemodel
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 4.0.0
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 4.0.0
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: activerecord
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 4.0.0
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 4.0.0
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: active_model_serializers
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 0.8.0
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 0.8.0
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: kaminari
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 0.15.1
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 0.15.1
|
13
69
|
- !ruby/object:Gem::Dependency
|
14
70
|
name: bundler
|
15
71
|
requirement: !ruby/object:Gem::Requirement
|
16
72
|
requirements:
|
17
|
-
- -
|
73
|
+
- - "~>"
|
18
74
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
75
|
+
version: '1.3'
|
20
76
|
type: :development
|
21
77
|
prerelease: false
|
22
78
|
version_requirements: !ruby/object:Gem::Requirement
|
23
79
|
requirements:
|
24
|
-
- -
|
80
|
+
- - "~>"
|
25
81
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
82
|
+
version: '1.3'
|
27
83
|
- !ruby/object:Gem::Dependency
|
28
84
|
name: rake
|
29
85
|
requirement: !ruby/object:Gem::Requirement
|
30
86
|
requirements:
|
31
|
-
- -
|
87
|
+
- - "~>"
|
32
88
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
89
|
+
version: '10.3'
|
34
90
|
type: :development
|
35
91
|
prerelease: false
|
36
92
|
version_requirements: !ruby/object:Gem::Requirement
|
37
93
|
requirements:
|
38
|
-
- -
|
94
|
+
- - "~>"
|
39
95
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
96
|
+
version: '10.3'
|
41
97
|
- !ruby/object:Gem::Dependency
|
42
98
|
name: rspec
|
43
99
|
requirement: !ruby/object:Gem::Requirement
|
44
100
|
requirements:
|
45
|
-
- - '
|
101
|
+
- - '='
|
46
102
|
- !ruby/object:Gem::Version
|
47
|
-
version:
|
103
|
+
version: 3.0.0beta2
|
48
104
|
type: :development
|
49
105
|
prerelease: false
|
50
106
|
version_requirements: !ruby/object:Gem::Requirement
|
51
107
|
requirements:
|
52
|
-
- - '
|
108
|
+
- - '='
|
53
109
|
- !ruby/object:Gem::Version
|
54
|
-
version:
|
110
|
+
version: 3.0.0beta2
|
55
111
|
- !ruby/object:Gem::Dependency
|
56
112
|
name: sqlite3
|
57
113
|
requirement: !ruby/object:Gem::Requirement
|
58
114
|
requirements:
|
59
|
-
- -
|
115
|
+
- - ">="
|
60
116
|
- !ruby/object:Gem::Version
|
61
|
-
version:
|
117
|
+
version: 1.3.8
|
118
|
+
- - "<"
|
119
|
+
- !ruby/object:Gem::Version
|
120
|
+
version: '1.4'
|
62
121
|
type: :development
|
63
122
|
prerelease: false
|
64
123
|
version_requirements: !ruby/object:Gem::Requirement
|
65
124
|
requirements:
|
66
|
-
- -
|
125
|
+
- - ">="
|
67
126
|
- !ruby/object:Gem::Version
|
68
|
-
version:
|
127
|
+
version: 1.3.8
|
128
|
+
- - "<"
|
129
|
+
- !ruby/object:Gem::Version
|
130
|
+
version: '1.4'
|
69
131
|
- !ruby/object:Gem::Dependency
|
70
|
-
name:
|
132
|
+
name: rubocop
|
71
133
|
requirement: !ruby/object:Gem::Requirement
|
72
134
|
requirements:
|
73
|
-
- - '
|
135
|
+
- - '='
|
74
136
|
- !ruby/object:Gem::Version
|
75
|
-
version:
|
137
|
+
version: '0.22'
|
76
138
|
type: :development
|
77
139
|
prerelease: false
|
78
140
|
version_requirements: !ruby/object:Gem::Requirement
|
79
141
|
requirements:
|
80
|
-
- - '
|
142
|
+
- - '='
|
81
143
|
- !ruby/object:Gem::Version
|
82
|
-
version:
|
144
|
+
version: '0.22'
|
83
145
|
- !ruby/object:Gem::Dependency
|
84
|
-
name:
|
146
|
+
name: phare
|
85
147
|
requirement: !ruby/object:Gem::Requirement
|
86
148
|
requirements:
|
87
|
-
- -
|
149
|
+
- - ">="
|
88
150
|
- !ruby/object:Gem::Version
|
89
|
-
version:
|
90
|
-
type: :
|
151
|
+
version: '0'
|
152
|
+
type: :development
|
91
153
|
prerelease: false
|
92
154
|
version_requirements: !ruby/object:Gem::Requirement
|
93
155
|
requirements:
|
94
|
-
- -
|
156
|
+
- - ">="
|
95
157
|
- !ruby/object:Gem::Version
|
96
|
-
version:
|
97
|
-
description: Encore
|
158
|
+
version: '0'
|
159
|
+
description: Encore provides serializers and persisters to build JSON API-compliant
|
160
|
+
Web services with Ruby on Rails.
|
98
161
|
email:
|
99
|
-
-
|
162
|
+
- sprevost@mirego.com
|
100
163
|
executables: []
|
101
164
|
extensions: []
|
102
165
|
extra_rdoc_files: []
|
103
166
|
files:
|
104
|
-
- .gitignore
|
105
|
-
- .rspec
|
106
|
-
- .
|
167
|
+
- ".gitignore"
|
168
|
+
- ".rspec"
|
169
|
+
- ".rubocop.yml"
|
170
|
+
- ".travis.yml"
|
107
171
|
- Gemfile
|
108
172
|
- LICENSE.md
|
109
173
|
- README.md
|
110
174
|
- Rakefile
|
111
175
|
- encore.gemspec
|
112
|
-
- gemfiles/Gemfile.activerecord-3.2.x
|
113
176
|
- gemfiles/Gemfile.activerecord-4.0
|
177
|
+
- gemfiles/Gemfile.activerecord-4.1
|
114
178
|
- lib/encore.rb
|
115
|
-
- lib/encore/
|
116
|
-
- lib/encore/
|
117
|
-
- lib/encore/
|
118
|
-
- lib/encore/
|
119
|
-
- lib/encore/
|
120
|
-
- lib/encore/
|
121
|
-
- lib/encore/
|
122
|
-
- lib/encore/
|
123
|
-
- lib/encore/
|
124
|
-
- lib/encore/
|
125
|
-
- lib/encore/
|
126
|
-
- lib/encore/
|
127
|
-
- lib/encore/
|
128
|
-
- lib/encore/
|
179
|
+
- lib/encore/config.rb
|
180
|
+
- lib/encore/persister/errors_parser.rb
|
181
|
+
- lib/encore/persister/instance.rb
|
182
|
+
- lib/encore/persister/key_mapping.rb
|
183
|
+
- lib/encore/persister/links_parser.rb
|
184
|
+
- lib/encore/persister/param_injection.rb
|
185
|
+
- lib/encore/serializer/base.rb
|
186
|
+
- lib/encore/serializer/eager_loading_manager.rb
|
187
|
+
- lib/encore/serializer/instance.rb
|
188
|
+
- lib/encore/serializer/linked_resource_manager.rb
|
189
|
+
- lib/encore/serializer/links_reflection_includer.rb
|
190
|
+
- lib/encore/serializer/main_resource_links_manager.rb
|
191
|
+
- lib/encore/serializer/main_resource_links_manager/reflection_belongs_to.rb
|
192
|
+
- lib/encore/serializer/main_resource_links_manager/reflection_has_many.rb
|
193
|
+
- lib/encore/serializer/main_resource_links_manager/reflection_has_one.rb
|
194
|
+
- lib/encore/serializer/main_resource_manager.rb
|
195
|
+
- lib/encore/serializer/meta_manager.rb
|
196
|
+
- lib/encore/serializer/options_parser.rb
|
197
|
+
- lib/encore/serializer/utils.rb
|
129
198
|
- lib/encore/version.rb
|
130
|
-
- spec/encore/
|
131
|
-
- spec/encore/
|
132
|
-
- spec/encore/
|
133
|
-
- spec/encore/
|
134
|
-
- spec/encore/
|
135
|
-
- spec/encore/
|
136
|
-
- spec/encore/
|
199
|
+
- spec/encore/persister/belongs_to_links_spec.rb
|
200
|
+
- spec/encore/persister/create_resources_spec.rb
|
201
|
+
- spec/encore/persister/errors_resources_spec.rb
|
202
|
+
- spec/encore/persister/has_many_links_spec.rb
|
203
|
+
- spec/encore/persister/has_one_links_spec.rb
|
204
|
+
- spec/encore/persister/key_mappings_spec.rb
|
205
|
+
- spec/encore/persister/param_injection_spec.rb
|
206
|
+
- spec/encore/persister/update_resources_spec.rb
|
207
|
+
- spec/encore/serializer/linked/always_include_resources_spec.rb
|
208
|
+
- spec/encore/serializer/linked/can_include_resources_spec.rb
|
209
|
+
- spec/encore/serializer/linked/linked_resources_spec.rb
|
210
|
+
- spec/encore/serializer/links_resource_spec.rb
|
211
|
+
- spec/encore/serializer/main_meta_spec.rb
|
212
|
+
- spec/encore/serializer/main_resource_spec.rb
|
213
|
+
- spec/encore/serializer/no_paging_spec.rb
|
214
|
+
- spec/encore_spec.rb
|
137
215
|
- spec/spec_helper.rb
|
216
|
+
- spec/support/macros/database/database_adapter.rb
|
217
|
+
- spec/support/macros/database/sqlite3_adapter.rb
|
138
218
|
- spec/support/macros/database_macros.rb
|
139
219
|
- spec/support/macros/model_macros.rb
|
140
220
|
homepage: https://github.com/mirego/encore
|
@@ -147,28 +227,19 @@ require_paths:
|
|
147
227
|
- lib
|
148
228
|
required_ruby_version: !ruby/object:Gem::Requirement
|
149
229
|
requirements:
|
150
|
-
- -
|
230
|
+
- - ">="
|
151
231
|
- !ruby/object:Gem::Version
|
152
232
|
version: '0'
|
153
233
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
154
234
|
requirements:
|
155
|
-
- -
|
235
|
+
- - ">="
|
156
236
|
- !ruby/object:Gem::Version
|
157
237
|
version: '0'
|
158
238
|
requirements: []
|
159
239
|
rubyforge_project:
|
160
|
-
rubygems_version: 2.
|
240
|
+
rubygems_version: 2.2.2
|
161
241
|
signing_key:
|
162
242
|
specification_version: 4
|
163
|
-
summary: Encore
|
164
|
-
|
165
|
-
|
166
|
-
- spec/encore/entity/input/exposed_attributes_spec.rb
|
167
|
-
- spec/encore/entity/input_spec.rb
|
168
|
-
- spec/encore/entity/output/json_spec.rb
|
169
|
-
- spec/encore/entity/output_spec.rb
|
170
|
-
- spec/encore/entity_spec.rb
|
171
|
-
- spec/encore/helpers/controller_helper_spec.rb
|
172
|
-
- spec/spec_helper.rb
|
173
|
-
- spec/support/macros/database_macros.rb
|
174
|
-
- spec/support/macros/model_macros.rb
|
243
|
+
summary: Encore provides serializers and persisters to build JSON API-compliant Web
|
244
|
+
services with Ruby on Rails.
|
245
|
+
test_files: []
|
data/lib/encore/association.rb
DELETED
@@ -1,39 +0,0 @@
|
|
1
|
-
module Encore
|
2
|
-
class Association < Attribute
|
3
|
-
def initialize(*args)
|
4
|
-
super
|
5
|
-
|
6
|
-
# Create a temporary accessor to store new values
|
7
|
-
@klass.send :attr_accessor, self.tmp_column_accessor
|
8
|
-
|
9
|
-
# Add callback on `before_save` to apply new values
|
10
|
-
association = self
|
11
|
-
@klass.before_save lambda { association.apply(self) }
|
12
|
-
end
|
13
|
-
|
14
|
-
# Store the value in a temporary accessor used by the `before_save` callback
|
15
|
-
def assign(object, value)
|
16
|
-
object.send :"#{tmp_column_accessor}=", value
|
17
|
-
end
|
18
|
-
|
19
|
-
# Apply the new value to the column and reset the temporary accessor
|
20
|
-
def apply(object)
|
21
|
-
object.send :"#{column_accessor}=", object.send(tmp_column_accessor)
|
22
|
-
object.send :"#{tmp_column_accessor}=", nil
|
23
|
-
end
|
24
|
-
|
25
|
-
# Return the value of the association
|
26
|
-
def fetch(object)
|
27
|
-
object.send :"#{column_accessor}"
|
28
|
-
end
|
29
|
-
|
30
|
-
protected
|
31
|
-
|
32
|
-
def tmp_column_accessor
|
33
|
-
:"encore_tmp_#{column_accessor}"
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
require 'encore/association/has_one_association'
|
39
|
-
require 'encore/association/has_many_association'
|
data/lib/encore/attribute.rb
DELETED
@@ -1,42 +0,0 @@
|
|
1
|
-
module Encore
|
2
|
-
class Attribute
|
3
|
-
attr_reader :attribute, :klass, :column, :opts
|
4
|
-
|
5
|
-
def initialize(klass, column, opts = {})
|
6
|
-
@klass = klass
|
7
|
-
@column = column
|
8
|
-
@attribute = opts[:as].try(:to_sym) || @column
|
9
|
-
@opts = opts
|
10
|
-
end
|
11
|
-
|
12
|
-
def assign(object, value)
|
13
|
-
object.send :"#{self.column}=", value
|
14
|
-
end
|
15
|
-
|
16
|
-
def fetch(object)
|
17
|
-
object.send :"#{self.column}"
|
18
|
-
end
|
19
|
-
|
20
|
-
def ==(other_attribute)
|
21
|
-
hash == other_attribute.hash
|
22
|
-
end
|
23
|
-
|
24
|
-
def eql?(other)
|
25
|
-
self == other
|
26
|
-
end
|
27
|
-
|
28
|
-
# Generate a hash for comparisons
|
29
|
-
def hash
|
30
|
-
[@attribute, @klass].hash
|
31
|
-
end
|
32
|
-
|
33
|
-
# Return whether the attribute is read-only
|
34
|
-
def readonly?
|
35
|
-
!!@opts[:readonly]
|
36
|
-
end
|
37
|
-
|
38
|
-
def to_s
|
39
|
-
"#<Encore::Attribute #{@klass}@#{@attribute}>"
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
@@ -1,27 +0,0 @@
|
|
1
|
-
module Encore
|
2
|
-
module Entity
|
3
|
-
module Input
|
4
|
-
module Associations
|
5
|
-
extend ActiveSupport::Concern
|
6
|
-
|
7
|
-
module ClassMethods
|
8
|
-
def expose_one(column, opts = {})
|
9
|
-
expose_association(:one, column, opts)
|
10
|
-
end
|
11
|
-
|
12
|
-
def expose_many(column, opts = {})
|
13
|
-
expose_association(:many, column, opts)
|
14
|
-
end
|
15
|
-
|
16
|
-
protected
|
17
|
-
|
18
|
-
def expose_association(type, column, opts)
|
19
|
-
@exposed_attributes ||= []
|
20
|
-
association_class = Encore::Association.const_get("Has#{type.to_s.capitalize}Association")
|
21
|
-
@exposed_attributes << association_class.new(self, column.to_sym, opts)
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
@@ -1,37 +0,0 @@
|
|
1
|
-
module Encore
|
2
|
-
module Entity
|
3
|
-
module Input
|
4
|
-
module ExposedAttributes
|
5
|
-
extend ActiveSupport::Concern
|
6
|
-
|
7
|
-
module ClassMethods
|
8
|
-
# Declare a new exposed attribute
|
9
|
-
def expose(column, opts = {})
|
10
|
-
@exposed_attributes ||= []
|
11
|
-
@exposed_attributes << Encore::Attribute.new(self, column.to_sym, opts)
|
12
|
-
end
|
13
|
-
|
14
|
-
# Return whether an attribute is exposed by the entity
|
15
|
-
def exposed_attribute?(attribute)
|
16
|
-
@exposed_attributes.detect { |a| attribute == a }
|
17
|
-
end
|
18
|
-
|
19
|
-
# Return whether an attribute is exposed by the entity
|
20
|
-
def modifiable_attribute?(attribute)
|
21
|
-
modifiable_attributes.include?(attribute)
|
22
|
-
end
|
23
|
-
|
24
|
-
# Return a list of all exposed attributes
|
25
|
-
def exposed_attributes
|
26
|
-
@exposed_attributes
|
27
|
-
end
|
28
|
-
|
29
|
-
# Return a list of all attributes that can be modified
|
30
|
-
def modifiable_attributes
|
31
|
-
@exposed_attributes.reject(&:readonly?)
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
data/lib/encore/entity/input.rb
DELETED
@@ -1,73 +0,0 @@
|
|
1
|
-
require 'encore/entity/input/errors'
|
2
|
-
require 'encore/entity/input/exposed_attributes'
|
3
|
-
require 'encore/entity/input/associations'
|
4
|
-
|
5
|
-
module Encore
|
6
|
-
module Entity
|
7
|
-
module Input
|
8
|
-
extend ActiveSupport::Concern
|
9
|
-
|
10
|
-
included do
|
11
|
-
extend ActiveModel::Callbacks
|
12
|
-
include Encore::Entity::Input::ExposedAttributes
|
13
|
-
include Encore::Entity::Input::Associations
|
14
|
-
define_model_callbacks :save
|
15
|
-
|
16
|
-
# Expose ID as a readonly attribute
|
17
|
-
expose :id, readonly: true
|
18
|
-
|
19
|
-
# Make the context accessible
|
20
|
-
attr_reader :context
|
21
|
-
end
|
22
|
-
|
23
|
-
# Assign specific attribute to the object
|
24
|
-
def assign_attributes(attributes = {}, opts = nil)
|
25
|
-
# Find the right context
|
26
|
-
unless @context = opts.try(:delete, :context)
|
27
|
-
@context = @object.persisted? ? :partial_update : :create
|
28
|
-
end
|
29
|
-
|
30
|
-
# Convert attribute keys to Attribute objects
|
31
|
-
attributes = self.class.map_attributes(self.class, attributes)
|
32
|
-
|
33
|
-
# Loop through every passed attribute and set it
|
34
|
-
assign_provided_attributes(attributes)
|
35
|
-
|
36
|
-
# If we're doing an update, for any exposed attribute that wasn't passed, set it to nil
|
37
|
-
reset_forgotten_attributes(attributes)
|
38
|
-
end
|
39
|
-
|
40
|
-
protected
|
41
|
-
|
42
|
-
def assign_provided_attributes(attributes)
|
43
|
-
attributes.each_pair do |attribute, value|
|
44
|
-
if self.class.modifiable_attribute?(attribute)
|
45
|
-
attribute.assign(self, value)
|
46
|
-
else
|
47
|
-
raise Encore::Entity::Input::InvalidAttributeError.new("The #{attribute} attribute is not exposed.")
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
def reset_forgotten_attributes(attributes)
|
53
|
-
if @context == :update
|
54
|
-
(self.class.modifiable_attributes - attributes.keys).each do |attribute|
|
55
|
-
attribute.assign(self, nil)
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
module ClassMethods
|
61
|
-
def map_attributes(klass, params)
|
62
|
-
params.inject({}) do |memo, (attribute, value)|
|
63
|
-
exposed_attribute = klass.exposed_attributes.detect { |a| a.attribute == attribute }
|
64
|
-
key = exposed_attribute || Attribute.new(klass, attribute.to_sym)
|
65
|
-
|
66
|
-
memo.merge key => value
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
end
|
71
|
-
end
|
72
|
-
end
|
73
|
-
end
|
@@ -1,14 +0,0 @@
|
|
1
|
-
module Encore
|
2
|
-
module Entity
|
3
|
-
module Output
|
4
|
-
module JSON
|
5
|
-
# Return each exposed attribute as a JSON value
|
6
|
-
def as_json(args = {})
|
7
|
-
self.class.exposed_attributes.inject({}) do |memo, item|
|
8
|
-
memo.merge item.attribute => item.fetch(self)
|
9
|
-
end
|
10
|
-
end
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
data/lib/encore/entity/output.rb
DELETED
data/lib/encore/entity.rb
DELETED
@@ -1,44 +0,0 @@
|
|
1
|
-
require 'encore/entity/input'
|
2
|
-
require 'encore/entity/output'
|
3
|
-
|
4
|
-
module Encore
|
5
|
-
module Entity
|
6
|
-
extend ActiveSupport::Concern
|
7
|
-
|
8
|
-
included do
|
9
|
-
include Input
|
10
|
-
include Output
|
11
|
-
|
12
|
-
# Make `object` accessible for others
|
13
|
-
attr_accessor :object
|
14
|
-
end
|
15
|
-
|
16
|
-
# Initialize a new entity, linked to an ActiveRecord object
|
17
|
-
# If no object is passed, let's try to build a new one
|
18
|
-
def initialize(object = nil)
|
19
|
-
@object = object || self.class.linked_class.new
|
20
|
-
end
|
21
|
-
|
22
|
-
# Save the object
|
23
|
-
def save
|
24
|
-
run_callbacks(:save) { @object.save }
|
25
|
-
end
|
26
|
-
|
27
|
-
# Delegate everything to the object
|
28
|
-
def method_missing(method, *args, &blk)
|
29
|
-
if @object.respond_to?(method)
|
30
|
-
@object.send(method, *args, &blk)
|
31
|
-
else
|
32
|
-
super
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
module ClassMethods
|
37
|
-
# Return the object class. If no object is present, try to
|
38
|
-
# guess the class with our own class name (`UserEntity` would be `User`)
|
39
|
-
def linked_class
|
40
|
-
@object ? @object.class : self.name.split(/Entity$/).first.constantize
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
@@ -1,37 +0,0 @@
|
|
1
|
-
module Encore
|
2
|
-
module Helpers
|
3
|
-
module ControllerHelper
|
4
|
-
HTTP_ERROR_STATUS_CODE = 422
|
5
|
-
HTTP_SUCCESS_CODE = 200
|
6
|
-
HTTP_SUCCESS_CREATED_CODE = 201
|
7
|
-
|
8
|
-
# Inject itself into the ActionController::Base class
|
9
|
-
def self.inject_into_action_controller
|
10
|
-
::ActionController::Base.send :include, self
|
11
|
-
end
|
12
|
-
|
13
|
-
# Save the entity and return a JSON response
|
14
|
-
def process!(entity)
|
15
|
-
error_status = HTTP_ERROR_STATUS_CODE
|
16
|
-
success_status = success_status_code_from_entity(entity)
|
17
|
-
|
18
|
-
if entity.save
|
19
|
-
render json: entity, status: success_status
|
20
|
-
else
|
21
|
-
render json: { errors: entity.errors }, status: error_status
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
protected
|
26
|
-
|
27
|
-
# Return the status code to send after a successful processing
|
28
|
-
# of an entity, depending on its context
|
29
|
-
def success_status_code_from_entity(entity)
|
30
|
-
case entity.context
|
31
|
-
when :create then HTTP_SUCCESS_CREATED_CODE
|
32
|
-
else HTTP_SUCCESS_CODE
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
data/lib/encore/helpers.rb
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
require 'encore/helpers/controller_helper'
|