granite-form 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (66) hide show
  1. checksums.yaml +4 -4
  2. data/.github/CODEOWNERS +1 -2
  3. data/.github/workflows/{ci.yml → ruby.yml} +22 -4
  4. data/.rubocop.yml +1 -1
  5. data/.rubocop_todo.yml +3 -3
  6. data/Appraisals +1 -2
  7. data/CHANGELOG.md +7 -0
  8. data/README.md +0 -2
  9. data/docker-compose.yml +14 -0
  10. data/gemfiles/rails.5.0.gemfile +0 -1
  11. data/gemfiles/rails.5.1.gemfile +0 -1
  12. data/gemfiles/rails.5.2.gemfile +0 -1
  13. data/granite-form.gemspec +15 -15
  14. data/lib/granite/form/active_record/associations.rb +1 -1
  15. data/lib/granite/form/base.rb +1 -2
  16. data/lib/granite/form/errors.rb +0 -15
  17. data/lib/granite/form/model/associations/base.rb +0 -4
  18. data/lib/granite/form/model/associations/collection/embedded.rb +2 -1
  19. data/lib/granite/form/model/associations/collection/proxy.rb +1 -1
  20. data/lib/granite/form/model/associations/embeds_any.rb +7 -0
  21. data/lib/granite/form/model/associations/embeds_many.rb +9 -58
  22. data/lib/granite/form/model/associations/embeds_one.rb +7 -36
  23. data/lib/granite/form/model/associations/nested_attributes.rb +5 -5
  24. data/lib/granite/form/model/associations/persistence_adapters/active_record.rb +0 -4
  25. data/lib/granite/form/model/associations/persistence_adapters/base.rb +0 -4
  26. data/lib/granite/form/model/associations/references_many.rb +0 -32
  27. data/lib/granite/form/model/associations/references_one.rb +0 -28
  28. data/lib/granite/form/model/associations/reflections/embeds_any.rb +1 -1
  29. data/lib/granite/form/model/associations/reflections/references_any.rb +0 -4
  30. data/lib/granite/form/model/associations/reflections/references_one.rb +0 -2
  31. data/lib/granite/form/model/associations/reflections/singular.rb +0 -8
  32. data/lib/granite/form/model/associations.rb +0 -6
  33. data/lib/granite/form/model/attributes/base.rb +1 -1
  34. data/lib/granite/form/model/attributes/reflections/attribute.rb +0 -6
  35. data/lib/granite/form/model/attributes/reflections/base.rb +8 -7
  36. data/lib/granite/form/model/attributes/reflections/reference_one.rb +0 -6
  37. data/lib/granite/form/model/persistence.rb +1 -19
  38. data/lib/granite/form/model.rb +0 -2
  39. data/lib/granite/form/version.rb +1 -1
  40. data/spec/granite/form/active_record/associations_spec.rb +16 -18
  41. data/spec/granite/form/model/associations/embeds_many_spec.rb +29 -305
  42. data/spec/granite/form/model/associations/embeds_one_spec.rb +27 -212
  43. data/spec/granite/form/model/associations/nested_attributes_spec.rb +0 -95
  44. data/spec/granite/form/model/associations/references_many_spec.rb +5 -326
  45. data/spec/granite/form/model/associations/references_one_spec.rb +6 -278
  46. data/spec/granite/form/model/associations/reflections/embeds_any_spec.rb +1 -2
  47. data/spec/granite/form/model/associations/reflections/embeds_many_spec.rb +18 -26
  48. data/spec/granite/form/model/associations/reflections/embeds_one_spec.rb +16 -23
  49. data/spec/granite/form/model/associations/reflections/references_many_spec.rb +1 -1
  50. data/spec/granite/form/model/associations/reflections/references_one_spec.rb +1 -22
  51. data/spec/granite/form/model/associations/validations_spec.rb +0 -3
  52. data/spec/granite/form/model/associations_spec.rb +3 -24
  53. data/spec/granite/form/model/dirty_spec.rb +1 -1
  54. data/spec/granite/form/model/persistence_spec.rb +0 -2
  55. data/spec/granite/form/model/validations/associated_spec.rb +2 -4
  56. data/spec/granite/form/model/validations/nested_spec.rb +2 -4
  57. data/spec/spec_helper.rb +0 -15
  58. data/spec/support/active_record.rb +20 -0
  59. data/spec/support/shared/nested_attribute_examples.rb +3 -21
  60. metadata +32 -38
  61. data/.github/workflows/main.yml +0 -29
  62. data/gemfiles/rails.4.2.gemfile +0 -15
  63. data/lib/granite/form/model/callbacks.rb +0 -72
  64. data/lib/granite/form/model/lifecycle.rb +0 -309
  65. data/spec/granite/form/model/callbacks_spec.rb +0 -337
  66. data/spec/granite/form/model/lifecycle_spec.rb +0 -356
@@ -7,8 +7,6 @@ module Granite
7
7
  module Associations
8
8
  module Reflections
9
9
  class ReferencesOne < ReferencesAny
