rom-repository 1.0.0.rc1 → 1.0.0.rc2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a6bc1f6b343814740048fa138304b11012da7116
4
- data.tar.gz: f61f8773af19190816e3d372fb44f3c94e6b5cef
3
+ metadata.gz: abd8ee5d8b4132b20ab01c4fc4ee586c26b0e7ac
4
+ data.tar.gz: c4f4b25f08b77773c33b585e41cf20b7725f324f
5
5
  SHA512:
6
- metadata.gz: 57f9e84fa9ed7296a5d792c4d887777083c01685f63f80fe94f22ee50ed0f12f82b06ebfe8f48930a4a1c42aa7004a85e75fa38c2d330419636a26ce14b17a1a
7
- data.tar.gz: cbf38fe68a94152d598025f496061f2d25cfcea5670712e426b47325b12bb9bafeaf6ea34b410931949f41ed56d9aaa4bb5f5c73a478e5c78d4a1525be33f82c
6
+ metadata.gz: cb3fe13af29c34580949161270134dfcc53a80fe083948bde31c0eb8126b710c962df8b76a5d0fb371f5e5ae776eafc7df036dc151038220af812036d713c72b
7
+ data.tar.gz: 788fa703d7e283afbf330059ce7466b8882ed907ecc8e8ca65ff90a297f0f710167afe4e13d7d7e14d27b9fe5697ee1d3b28bc34c5b51f2443092b35b3d29e2a
data/CHANGELOG.md CHANGED
@@ -24,6 +24,7 @@
24
24
  ### Fixed
25
25
 
26
26
  * FKs are always included in auto-generated structs used in aggregates (solnic)
27
+ * Calling undefined methods on repo relations raises a nicer error (solnic)
27
28
 
