rom-repository 0.3.1 → 1.0.0.beta1

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.
Files changed (48) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +11 -13
  3. data/CHANGELOG.md +25 -0
  4. data/Gemfile +13 -3
  5. data/lib/rom/repository.rb +57 -19
  6. data/lib/rom/repository/changeset.rb +89 -26
  7. data/lib/rom/repository/changeset/create.rb +34 -0
  8. data/lib/rom/repository/changeset/delete.rb +15 -0
  9. data/lib/rom/repository/changeset/pipe.rb +11 -4
  10. data/lib/rom/repository/changeset/update.rb +11 -1
  11. data/lib/rom/repository/command_compiler.rb +51 -30
  12. data/lib/rom/repository/command_proxy.rb +3 -1
  13. data/lib/rom/repository/header_builder.rb +3 -3
  14. data/lib/rom/repository/mapper_builder.rb +2 -2
  15. data/lib/rom/repository/relation_proxy.rb +26 -35
  16. data/lib/rom/repository/relation_proxy/combine.rb +59 -27
  17. data/lib/rom/repository/root.rb +4 -6
  18. data/lib/rom/repository/session.rb +55 -0
  19. data/lib/rom/repository/struct_builder.rb +29 -17
  20. data/lib/rom/repository/version.rb +1 -1
  21. data/lib/rom/struct.rb +11 -20
  22. data/rom-repository.gemspec +4 -3
  23. data/spec/integration/command_macros_spec.rb +5 -2
  24. data/spec/integration/command_spec.rb +0 -6
  25. data/spec/integration/multi_adapter_spec.rb +8 -5
  26. data/spec/integration/repository_spec.rb +58 -2
  27. data/spec/integration/root_repository_spec.rb +9 -2
  28. data/spec/integration/typed_structs_spec.rb +31 -0
  29. data/spec/shared/database.rb +5 -1
  30. data/spec/shared/relations.rb +3 -1
  31. data/spec/shared/repo.rb +13 -1
  32. data/spec/shared/structs.rb +39 -0
  33. data/spec/spec_helper.rb +7 -5
  34. data/spec/support/mutant.rb +10 -0
  35. data/spec/unit/changeset/map_spec.rb +42 -0
  36. data/spec/unit/changeset_spec.rb +32 -6
  37. data/spec/unit/relation_proxy_spec.rb +27 -9
  38. data/spec/unit/repository/changeset_spec.rb +125 -0
  39. data/spec/unit/repository/inspect_spec.rb +18 -0
  40. data/spec/unit/repository/session_spec.rb +251 -0
  41. data/spec/unit/session_spec.rb +54 -0
  42. data/spec/unit/struct_builder_spec.rb +45 -1
  43. metadata +41 -17
  44. data/lib/rom/repository/struct_attributes.rb +0 -46
  45. data/spec/unit/header_builder_spec.rb +0 -73
  46. data/spec/unit/plugins/view_spec.rb +0 -29
  47. data/spec/unit/sql/relation_spec.rb +0 -54
  48. data/spec/unit/struct_spec.rb +0 -22
