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
data/lib/encore/railtie.rb
DELETED
@@ -1,11 +0,0 @@
|
|
1
|
-
require 'encore'
|
2
|
-
require 'rails'
|
3
|
-
require 'action_controller'
|
4
|
-
|
5
|
-
module Encore
|
6
|
-
class Railtie < Rails::Railtie
|
7
|
-
initializer 'encore.action_controller' do |app|
|
8
|
-
ActiveSupport.on_load :action_controller, {}, &Encore::Helpers::ControllerHelper.inject_into_action_controller
|
9
|
-
end
|
10
|
-
end
|
11
|
-
end
|
@@ -1,48 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe Encore::Entity::Input::Associations do
|
4
|
-
describe :ClassMethods do
|
5
|
-
describe :has_one do
|
6
|
-
before do
|
7
|
-
spawn_model(:User) { belongs_to :organization }
|
8
|
-
spawn_model(:Organization) { has_many :users }
|
9
|
-
|
10
|
-
spawn_entity :UserEntity do
|
11
|
-
expose :name
|
12
|
-
expose_one :organization
|
13
|
-
end
|
14
|
-
|
15
|
-
run_migration do
|
16
|
-
create_table(:users, force: true) do |t|
|
17
|
-
t.string :name
|
18
|
-
t.integer :organization_id
|
19
|
-
t.timestamps
|
20
|
-
end
|
21
|
-
|
22
|
-
create_table(:organizations, force: true)
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
let(:organization) { Organization.create }
|
27
|
-
let(:other_organization) { Organization.create }
|
28
|
-
let(:user) { organization.users.create(name: 'Art Vandelay') }
|
29
|
-
let(:entity) { UserEntity.new(user) }
|
30
|
-
|
31
|
-
context 'when assigning attributes' do
|
32
|
-
before { entity.assign_attributes organization: other_organization.id }
|
33
|
-
it { expect(entity.object.organization_id).to eql organization.id }
|
34
|
-
it { expect(entity.encore_tmp_organization_id).to eql other_organization.id }
|
35
|
-
end
|
36
|
-
|
37
|
-
context 'when saving the entity' do
|
38
|
-
before do
|
39
|
-
entity.assign_attributes organization: other_organization.id
|
40
|
-
entity.save
|
41
|
-
end
|
42
|
-
|
43
|
-
it { expect(entity.object.organization_id).to eql other_organization.id }
|
44
|
-
it { expect(entity.encore_tmp_organization_id).to be_nil }
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
@@ -1,46 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe Encore::Entity::Input::ExposedAttributes do
|
4
|
-
shared_examples 'exposability' do
|
5
|
-
before do
|
6
|
-
spawn_object_class!
|
7
|
-
end
|
8
|
-
|
9
|
-
context 'with attribute name' do
|
10
|
-
it { expect{ entity.assign_attributes(name: 'Art Vandelay') }.to raise_error(Encore::Entity::Input::InvalidAttributeError) }
|
11
|
-
end
|
12
|
-
|
13
|
-
context 'with column name' do
|
14
|
-
before { entity.assign_attributes fullname: 'Art Vandelay' }
|
15
|
-
it { expect(entity.object.name).to eql 'Art Vandelay' }
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
let(:entity) { UserEntity.new }
|
20
|
-
|
21
|
-
before do
|
22
|
-
spawn_entity :UserEntity do
|
23
|
-
expose :name, as: :fullname
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
context 'with ActiveRecord model' do
|
28
|
-
let(:spawn_object_class!) do
|
29
|
-
spawn_model :User
|
30
|
-
|
31
|
-
run_migration do
|
32
|
-
create_table(:users, force: true) do |t|
|
33
|
-
t.string :name
|
34
|
-
t.timestamps
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
it_has_behavior 'exposability'
|
40
|
-
end
|
41
|
-
|
42
|
-
context 'with OpenStruct structure' do
|
43
|
-
let(:spawn_object_class!) { spawn_struct :User }
|
44
|
-
it_has_behavior 'exposability'
|
45
|
-
end
|
46
|
-
end
|
@@ -1,104 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe Encore::Entity::Input do
|
4
|
-
describe :InstanceMethods do
|
5
|
-
describe :assign_attributes do
|
6
|
-
before do
|
7
|
-
spawn_model :User
|
8
|
-
|
9
|
-
spawn_entity :UserEntity do
|
10
|
-
expose :name
|
11
|
-
expose :email
|
12
|
-
expose :created_at, readonly: true
|
13
|
-
expose :updated_at, readonly: true
|
14
|
-
end
|
15
|
-
|
16
|
-
run_migration do
|
17
|
-
create_table(:users, force: true) do |t|
|
18
|
-
t.string :email
|
19
|
-
t.string :name
|
20
|
-
t.timestamps
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
let(:assign_attributes!) { entity.assign_attributes attributes, context: context }
|
26
|
-
|
27
|
-
context 'with :create context' do
|
28
|
-
let(:entity) { UserEntity.new }
|
29
|
-
let(:attributes) { { email: 'art@vandelay.com' } }
|
30
|
-
let(:context) { :create }
|
31
|
-
|
32
|
-
before { assign_attributes! }
|
33
|
-
|
34
|
-
it { expect(entity.object.email).to eql 'art@vandelay.com' }
|
35
|
-
it { expect(entity.object.name).to be_blank }
|
36
|
-
it { expect(entity.object.created_at).to be_blank }
|
37
|
-
it { expect(entity.object.updated_at).to be_blank }
|
38
|
-
end
|
39
|
-
|
40
|
-
context 'with :update context' do
|
41
|
-
let(:entity) { UserEntity.new(User.first) }
|
42
|
-
let(:context) { :update }
|
43
|
-
let(:create_user!) { User.create(email: 'art@vandelay.com', name: 'Art Vandelay') }
|
44
|
-
|
45
|
-
before { create_user! }
|
46
|
-
|
47
|
-
context 'when updating valid attributes' do
|
48
|
-
let(:attributes) { { email: 'art+test@vandelay.com' } }
|
49
|
-
before { assign_attributes! }
|
50
|
-
|
51
|
-
it { expect(entity.object.email).to eql 'art+test@vandelay.com' }
|
52
|
-
it { expect(entity.object.name).to be_blank }
|
53
|
-
it { expect(entity.object.created_at).to_not be_blank }
|
54
|
-
it { expect(entity.object.updated_at).to_not be_blank }
|
55
|
-
end
|
56
|
-
|
57
|
-
context 'when updating a protected attribute' do
|
58
|
-
let(:attributes) { { email: 'art+test@vandelay.com', created_at: '2013-08-29 21:22:44' } }
|
59
|
-
|
60
|
-
it { expect { assign_attributes! }.to raise_error(Encore::Entity::Input::InvalidAttributeError) }
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
|
-
context 'with :partial_update context' do
|
65
|
-
let(:entity) { UserEntity.new(User.first) }
|
66
|
-
let(:attributes) { { email: 'art+test@vandelay.com' } }
|
67
|
-
let(:context) { :partial_update }
|
68
|
-
let(:create_user!) { User.create(email: 'art@vandelay.com', name: 'Art Vandelay') }
|
69
|
-
|
70
|
-
before do
|
71
|
-
create_user!
|
72
|
-
assign_attributes!
|
73
|
-
end
|
74
|
-
|
75
|
-
it { expect(entity.object.email).to eql 'art+test@vandelay.com' }
|
76
|
-
it { expect(entity.object.name).to eql 'Art Vandelay' }
|
77
|
-
it { expect(entity.object.created_at).to_not be_blank }
|
78
|
-
it { expect(entity.object.updated_at).to_not be_blank }
|
79
|
-
end
|
80
|
-
|
81
|
-
context 'with overriden setter method' do
|
82
|
-
before do
|
83
|
-
class UserEntity
|
84
|
-
def name=(name)
|
85
|
-
object.name = name.upcase
|
86
|
-
end
|
87
|
-
end
|
88
|
-
end
|
89
|
-
|
90
|
-
let(:entity) { UserEntity.new(User.first) }
|
91
|
-
let(:attributes) { { name: 'Art Vandelay' } }
|
92
|
-
let(:context) { :partial_update }
|
93
|
-
let(:create_user!) { User.create }
|
94
|
-
|
95
|
-
before do
|
96
|
-
create_user!
|
97
|
-
assign_attributes!
|
98
|
-
end
|
99
|
-
|
100
|
-
it { expect(entity.object.name).to eql 'ART VANDELAY' }
|
101
|
-
end
|
102
|
-
end
|
103
|
-
end
|
104
|
-
end
|
@@ -1,76 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe Encore::Entity::Output::JSON do
|
4
|
-
describe :InstanceMethods do
|
5
|
-
describe :as_json do
|
6
|
-
context 'for simple entity' do
|
7
|
-
before do
|
8
|
-
# Create a model
|
9
|
-
spawn_model :User
|
10
|
-
|
11
|
-
# Create an entity
|
12
|
-
spawn_entity :UserEntity do
|
13
|
-
expose :name
|
14
|
-
end
|
15
|
-
|
16
|
-
run_migration do
|
17
|
-
create_table(:users, force: true) do |t|
|
18
|
-
t.string :name
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
let(:user) { User.create(name: 'Art Vandelay') }
|
24
|
-
let(:entity) { UserEntity.new(user) }
|
25
|
-
let(:json) { entity.as_json }
|
26
|
-
|
27
|
-
it { expect(json.keys).to include :id, :name }
|
28
|
-
it { expect(json[:id]).to eql user.id }
|
29
|
-
it { expect(json[:name]).to eql 'Art Vandelay' }
|
30
|
-
end
|
31
|
-
|
32
|
-
context 'for entity with associations' do
|
33
|
-
before do
|
34
|
-
# Create a model
|
35
|
-
spawn_model :User do
|
36
|
-
has_many :comments
|
37
|
-
end
|
38
|
-
|
39
|
-
# Create a model
|
40
|
-
spawn_model :Comment
|
41
|
-
|
42
|
-
# Create an entity
|
43
|
-
spawn_entity :UserEntity do
|
44
|
-
expose :name
|
45
|
-
expose_many :comments
|
46
|
-
end
|
47
|
-
|
48
|
-
run_migration do
|
49
|
-
create_table(:users, force: true) do |t|
|
50
|
-
t.string :name
|
51
|
-
end
|
52
|
-
|
53
|
-
create_table(:comments, force: true) do |t|
|
54
|
-
t.text :body
|
55
|
-
t.integer :user_id
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
let(:user) do
|
61
|
-
User.create(name: 'Art Vandelay').tap do |user|
|
62
|
-
user.comments << Comment.create(body: 'Test 1')
|
63
|
-
user.comments << Comment.create(body: 'Test 2')
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
let(:entity) { UserEntity.new(user) }
|
68
|
-
let(:json) { entity.as_json }
|
69
|
-
|
70
|
-
it { expect(json.keys).to include :id, :name, :comments }
|
71
|
-
it { expect(json[:comments]).to be_instance_of Array }
|
72
|
-
it { expect(json[:comments]).to include *Comment.pluck(:id) }
|
73
|
-
end
|
74
|
-
end
|
75
|
-
end
|
76
|
-
end
|
data/spec/encore/entity_spec.rb
DELETED
@@ -1,31 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe Encore::Entity do
|
4
|
-
describe :InstanceMethods do
|
5
|
-
describe :method_missing do
|
6
|
-
before do
|
7
|
-
spawn_model :User
|
8
|
-
spawn_entity(:UserEntity) { expose :name }
|
9
|
-
|
10
|
-
run_migration do
|
11
|
-
create_table(:users, force: true) do |t|
|
12
|
-
t.string :name
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
let(:user) { User.create }
|
18
|
-
let(:entity) { UserEntity.new(user) }
|
19
|
-
|
20
|
-
context 'for delegated method' do
|
21
|
-
before { expect(user).to receive(:save) }
|
22
|
-
specify { entity.save }
|
23
|
-
end
|
24
|
-
|
25
|
-
context 'for setter method' do
|
26
|
-
before { expect(user).to receive(:name=).with('Art Vandelay') }
|
27
|
-
specify { entity.name = "Art Vandelay" }
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
@@ -1,59 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe Encore::Helpers::ControllerHelper do
|
4
|
-
describe :process! do
|
5
|
-
before do
|
6
|
-
# Create a model
|
7
|
-
spawn_model :User
|
8
|
-
|
9
|
-
# Create a controller
|
10
|
-
spawn_controller :UsersController do
|
11
|
-
before_filter :fetch_user, only: [:update]
|
12
|
-
|
13
|
-
define_method :create do
|
14
|
-
@entity = UserEntity.new
|
15
|
-
@entity.assign_attributes(params[:user], context: :create)
|
16
|
-
process! @entity
|
17
|
-
end
|
18
|
-
|
19
|
-
define_method :update do
|
20
|
-
@entity = UserEntity.new(@user)
|
21
|
-
@entity.assign_attributes(params[:user], context: :update0)
|
22
|
-
process! @entity
|
23
|
-
end
|
24
|
-
|
25
|
-
define_method :fetch_user do
|
26
|
-
@user = User.find(params[:id])
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
# Create an entity
|
31
|
-
spawn_entity :UserEntity do
|
32
|
-
expose :name
|
33
|
-
end
|
34
|
-
|
35
|
-
run_migration do
|
36
|
-
create_table(:users, force: true) do |t|
|
37
|
-
t.string :name
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
let(:request) { ActionDispatch::TestRequest.new }
|
43
|
-
let(:env) { request.env.tap { |e| e['action_dispatch.request.parameters'] = params } }
|
44
|
-
|
45
|
-
context 'for create context' do
|
46
|
-
let(:params) { { user: { name: 'H.E. Pennypacker' } } }
|
47
|
-
let(:response) { UsersController.action(:create).call(env) }
|
48
|
-
it { expect(response.first).to eql 201 }
|
49
|
-
end
|
50
|
-
|
51
|
-
context 'for update context' do
|
52
|
-
before { User.create(name: 'Art Vandelay') }
|
53
|
-
|
54
|
-
let(:params) { { id: 1, user: { name: 'H.E. Pennypacker' } } }
|
55
|
-
let(:response) { UsersController.action(:update).call(env) }
|
56
|
-
it { expect(response.first).to eql 200 }
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|