28
29
  [Compare v0.3.1...v1.0.0](https://github.com/rom-rb/rom-repository/compare/v0.3.1...v1.0.0)
29
30
 
@@ -9,11 +9,8 @@ module ROM
9
9
  # If you inherit from this class you need to configure additional settings
10
10
  #
11
11
  # @example define a custom changeset using :upsert command
12
- #
13
12
  # class NewTag < ROM::Changeset[:tags]
14
- # def default_command_type
15
- # :upsert
16
- # end
13
+ # command_type :upsert
17
14
  # end
18
15
  #
19
16
  # @abstract
@@ -2,6 +2,8 @@ module ROM
2
2
  class Changeset
3
3
  # Changeset specialization for create commands
4
4
  #
5
+ # @see Changeset::Stateful
6
+ #
5
7
  # @api public
6
8
  class Create < Stateful
7
9
  command_type :create
@@ -52,7 +52,9 @@ module ROM
52
52
  # end
53
53
  # end
54
54
  #
55
- # @return [Array<Pipe, Transproc::Function>]
55
+ # @return [Array<Pipe>, Transproc::Function>]
56
+ #
57
+ # @see https://github.com/solnic/transproc Transproc
56
58
  #
57
59
  # @api public
58
60
  def self.map(&block)
@@ -100,8 +102,6 @@ module ROM
100
102
  # @example
101
103
  # changeset.map { |tuple| tuple.merge(created_at: Time.now) }
102
104
  #
103
- # @param [Array<Symbol>] steps A list of mapping steps
104
- #
105
105
  # @overload map(*steps, &block)
106
106
  # Apply mapping using built-in transformations and a custom block
107
107
  #
@@ -9,6 +9,8 @@ module ROM
9
9
  # you need to implement it yourself in your relations if you want to
10
10
  # use Update changesets.
11
11
  #
12
+ # @see Changeset::Stateful
13
+ #
12
14
  # @api public
13
15
  class Update < Stateful
14
16
  command_type :update
@@ -65,7 +67,7 @@ module ROM
65
67
 
66
68
  # Calculate the diff between the original and changeset data
67
69
  #
68
- # @return [Hash, Array]
70
+ # @return [Hash]
69
71
  #
70
72
  # @api public
71
73
  def diff
@@ -112,11 +112,12 @@ module ROM
112
112
 
113
113
  # @api private
114
114
  def define_command_method(type, **opts)
115
- define_method(type) do |input|
116
- if input.respond_to?(:commit)
117
- map_tuple(input.relation, input.commit)
115
+ define_method(type) do |*input|
116
+ if input.size == 1 && input[0].respond_to?(:commit)
117
+ changeset = input[0]
118
+ map_tuple(changeset.relation, changeset.commit)
118
119
  else
119
- command(type => self.class.root, **opts).call(input)
120
+ command(type => self.class.root, **opts).call(*input)
120
121
  end
121
122
  end
122
123
  end
@@ -117,13 +117,33 @@ module ROM
117
117
  if type
118
118
  register_command(name, type, meta, parent_relation)
119
119
 
120
- mapping =
120
+ default_mapping =
121
121
  if meta[:combine_type] == :many
122
122
  name
123
- else
123
+ else meta[:combine_type] == :one
124
124
  { Dry::Core::Inflector.singularize(name).to_sym => name }
125
125
  end
126
126
 
127
+ mapping =
128
+ if parent_relation
129
+ associations = container.relations[parent_relation].associations
130
+
131
+ assoc =
132
+ if associations.key?(meta[:combine_name])
133
+ associations[meta[:combine_name]]
134
+ elsif associations.key?(name)
135
+ associations[name]
136
+ end
137
+
138
+ if assoc
139
+ { assoc.target.key => assoc.target.dataset }
140
+ else
141
+ default_mapping
142
+ end
143
+ else
144
+ default_mapping
145
+ end
146
+
127
147
  if other.size > 0
128
148
  [mapping, [type, other]]
129
149
  else
@@ -64,7 +64,7 @@ module ROM
64
64
  # Map tuples using registered mappers
65
65
  #
66
66
  # @example
67
- # users.as(MyUserModel)
67
+ # users.map_with(:my_mapper, :my_other_mapper)
68
68
  #
69
69
  # @param [Array<Symbol>] mappers A list of mapper identifiers
70
70
  #
@@ -74,6 +74,8 @@ module ROM
74
74
  def map_with(*names)
75
75
  if names.size == 1 && names[0].is_a?(Class)
76
76
  with(meta: meta.merge(model: names[0]))
77
+ elsif names.size > 1 && names.any? { |name| name.is_a?(Class) }
78
+ raise ArgumentError, 'using custom mappers and a model is not supported'
77
79
  else
78
80
  names.reduce(self) { |a, e| a >> relation.mappers[e] }
79
81
  end
@@ -225,7 +227,7 @@ module ROM
225
227
  result
226
228
  end
227
229
  else
228
- super
230
+ raise NoMethodError, "undefined method `#{meth}' for #{relation.class.name}"
229
231
  end
230
232
  end
231
233
  end
@@ -1,5 +1,5 @@
1
1
  module ROM
2
2
  class Repository
3
- VERSION = '1.0.0.rc1'.freeze
3
+ VERSION = '1.0.0.rc2'.freeze
4
4
  end
5
5
  end
@@ -58,6 +58,19 @@ RSpec.describe ROM::Repository, '.command' do
58
58
  expect(updated_user.name).to eql('Jane Doe')
59
59
  end
60
60
 
61
+ it 'allows to configure :delete command without args' do
62
+ repo = Class.new(ROM::Repository[:users]) do
63
+ commands :delete
64
+ end.new(rom)
65
+
66
+ repo.users.insert(name: 'Jane')
67
+ repo.users.insert(name: 'John')
68
+
69
+ repo.delete
70
+
71
+ expect(repo.users.count).to be_zero
72
+ end
73
+
61
74
  it 'allows defining a single command with multiple views' do
62
75
  repo = Class.new(ROM::Repository[:users]) do
63
76
  commands :create, update: [:by_pk, :by_name]
@@ -92,6 +92,16 @@ RSpec.describe ROM::Repository, '#command' do
92
92
  expect(user.tasks.first.title).to eql('Task one')
93
93
  end
94
94
 
95
+ it 'builds Create command for a relation graph with one-to-many with aliased association' do
96
+ create_user = repo.command(:create, repo.users.combine(:aliased_posts))
97
+
98
+ user = create_user.call(name: 'Jane Doe', aliased_posts: [{ title: 'Post one' }, { title: 'Post two' }])
99
+
100
+ expect(user.id).to_not be(nil)
101
+ expect(user.name).to eql('Jane Doe')
102
+ expect(user.aliased_posts.size).to be(2)
103
+ end
104
+
95
105
  it 'builds Create command for a deeply nested graph with one-to-many' do
96
106
  create_user = repo.command(
97
107
  :create,
@@ -19,6 +19,7 @@ RSpec.shared_context 'relations' do
19
19
  schema(infer: true) do
20
20
  associations do
21
21
  has_many :posts
22
+ has_many :posts, as: :aliased_posts
22
23
  has_many :labels, through: :posts
23
24
  end
24
25
  end
data/spec/spec_helper.rb CHANGED
@@ -33,6 +33,13 @@ end
33
33
  require 'dry/core/deprecations'
34
34
  Dry::Core::Deprecations.set_logger!(root.join('../log/deprecations.log'))
35
35
 
36
+ # Make inference errors quiet
37
+ class ROM::SQL::Schema::Inferrer
38
+ def self.on_error(*args)
39
+ # shush
40
+ end
41
+ end
42
+
36
43
  # Namespace holding all objects created during specs
37
44
  module Test
38
45
  def self.remove_constants
@@ -61,6 +61,11 @@ RSpec.describe 'loading proxy' do
61
61
  [{ id: 1, name: 'Jane' }, {id: 2, name: 'Joe' }]
62
62
  )
63
63
  end
64
+
65
+ it 'raises error when custom mapper is used with a model class' do
66
+ expect { users.map_with(:name_list, Class.new) }.
67
+ to raise_error(ArgumentError, 'using custom mappers and a model is not supported')
68
+ end
64
69
  end
65
70
 
66
71
  context 'setting custom model type' do
@@ -182,7 +187,7 @@ RSpec.describe 'loading proxy' do
182
187
  end
183
188
 
184
189
  it 'raises when method is missing' do
185
- expect { users.not_here }.to raise_error(NoMethodError, /not_here/)
190
+ expect { users.not_here }.to raise_error(NoMethodError, "undefined method `not_here' for ROM::Relation[Users]")
186
191
  end
187
192
  end
188
193
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rom-repository
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0.rc1
4
+ version: 1.0.0.rc2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Piotr Solnica
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-01-24 00:00:00.000000000 Z
11
+ date: 2017-01-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rom