@@ -1,46 +0,0 @@
1
- module ROM
2
- class Repository
3
- # @api private
4
- class StructAttributes < Module
5
- def initialize(attributes)
6
- super()
7
-
8
- define_constructor(attributes)
9
-
10
- module_eval do
11
- include Dry::Equalizer.new(*attributes)
12
-
13
- attr_reader(*attributes)
14
-
15
- define_method(:to_h) do
16
- attributes.each_with_object({}) do |attribute, h|
17
- h[attribute] = __send__(attribute)
18
- end
19
- end
20
- end
21
- end
22
-
23
- def define_constructor(attributes)
24
- module_eval do
25
- def __missing_keyword__(keyword)
26
- raise ArgumentError.new("missing keyword: #{keyword}")
27
- end
28
- private :__missing_keyword__
29
- end
30
-
31
- kwargs = attributes.map { |a| "#{a}: __missing_keyword__(:#{a})" }.join(', ')
32
-
33
- ivs = attributes.map { |a| "@#{a}" }.join(', ')
34
- values = attributes.join(', ')
35
-
36
- assignment = attributes.size > 0 ? "#{ivs} = #{values}" : EMPTY_STRING
37
-
38
- module_eval(<<-RUBY, __FILE__, __LINE__ + 1)
39
- def initialize(#{kwargs})
40
- #{assignment}
41
- end
42
- RUBY
43
- end
44
- end
45
- end
46
- end
@@ -1,73 +0,0 @@
1
- RSpec.describe 'header builder', '#call' do
2
- subject(:builder) { ROM::Repository::HeaderBuilder.new }
3
-
4
- let(:user_struct) do
5
- builder.struct_builder[:users, [:header, [[:attribute, :id], [:attribute, :name]]]]
6
- end
7
-
8
- let(:task_struct) do
9
- builder.struct_builder[:tasks, [:header, [[:attribute, :user_id], [:attribute, :title]]]]
10
- end
11
-
12
- let(:tag_struct) do
13
- builder.struct_builder[:tags, [:header, [[:attribute, :user_id], [:attribute, :tag]]]]
14
- end
15
-
16
- describe 'with a relation' do
17
- let(:ast) do
18
- [:relation, [
19
- :users,
20
- { dataset: :users, combine_name: :users },
21
- [:header, [[:attribute, :id], [:attribute, :name]]]
22
- ]]
23
- end
24
-
25
- it 'produces a valid header' do
26
- header = ROM::Header.coerce([[:id], [:name]], model: user_struct)
27
-
28
- expect(builder[ast]).to eql(header)
29
- end
30
- end
31
-
32
- describe 'with a graph' do
33
- let(:ast) do
34
- [:relation, [
35
- :users,
36
- { dataset: :users, combine_name: :users },
37
- [
38
- :header, [
39
- [:attribute, :id],
40
- [:attribute, :name],
41
- [:relation, [
42
- :tasks,
43
- { dataset: :tasks, keys: { id: :user_id }, combine_type: :many, combine_name: :tasks },
44
- [:header, [[:attribute, :user_id], [:attribute, :title]]]
45
- ]],
46
- [:relation, [
47
- :tags,
48
- { dataset: :tags, keys: { id: :user_id }, combine_type: :many, combine_name: :tags },
49
- [:header, [[:attribute, :user_id], [:attribute, :tag]]]
50
- ]]
51
- ]]
52
- ]
53
- ]
54
- end
55
-
56
- it 'produces a valid header' do
57
- attributes = [
58
- [:id],
59
- [:name],
60
- [:tasks, combine: true, type: :array, keys: { id: :user_id },
61
- header: ROM::Header.coerce([[:user_id], [:title]], model: task_struct)],
62
- [:tags, combine: true, type: :array, keys: { id: :user_id },
63
- header: ROM::Header.coerce([[:user_id], [:tag]], model: tag_struct)]
64
- ]
65
-
66
- header = ROM::Header.coerce(attributes,
67
- model: builder.struct_builder[:users, ast[1][2]]
68
- )
69
-
70
- expect(builder[ast]).to eql(header)
71
- end
72
- end
73
- end
@@ -1,29 +0,0 @@
1
- require 'rom/memory'
2
-
3
- RSpec.describe ROM::Plugins::Relation::View do
4
- subject(:relation) { relation_class.new([]) }
5
-
6
- let(:relation_class) do
7
- Class.new(ROM::Memory::Relation) do
8
- use :view
9
-
10
- view(:base, [:id, :name]) do
11
- self
12
- end
13
-
14
- view(:ids, [:id]) do
15
- self
16
- end
17
- end
18
- end
19
-
20
- describe '#attributes' do
21
- it 'returns base view attributes by default' do
22
- expect(relation.attributes).to eql([:id, :name])
23
- end
24
-
25
- it 'returns attributes for a configured view' do
26
- expect(relation.ids.attributes).to eql([:id])
27
- end
28
- end
29
- end
@@ -1,54 +0,0 @@
1
- RSpec.describe 'SQL Relation extensions' do
2
- include_context 'database'
3
-
4
- shared_context 'valid view' do
5
- let(:users) { rom.relation(:users) }
6
-
7
- it 'has valid column names' do
8
- expect(users.attributes).to eql([:id, :name])
9
-
10
- expect(users.by_pk.attributes).to eql([:name])
11
- expect(users.by_pk(1).attributes).to eql([:name])
12
- end
13
- end
14
-
15
- describe '.view' do
16
- context 'using short syntax' do
17
- before do
18
- configuration.relation(:users) do
19
- view(:by_pk, [:name]) do |name|
20
- where(name: name).select(:name)
21
- end
22
- end
23
- end
24
-
25
- include_context 'valid view'
26
- end
27
-
28
- context 'with multi-block syntax' do
29
- before do
30
- configuration.relation(:users) do
31
- view(:by_pk) do
32
- header [:name]
33
-
34
- relation do |name|
35
- where(name: name).select(:name)
36
- end
37
- end
38
- end
39
- end
40
-
41
- include_context 'valid view'
42
- end
43
-
44
- context 'with multi-block when first block has args' do
45
- it 'raises error' do
46
- expect {
47
- configuration.relation(:users) do
48
- view(:by_pk) { |args| }
49
- end
50
- }.to raise_error(ArgumentError)
51
- end
52
- end
53
- end
54
- end
@@ -1,22 +0,0 @@
1
- RSpec.describe ROM::Struct do
2
- subject(:struct) do
3
- Class.new(ROM::Struct) do
4
- attr_reader :id, :name
5
-
6
- def initialize(id, name)
7
- @id, @name = id, name
8
- end
9
-
10
- def id
11
- @id.to_i
12
- end
13
- end.new("1", "Jane")
14
- end
15
-
16
- describe '#[]' do
17
- it 'reads an attribute value' do
18
- expect(struct.id).to be(1)
19
- expect(struct.name).to eql("Jane")
20
- end
21
- end
22
- end