10
- include Singular
11
-
12
10
  def self.build(target, generated_methods, name, *args, &block)
13
11
  reflection = super
14
12
 
@@ -14,14 +14,6 @@ module Granite
14
14
  def build_#{name} attributes = {}
15
15
  association(:#{name}).build(attributes)
16
16
  end
17
-
18
- def create_#{name} attributes = {}
19
- association(:#{name}).create(attributes)
20
- end
21
-
22
- def create_#{name}! attributes = {}
23
- association(:#{name}).create!(attributes)
24
- end
25
17
  RUBY
26
18
  end
27
19
  end
@@ -100,12 +100,6 @@ module Granite
100
100
  (@_associations ||= {})[reflection.name] ||= reflection.build_association(self)
101
101
  end
102
102
 
103
- def apply_association_changes!
104
- association_names.all? do |name|
105
- association(name).apply_changes!
106
- end
107
- end
108
-
109
103
  private
110
104
 
111
105
  def attributes_for_inspect
@@ -104,7 +104,7 @@ module Granite
104
104
  if block.arity >= 0 && block.arity <= args.length
105
105
  owner.instance_exec(*args.first(block.arity), &block)
106
106
  else
107
- args = block.arity < 0 ? args : args.first(block.arity)
107
+ args = block.arity.negative? ? args : args.first(block.arity)
108
108
  yield(*args, owner)
109
109
  end
110
110
  end
@@ -4,12 +4,6 @@ module Granite
4
4
  module Attributes
5
5
  module Reflections
6
6
  class Attribute < Base
7
- def self.build(target, generated_methods, name, *args, &block)
8
- attribute = super(target, generated_methods, name, *args, &block)
9
- generate_methods name, generated_methods
10
- attribute
11
- end
12
-
13
7
  def self.generate_methods(name, target)
14
8
  target.class_eval <<-RUBY, __FILE__, __LINE__ + 1
15
9
  def #{name}
@@ -7,11 +7,9 @@ module Granite
7
7
  attr_reader :name, :options
8
8
 
9
9
  class << self
10
- def build(_target, _generated_methods, name, *args, &block)
11
- options = args.extract_options!
12
- options[:type] = args.first if args.first
13
- options[:default] = block if block
14
- new(name, options)
10
+ def build(_target, generated_methods, name, *args, &block)
11
+ generate_methods name, generated_methods
12
+ new(name, *args, &block)
15
13
  end
16
14
 
17
15
  def generate_methods(name, target) end
@@ -21,9 +19,12 @@ module Granite
21
19
  end
22
20
  end
23
21
 
24
- def initialize(name, options = {})
22
+ def initialize(name, *args, &block)
25
23
  @name = name.to_s
26
- @options = options
24
+
25
+ @options = args.extract_options!
26
+ @options[:type] = args.first if args.first
27
+ @options[:default] = block if block
27
28
  end
28
29
 
29
30
  def build_attribute(owner, raw_value = Granite::Form::UNDEFINED)
@@ -4,12 +4,6 @@ module Granite
4
4
  module Attributes
5
5
  module Reflections
6
6
  class ReferenceOne < Base
7
- def self.build(_target, generated_methods, name, *args)
8
- options = args.extract_options!
9
- generate_methods name, generated_methods
10
- new(name, options)
11
- end
12
-
13
7
  def self.generate_methods(name, target)
14
8
  target.class_eval <<-RUBY, __FILE__, __LINE__ + 1
15
9
  def #{name}
@@ -26,32 +26,14 @@ module Granite
26
26
  !!@persisted
27
27
  end
28
28
 
29
- def destroyed?
30
- !!@destroyed
31
- end
32
-
33
29
  def marked_for_destruction?
34
- @marked_for_destruction
35
- end
36
-
37
- def mark_for_destruction
38
- @marked_for_destruction = true
39
- end
40
-
41
- def _destroy
42
- marked_for_destruction?
30
+ false
43
31
  end
44
32
 
45
33
  private
46
34
 
47
35
  def mark_persisted!
48
36
  @persisted = true
49
- @destroyed = false
50
- end
51
-
52
- def mark_destroyed!
53
- @persisted = false
54
- @destroyed = true
55
37
  end
56
38
  end
57
39
  end
@@ -3,9 +3,7 @@ require 'granite/form/model/attributes'
3
3
  require 'granite/form/model/validations'
4
4
  require 'granite/form/model/scopes'
5
5
  require 'granite/form/model/primary'
6
- require 'granite/form/model/lifecycle'
7
6
  require 'granite/form/model/persistence'
8
- require 'granite/form/model/callbacks'
9
7
  require 'granite/form/model/associations'
10
8
  require 'granite/form/model/localization'
11
9
  require 'granite/form/model/representation'
@@ -1,5 +1,5 @@
1
1
  module Granite
2
2
  module Form
3
- VERSION = '0.2.0'.freeze
3
+ VERSION = '0.3.0'.freeze
4
4
  end
5
5
  end
@@ -3,7 +3,7 @@ require 'spec_helper'
3
3
  describe Granite::Form::ActiveRecord::Associations do
4
4
  before do
5
5
  stub_model(:project) do
6
- include Granite::Form::Model::Lifecycle
6
+ include Granite::Form::Model::Persistence
7
7
  include Granite::Form::Model::Associations
8
8
 
9
9
  attribute :title, String
@@ -18,7 +18,8 @@ describe Granite::Form::ActiveRecord::Associations do
18
18
  end
19
19
 
20
20
  stub_model(:profile) do
21
- include Granite::Form::Model::Lifecycle
21
+ include Granite::Form::Model::Persistence
22
+ include Granite::Form::Model::Associations
22
23
 
23
24
  attribute :first_name, String
24
25
  attribute :last_name, String
@@ -89,7 +90,10 @@ describe Granite::Form::ActiveRecord::Associations do
89
90
  end
90
91
 
91
92
  context 'with profile already set' do
92
- before { user.create_profile(admin: true) }
93
+ before do
94
+ user.build_profile(admin: true)
95
+ user.save!
96
+ end
93
97
 
94
98
  specify do
95
99
  user.profile.admin = false
@@ -104,13 +108,9 @@ describe Granite::Form::ActiveRecord::Associations do
104
108
  let(:user) { User.create }
105
109
 
106
110
  describe '#projects' do
107
- specify do
108
- expect { user.projects << Project.new }
109
- .not_to change { user.read_attribute(:projects) }
110
- end
111
111
  specify do
112
112
  expect { user.projects << Project.new(title: 'First') }
113
- .to change { user.projects.reload.count }.from(0).to(1)
113
+ .not_to change { user.read_attribute(:projects) }
114
114
  end
115
115
  specify do
116
116
  user.projects << Project.new(title: 'First')
@@ -124,15 +124,14 @@ describe Granite::Form::ActiveRecord::Associations do
124
124
 
125
125
  specify do
126
126
  expect { user.projects << project }
127
- .to change { user.read_attribute(:projects) }.from(nil)
128
- .to([{'title' => 'First', 'author' => {'name' => 'Author'}}])
127
+ .not_to change { user.read_attribute(:projects) }
129
128
  end
130
129
  specify do
131
130
  expect do
132
131
  user.projects << project
133
132
  user.save
134
133
  end
135
- .to change { user.reload.read_attribute(:projects) }.from(nil)
134
+ .to change { user.reload.read_attribute(:projects) }.from([])
136
135
  .to([{'title' => 'First', 'author' => {'name' => 'Author'}}])
137
136
  end
138
137
  end
@@ -150,8 +149,7 @@ describe Granite::Form::ActiveRecord::Associations do
150
149
  end
151
150
  specify do
152
151
  expect { user.profile = Profile.new(first_name: 'google.com') }
153
- .to change { user.read_attribute(:profile) }.from(nil)
154
- .to({first_name: 'google.com', last_name: nil, admin: nil}.to_json)
152
+ .not_to change { user.read_attribute(:profile) }
155
153
  end
156
154
  specify do
157
155
  expect do
@@ -196,16 +194,16 @@ describe Granite::Form::ActiveRecord::Associations do
196
194
 
197
195
  specify { expect(User.reflect_on_association(:projects).klass).to eq(User::Project) }
198
196
  specify { expect(User.new.projects).to eq([]) }
199
- specify { expect(User.new.tap { |u| u.projects.create(title: 'Project') }.projects).to be_a(Granite::Form::Model::Associations::Collection::Embedded) }
200
- specify { expect(User.new.tap { |u| u.projects.create(title: 'Project') }.read_attribute(:projects)).to eq([{title: 'Project'}].to_json) }
197
+ specify { expect(User.new.tap { |u| u.projects.build(title: 'Project') }.projects).to be_a(Granite::Form::Model::Associations::Collection::Embedded) }
198
+ specify { expect(User.new.tap { |u| u.projects.build(title: 'Project') }.projects).to match([have_attributes(title: 'Project')]) }
201
199
 
202
200
  specify { expect(User.reflect_on_association(:profile).klass).to eq(User::Profile) }
203
201
  specify { expect(User.reflect_on_association(:profile).klass).to be < Profile }
204
202
  specify { expect(User.new.profile).to be_nil }
205
- specify { expect(User.new.tap { |u| u.create_profile(first_name: 'Profile') }.profile).to be_a(User::Profile) }
203
+ specify { expect(User.new.tap { |u| u.build_profile(first_name: 'Profile') }.profile).to be_a(User::Profile) }
206
204
  specify do
207
- expect(User.new.tap { |u| u.create_profile(first_name: 'Profile') }.read_attribute(:profile))
208
- .to eq({first_name: 'Profile', last_name: nil, admin: nil, age: nil}.to_json)
205
+ expect(User.new.tap { |u| u.build_profile(first_name: 'Profile') }.profile)
206
+ .to have_attributes(first_name: 'Profile', last_name: nil, admin: nil, age: nil)
209
207
  end
210
208
  end
211
209
  end