rom 2.0.2 → 4.2.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.
Files changed (203) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +35 -430
  3. data/LICENSE +1 -1
  4. data/README.md +83 -11
  5. data/lib/rom/version.rb +1 -1
  6. data/lib/rom.rb +3 -46
  7. metadata +30 -236
  8. data/.gitignore +0 -24
  9. data/.rspec +0 -3
  10. data/.rubocop.yml +0 -87
  11. data/.rubocop_todo.yml +0 -46
  12. data/.travis.yml +0 -28
  13. data/CODE_OF_CONDUCT.md +0 -13
  14. data/CONTRIBUTING.md +0 -1
  15. data/Gemfile +0 -41
  16. data/Guardfile +0 -24
  17. data/Rakefile +0 -22
  18. data/lib/rom/association_set.rb +0 -26
  19. data/lib/rom/command.rb +0 -173
  20. data/lib/rom/command_registry.rb +0 -153
  21. data/lib/rom/commands/class_interface.rb +0 -148
  22. data/lib/rom/commands/composite.rb +0 -54
  23. data/lib/rom/commands/create.rb +0 -13
  24. data/lib/rom/commands/delete.rb +0 -14
  25. data/lib/rom/commands/graph/builder.rb +0 -176
  26. data/lib/rom/commands/graph/class_interface.rb +0 -62
  27. data/lib/rom/commands/graph/input_evaluator.rb +0 -62
  28. data/lib/rom/commands/graph.rb +0 -103
  29. data/lib/rom/commands/lazy/create.rb +0 -23
  30. data/lib/rom/commands/lazy/delete.rb +0 -27
  31. data/lib/rom/commands/lazy/update.rb +0 -34
  32. data/lib/rom/commands/lazy.rb +0 -99
  33. data/lib/rom/commands/result.rb +0 -96
  34. data/lib/rom/commands/update.rb +0 -14
  35. data/lib/rom/commands.rb +0 -3
  36. data/lib/rom/configuration.rb +0 -88
  37. data/lib/rom/configuration_dsl/command.rb +0 -43
  38. data/lib/rom/configuration_dsl/command_dsl.rb +0 -35
  39. data/lib/rom/configuration_dsl/mapper.rb +0 -37
  40. data/lib/rom/configuration_dsl/mapper_dsl.rb +0 -44
  41. data/lib/rom/configuration_dsl/relation.rb +0 -26
  42. data/lib/rom/configuration_dsl.rb +0 -78
  43. data/lib/rom/configuration_plugin.rb +0 -17
  44. data/lib/rom/constants.rb +0 -30
  45. data/lib/rom/container.rb +0 -231
  46. data/lib/rom/create_container.rb +0 -61
  47. data/lib/rom/environment.rb +0 -70
  48. data/lib/rom/gateway.rb +0 -154
  49. data/lib/rom/global/plugin_dsl.rb +0 -49
  50. data/lib/rom/global.rb +0 -60
  51. data/lib/rom/lint/enumerable_dataset.rb +0 -54
  52. data/lib/rom/lint/gateway.rb +0 -94
  53. data/lib/rom/lint/linter.rb +0 -78
  54. data/lib/rom/lint/spec.rb +0 -20
  55. data/lib/rom/lint/test.rb +0 -98
  56. data/lib/rom/mapper_registry.rb +0 -35
  57. data/lib/rom/memory/commands.rb +0 -58
  58. data/lib/rom/memory/dataset.rb +0 -98
  59. data/lib/rom/memory/gateway.rb +0 -64
  60. data/lib/rom/memory/relation.rb +0 -49
  61. data/lib/rom/memory/storage.rb +0 -59
  62. data/lib/rom/memory/types.rb +0 -9
  63. data/lib/rom/memory.rb +0 -4
  64. data/lib/rom/pipeline.rb +0 -106
  65. data/lib/rom/plugin.rb +0 -17
  66. data/lib/rom/plugin_base.rb +0 -31
  67. data/lib/rom/plugin_registry.rb +0 -173
  68. data/lib/rom/plugins/command/schema.rb +0 -37
  69. data/lib/rom/plugins/configuration/configuration_dsl.rb +0 -17
  70. data/lib/rom/plugins/relation/key_inference.rb +0 -46
  71. data/lib/rom/plugins/relation/registry_reader.rb +0 -32
  72. data/lib/rom/plugins/relation/view/dsl.rb +0 -32
  73. data/lib/rom/plugins/relation/view.rb +0 -95
  74. data/lib/rom/relation/class_interface.rb +0 -230
  75. data/lib/rom/relation/composite.rb +0 -46
  76. data/lib/rom/relation/curried.rb +0 -104
  77. data/lib/rom/relation/graph.rb +0 -115
  78. data/lib/rom/relation/loaded.rb +0 -118
  79. data/lib/rom/relation/materializable.rb +0 -66
  80. data/lib/rom/relation/name.rb +0 -102
  81. data/lib/rom/relation.rb +0 -172
  82. data/lib/rom/relation_registry.rb +0 -9
  83. data/lib/rom/schema/dsl.rb +0 -58
  84. data/lib/rom/schema.rb +0 -89
  85. data/lib/rom/setup/auto_registration.rb +0 -69
  86. data/lib/rom/setup/auto_registration_strategies/base.rb +0 -11
  87. data/lib/rom/setup/auto_registration_strategies/custom_namespace.rb +0 -22
  88. data/lib/rom/setup/auto_registration_strategies/no_namespace.rb +0 -19
  89. data/lib/rom/setup/auto_registration_strategies/with_namespace.rb +0 -18
  90. data/lib/rom/setup/finalize/finalize_commands.rb +0 -47
  91. data/lib/rom/setup/finalize/finalize_mappers.rb +0 -36
  92. data/lib/rom/setup/finalize/finalize_relations.rb +0 -60
  93. data/lib/rom/setup/finalize.rb +0 -146
  94. data/lib/rom/setup.rb +0 -55
  95. data/lib/rom/support/configurable.rb +0 -80
  96. data/lib/rom/types.rb +0 -18
  97. data/log/.gitkeep +0 -0
  98. data/rakelib/benchmark.rake +0 -15
  99. data/rakelib/mutant.rake +0 -19
  100. data/rakelib/rubocop.rake +0 -18
  101. data/rom.gemspec +0 -26
  102. data/spec/fixtures/app/commands/create_user.rb +0 -2
  103. data/spec/fixtures/app/mappers/user_list.rb +0 -2
  104. data/spec/fixtures/app/my_commands/create_user.rb +0 -2
  105. data/spec/fixtures/app/my_mappers/user_list.rb +0 -2
  106. data/spec/fixtures/app/my_relations/users.rb +0 -2
  107. data/spec/fixtures/app/relations/users.rb +0 -2
  108. data/spec/fixtures/custom/commands/create_user.rb +0 -6
  109. data/spec/fixtures/custom/mappers/user_list.rb +0 -6
  110. data/spec/fixtures/custom/relations/users.rb +0 -6
  111. data/spec/fixtures/lib/persistence/commands/create_user.rb +0 -6
  112. data/spec/fixtures/lib/persistence/mappers/user_list.rb +0 -6
  113. data/spec/fixtures/lib/persistence/my_commands/create_user.rb +0 -6
  114. data/spec/fixtures/lib/persistence/my_mappers/user_list.rb +0 -6
  115. data/spec/fixtures/lib/persistence/my_relations/users.rb +0 -6
  116. data/spec/fixtures/lib/persistence/relations/users.rb +0 -6
  117. data/spec/integration/command_registry_spec.rb +0 -60
  118. data/spec/integration/commands/create_spec.rb +0 -177
  119. data/spec/integration/commands/delete_spec.rb +0 -67
  120. data/spec/integration/commands/error_handling_spec.rb +0 -25
  121. data/spec/integration/commands/graph_builder_spec.rb +0 -213
  122. data/spec/integration/commands/graph_spec.rb +0 -288
  123. data/spec/integration/commands/update_spec.rb +0 -109
  124. data/spec/integration/commands_spec.rb +0 -67
  125. data/spec/integration/mappers/combine_spec.rb +0 -117
  126. data/spec/integration/mappers/deep_embedded_spec.rb +0 -44
  127. data/spec/integration/mappers/definition_dsl_spec.rb +0 -206
  128. data/spec/integration/mappers/embedded_spec.rb +0 -62
  129. data/spec/integration/mappers/exclude_spec.rb +0 -27
  130. data/spec/integration/mappers/fold_spec.rb +0 -71
  131. data/spec/integration/mappers/group_spec.rb +0 -163
  132. data/spec/integration/mappers/overwrite_attributes_value_spec.rb +0 -51
  133. data/spec/integration/mappers/prefix_separator_spec.rb +0 -52
  134. data/spec/integration/mappers/prefix_spec.rb +0 -48
  135. data/spec/integration/mappers/prefixing_attributes_spec.rb +0 -37
  136. data/spec/integration/mappers/registering_custom_mappers_spec.rb +0 -28
  137. data/spec/integration/mappers/renaming_attributes_spec.rb +0 -125
  138. data/spec/integration/mappers/reusing_mappers_spec.rb +0 -43
  139. data/spec/integration/mappers/step_spec.rb +0 -119
  140. data/spec/integration/mappers/symbolizing_attributes_spec.rb +0 -77
  141. data/spec/integration/mappers/unfold_spec.rb +0 -92
  142. data/spec/integration/mappers/ungroup_spec.rb +0 -126
  143. data/spec/integration/mappers/unwrap_spec.rb +0 -93
  144. data/spec/integration/mappers/wrap_spec.rb +0 -155
  145. data/spec/integration/memory/commands/create_spec.rb +0 -23
  146. data/spec/integration/memory/commands/delete_spec.rb +0 -23
  147. data/spec/integration/memory/commands/update_spec.rb +0 -23
  148. data/spec/integration/multi_env_spec.rb +0 -69
  149. data/spec/integration/multi_repo_spec.rb +0 -46
  150. data/spec/integration/relations/default_dataset_spec.rb +0 -38
  151. data/spec/integration/relations/inheritance_spec.rb +0 -37
  152. data/spec/integration/relations/reading_spec.rb +0 -169
  153. data/spec/integration/relations/registry_dsl_spec.rb +0 -45
  154. data/spec/integration/repositories/extending_relations_spec.rb +0 -58
  155. data/spec/integration/repositories/setting_logger_spec.rb +0 -34
  156. data/spec/integration/setup_spec.rb +0 -160
  157. data/spec/shared/command_behavior.rb +0 -28
  158. data/spec/shared/command_graph.rb +0 -50
  159. data/spec/shared/container.rb +0 -9
  160. data/spec/shared/enumerable_dataset.rb +0 -52
  161. data/spec/shared/gateway_only.rb +0 -6
  162. data/spec/shared/materializable.rb +0 -36
  163. data/spec/shared/no_container.rb +0 -16
  164. data/spec/shared/one_behavior.rb +0 -26
  165. data/spec/shared/proxy.rb +0 -0
  166. data/spec/shared/users_and_tasks.rb +0 -10
  167. data/spec/spec_helper.rb +0 -52
  168. data/spec/support/constant_leak_finder.rb +0 -14
  169. data/spec/support/mutant.rb +0 -10
  170. data/spec/support/types.rb +0 -5
  171. data/spec/test/memory_repository_lint_test.rb +0 -27
  172. data/spec/unit/rom/association_set_spec.rb +0 -23
  173. data/spec/unit/rom/commands/graph_spec.rb +0 -191
  174. data/spec/unit/rom/commands/lazy_spec.rb +0 -307
  175. data/spec/unit/rom/commands/result_spec.rb +0 -70
  176. data/spec/unit/rom/commands_spec.rb +0 -165
  177. data/spec/unit/rom/configurable_spec.rb +0 -49
  178. data/spec/unit/rom/configuration_spec.rb +0 -61
  179. data/spec/unit/rom/container_spec.rb +0 -99
  180. data/spec/unit/rom/create_container_spec.rb +0 -151
  181. data/spec/unit/rom/environment_spec.rb +0 -123
  182. data/spec/unit/rom/gateway_spec.rb +0 -146
  183. data/spec/unit/rom/mapper_registry_spec.rb +0 -25
  184. data/spec/unit/rom/memory/commands_spec.rb +0 -43
  185. data/spec/unit/rom/memory/dataset_spec.rb +0 -31
  186. data/spec/unit/rom/memory/relation_spec.rb +0 -109
  187. data/spec/unit/rom/memory/repository_spec.rb +0 -12
  188. data/spec/unit/rom/memory/storage_spec.rb +0 -45
  189. data/spec/unit/rom/plugin_spec.rb +0 -150
  190. data/spec/unit/rom/plugins/command/schema_spec.rb +0 -66
  191. data/spec/unit/rom/plugins/relation/key_inference_spec.rb +0 -85
  192. data/spec/unit/rom/plugins/relation/view_spec.rb +0 -51
  193. data/spec/unit/rom/relation/composite_spec.rb +0 -89
  194. data/spec/unit/rom/relation/curried_spec.rb +0 -52
  195. data/spec/unit/rom/relation/graph_spec.rb +0 -92
  196. data/spec/unit/rom/relation/lazy/combine_spec.rb +0 -165
  197. data/spec/unit/rom/relation/lazy_spec.rb +0 -214
  198. data/spec/unit/rom/relation/loaded_spec.rb +0 -53
  199. data/spec/unit/rom/relation/name_spec.rb +0 -58
  200. data/spec/unit/rom/relation/schema_spec.rb +0 -117
  201. data/spec/unit/rom/relation_spec.rb +0 -237
  202. data/spec/unit/rom/schema_spec.rb +0 -10
  203. data/spec/unit/rom/setup/auto_registration_spec.rb +0 -152
@@ -1,94 +0,0 @@
1
- require 'rom/lint/linter'
2
-
3
- module ROM
4
- module Lint
5
- # Ensures that a [ROM::Gateway] extension provides datasets through the
6
- # expected methods
7
- #
8
- # @api public
9
- class Gateway < ROM::Lint::Linter
10
- # The gateway identifier e.g. +:memory+
11
- #
12
- # @api public
13
- attr_reader :identifier
14
-
15
- # The gateway class
16
- #
17
- # @api public
18
- attr_reader :gateway
19
-
20
- # The optional URI
21
- #
22
- # @api public
23
- attr_reader :uri
24
-
25
- # Gateway instance used in lint tests
26
- #
27
- # @api private
28
- attr_reader :gateway_instance
29
-
30
- # Create a gateway linter
31
- #
32
- # @param [Symbol] identifier
33
- # @param [Class] gateway
34
- # @param [String] uri optional
35
- def initialize(identifier, gateway, uri = nil)
36
- @identifier = identifier
37
- @gateway = gateway
38
- @uri = uri
39
- @gateway_instance = setup_gateway_instance
40
- end
41
-
42
- # Lint: Ensure that +gateway+ setups up its instance
43
- #
44
- # @api public
45
- def lint_gateway_setup
46
- return if gateway_instance.instance_of? gateway
47
-
48
- complain <<-STRING
49
- #{gateway}.setup must return a gateway instance but
50
- returned #{gateway_instance.inspect}
51
- STRING
52
- end
53
-
54
- # Lint: Ensure that +gateway_instance+ responds to +[]+
55
- #
56
- # @api public
57
- def lint_dataset_reader
58
- return if gateway_instance.respond_to? :[]
59
-
60
- complain "#{gateway_instance} must respond to []"
61
- end
62
-
63
- # Lint: Ensure that +gateway_instance+ responds to +dataset?+
64
- #
65
- # @api public
66
- def lint_dataset_predicate
67
- return if gateway_instance.respond_to? :dataset?
68
-
69
- complain "#{gateway_instance} must respond to dataset?"
70
- end
71
-
72
- private
73
-
74
- # Setup gateway instance
75
- #
76
- # @api private
77
- def setup_gateway_instance
78
- if uri
79
- ROM::Gateway.setup(identifier, uri)
80
- else
81
- ROM::Gateway.setup(identifier)
82
- end
83
- end
84
-
85
- # Run Gateway#disconnect
86
- #
87
- # @api private
88
- def after_lint
89
- super
90
- gateway_instance.disconnect
91
- end
92
- end
93
- end
94
- end
@@ -1,78 +0,0 @@
1
- module ROM
2
- module Lint
3
- # Base class for building linters that check source code
4
- #
5
- # Linters are used by authors of ROM adapters to verify that their
6
- # integration complies with the ROM api.
7
- #
8
- # Most of the time, authors won't need to construct linters directly
9
- # because the provided test helpers will automatically run when required
10
- # in tests and specs.
11
- #
12
- # @example
13
- # require 'rom/lint/spec'
14
- #
15
- #
16
- # @api public
17
- class Linter
18
- # A failure raised by +complain+
19
- Failure = Class.new(StandardError)
20
-
21
- # Iterate over all lint methods
22
- #
23
- # @yield [String, ROM::Lint]
24
- #
25
- # @api public
26
- def self.each_lint
27
- return to_enum unless block_given?
28
- lints.each { |lint| yield lint, self }
29
- end
30
-
31
- # Run a lint method
32
- #
33
- # @param [String] name
34
- #
35
- # @raise [ROM::Lint::Linter::Failure] if linting fails
36
- #
37
- # @api public
38
- def lint(name)
39
- before_lint
40
- public_send name
41
- after_lint
42
- true # for assertions
43
- end
44
-
45
- private
46
-
47
- # Return a list a lint methods
48
- #
49
- # @return [String]
50
- #
51
- # @api private
52
- def self.lints
53
- public_instance_methods(true).grep(/^lint_/).map(&:to_s)
54
- end
55
-
56
- # Raise a failure if a lint verification fails
57
- #
58
- # @raise [ROM::Lint::Linter::Failure]
59
- #
60
- # @api private
61
- def complain(*args)
62
- raise Failure, *args
63
- end
64
-
65
- # Hook method executed before each lint method run
66
- #
67
- # @api private
68
- def before_lint
69
- end
70
-
71
- # Hook method executed after each lint method run
72
- #
73
- # @api private
74
- def after_lint
75
- end
76
- end
77
- end
78
- end
data/lib/rom/lint/spec.rb DELETED
@@ -1,20 +0,0 @@
1
- require 'rom/lint/gateway'
2
- require 'rom/lint/enumerable_dataset'
3
-
4
- RSpec.shared_examples "a rom gateway" do
5
- ROM::Lint::Gateway.each_lint do |name, linter|
6
- it name do
7
- result = linter.new(identifier, gateway, uri).lint(name)
8
- expect(result).to be_truthy
9
- end
10
- end
11
- end
12
-
13
- RSpec.shared_examples "a rom enumerable dataset" do
14
- ROM::Lint::EnumerableDataset.each_lint do |name, linter|
15
- it name do
16
- result = linter.new(dataset, data).lint(name)
17
- expect(result).to be_truthy
18
- end
19
- end
20
- end
data/lib/rom/lint/test.rb DELETED
@@ -1,98 +0,0 @@
1
- require 'rom/lint/gateway'
2
- require 'rom/lint/enumerable_dataset'
3
-
4
- module ROM
5
- module Lint
6
- # A module that helps to define test methods
7
- module Test
8
- # Defines a test method converting lint failures to assertions
9
- #
10
- # @param [String] name
11
- #
12
- # @api private
13
- def define_test_method(name, &block)
14
- define_method "test_#{name}" do
15
- begin
16
- instance_eval(&block)
17
- rescue ROM::Lint::Linter::Failure => f
18
- raise Minitest::Assertion, f.message
19
- end
20
- end
21
- end
22
- end
23
-
24
- # This is a simple lint-test for gateway class to ensure the
25
- # basic interfaces are in place
26
- #
27
- # @example
28
- #
29
- # class MyGatewayTest < Minitest::Test
30
- # include ROM::Lint::TestGateway
31
- #
32
- # def setup
33
- # @gateway = MyGateway
34
- # @uri = "super_db://something"
35
- # end
36
- # end
37
- #
38
- # @api public
39
- module TestGateway
40
- extend ROM::Lint::Test
41
-
42
- # Returns the gateway identifier e.g. +:memory+
43
- #
44
- # @api public
45
- attr_reader :identifier
46
-
47
- # Returns the gateway class
48
- #
49
- # @api public
50
- attr_reader :gateway
51
-
52
- # Returns gateway's URI e.g. "super_db://something"
53
- #
54
- # @api public
55
- attr_reader :uri
56
-
57
- ROM::Lint::Gateway.each_lint do |name, linter|
58
- define_test_method name do
59
- assert linter.new(identifier, gateway, uri).lint(name)
60
- end
61
- end
62
- end
63
-
64
- # This is a simple lint-test for a gateway dataset class to ensure the
65
- # basic behavior is correct
66
- #
67
- # @example
68
- #
69
- # class MyDatasetLintTest < Minitest::Test
70
- # include ROM::Lint::TestEnumerableDataset
71
- #
72
- # def setup
73
- # @data = [{ name: 'Jane', age: 24 }, { name: 'Joe', age: 25 }]
74
- # @dataset = MyDataset.new(@data, [:name, :age])
75
- # end
76
- # end
77
- # @api public
78
- module TestEnumerableDataset
79
- extend ROM::Lint::Test
80
-
81
- # Returns the dataset instance
82
- #
83
- # @api public
84
- attr_reader :dataset
85
-
86
- # Returns the expected data
87
- #
88
- # @api public
89
- attr_reader :data
90
-
91
- ROM::Lint::EnumerableDataset.each_lint do |name, linter|
92
- define_test_method name do
93
- assert linter.new(dataset, data).lint(name)
94
- end
95
- end
96
- end
97
- end
98
- end
@@ -1,35 +0,0 @@
1
- require 'rom/support/registry'
2
-
3
- module ROM
4
- # @private
5
- class MapperRegistry < Registry
6
- # @api private
7
- def []=(name, mapper)
8
- elements[name] = mapper
9
- end
10
-
11
- # @api private
12
- def [](name)
13
- elements.fetch(name) { raise(MapperMissingError, name) }
14
- end
15
-
16
- # @api private
17
- def key?(name)
18
- elements.key?(name)
19
- end
20
-
21
- # @api private
22
- def by_path(path)
23
- elements.fetch(paths(path).detect { |name| elements.key?(name) }) {
24
- raise(MapperMissingError, path)
25
- }
26
- end
27
-
28
- private
29
-
30
- # @api private
31
- def paths(path)
32
- path.split('.').map(&:to_sym).reverse
33
- end
34
- end
35
- end
@@ -1,58 +0,0 @@
1
- require 'rom/commands'
2
-
3
- module ROM
4
- module Memory
5
- # Memory adapter commands namespace
6
- #
7
- # @api public
8
- module Commands
9
- # In-memory create command
10
- #
11
- # @api public
12
- class Create < ROM::Commands::Create
13
- adapter :memory
14
- use :schema
15
-
16
- # @see ROM::Commands::Create#execute
17
- def execute(tuples)
18
- Array([tuples]).flatten.map { |tuple|
19
- attributes = input[tuple]
20
- validator.call(attributes)
21
- relation.insert(attributes.to_h)
22
- attributes
23
- }.to_a
24
- end
25
- end
26
-
27
- # In-memory update command
28
- #
29
- # @api public
30
- class Update < ROM::Commands::Update
31
- adapter :memory
32
- use :schema
33
-
34
- # @see ROM::Commands::Update#execute
35
- def execute(params)
36
- attributes = input[params]
37
- validator.call(attributes)
38
- relation.map { |tuple| tuple.update(attributes.to_h) }
39
- end
40
- end
41
-
42
- # In-memory delete command
43
- #
44
- # @api public
45
- class Delete < ROM::Commands::Delete
46
- adapter :memory
47
-
48
- # @see ROM::Commands::Delete#execute
49
- def execute
50
- relation.to_a.map do |tuple|
51
- source.delete(tuple)
52
- tuple
53
- end
54
- end
55
- end
56
- end
57
- end
58
- end
@@ -1,98 +0,0 @@
1
- require 'rom/support/options' # FIXME: this shouldn't be required, fix needed in rom-support
2
- require 'rom/support/array_dataset'
3
-
4
- module ROM
5
- module Memory
6
- # In-memory dataset
7
- #
8
- # @api public
9
- class Dataset
10
- include ArrayDataset
11
-
12
- # Join two datasets
13
- #
14
- # @api public
15
- def join(*args)
16
- left, right = args.size > 1 ? args : [self, args.first]
17
-
18
- join_map = left.each_with_object({}) { |tuple, h|
19
- others = right.to_a.find_all { |t| (tuple.to_a & t.to_a).any? }
20
- (h[tuple] ||= []).concat(others)
21
- }
22
-
23
- tuples = left.flat_map { |tuple|
24
- join_map[tuple].map { |other| tuple.merge(other) }
25
- }
26
-
27
- self.class.new(tuples, options)
28
- end
29
-
30
- # Restrict a dataset
31
- #
32
- # @api public
33
- def restrict(criteria = nil)
34
- return find_all { |tuple| yield(tuple) } unless criteria
35
- find_all do |tuple|
36
- criteria.all? do |k, v|
37
- case v
38
- when Array then v.include?(tuple[k])
39
- when Regexp then tuple[k].match(v)
40
- else tuple[k].eql?(v)
41
- end
42
- end
43
- end
44
- end
45
-
46
- # Project a dataset
47
- #
48
- # @api public
49
- def project(*names)
50
- map { |tuple| tuple.reject { |key| !names.include?(key) } }
51
- end
52
-
53
- # Sort a dataset
54
- #
55
- # @param [Array<Symbol>] names
56
- # Names of fields to order tuples by
57
- #
58
- # @option [Boolean] :nils_first (false)
59
- # Whether `nil` values should be placed before others
60
- #
61
- # @api public
62
- def order(*fields)
63
- nils_first = fields.pop[:nils_first] if fields.last.is_a?(Hash)
64
-
65
- sort do |a, b|
66
- fields # finds the first difference between selected fields of tuples
67
- .map { |n| __compare__ a[n], b[n], nils_first }
68
- .detect(-> { 0 }) { |r| r != 0 }
69
- end
70
- end
71
-
72
- # Insert tuple into a dataset
73
- #
74
- # @api public
75
- def insert(tuple)
76
- data << tuple
77
- self
78
- end
79
- alias_method :<<, :insert
80
-
81
- # Delete tuples from a dataset
82
- #
83
- # @api public
84
- def delete(tuple)
85
- data.delete(tuple)
86
- self
87
- end
88
-
89
- private
90
-
91
- # Compares two values, that are either comparable, or can be nils
92
- def __compare__(a, b, nils_first)
93
- return a <=> b unless a.nil? ^ b.nil?
94
- (nils_first ^ b.nil?) ? -1 : 1
95
- end
96
- end
97
- end
98
- end
@@ -1,64 +0,0 @@
1
- require 'rom/gateway'
2
- require 'rom/memory/storage'
3
- require 'rom/memory/commands'
4
-
5
- module ROM
6
- module Memory
7
- # In-memory gateway interface
8
- #
9
- # @example
10
- # gateway = ROM::Memory::Gateway.new
11
- # gateway.dataset(:users)
12
- # gateway[:users].insert(name: 'Jane')
13
- #
14
- # @api public
15
- class Gateway < ROM::Gateway
16
- adapter :memory
17
-
18
- # @return [Object] default logger
19
- #
20
- # @api public
21
- attr_reader :logger
22
-
23
- # @api private
24
- def initialize
25
- @connection = Storage.new
26
- end
27
-
28
- # Set default logger for the gateway
29
- #
30
- # @param [Object] logger object
31
- #
32
- # @api public
33
- def use_logger(logger)
34
- @logger = logger
35
- end
36
-
37
- # Register a dataset in the gateway
38
- #
39
- # If dataset already exists it will be returned
40
- #
41
- # @return [Dataset]
42
- #
43
- # @api public
44
- def dataset(name)
45
- self[name] || connection.create_dataset(name)
46
- end
47
-
48
- # @see ROM::Gateway#dataset?
49
- def dataset?(name)
50
- connection.key?(name)
51
- end
52
-
53
- # Return dataset with the given name
54
- #
55
- # @param (see ROM::Gateway#[])
56
- # @return [Memory::Dataset]
57
- #
58
- # @api public
59
- def [](name)
60
- connection[name]
61
- end
62
- end
63
- end
64
- end
@@ -1,49 +0,0 @@
1
- require 'rom/memory/types'
2
-
3
- module ROM
4
- module Memory
5
- # Relation subclass for memory adapter
6
- #
7
- # @example
8
- # class Users < ROM::Relation[:memory]
9
- # end
10
- #
11
- # @api public
12
- class Relation < ROM::Relation
13
- include Enumerable
14
- include Memory
15
-
16
- adapter :memory
17
-
18
- forward :take, :join, :project, :restrict, :order
19
-
20
- # Insert tuples into the relation
21
- #
22
- # @example
23
- # users.insert(name: 'Jane')
24
- #
25
- # @return [Relation]
26
- #
27
- # @api public
28
- def insert(*args)
29
- dataset.insert(*args)
30
- self
31
- end
32
- alias_method :<<, :insert
33
-
34
- # Delete tuples from the relation
35
- #
36
- # @example
37
- # users.insert(name: 'Jane')
38
- # users.delete(name: 'Jane')
39
- #
40
- # @return [Relation]
41
- #
42
- # @api public
43
- def delete(*args)
44
- dataset.delete(*args)
45
- self
46
- end
47
- end
48
- end
49
- end
@@ -1,59 +0,0 @@
1
- require 'concurrent/hash'
2
- require 'concurrent/array'
3
-
4
- require 'rom/memory/dataset'
5
-
6
- module ROM
7
- module Memory
8
- # In-memory thread-safe data storage
9
- #
10
- # @private
11
- class Storage
12
- # Dataset registry
13
- #
14
- # @return [ThreadSafe::Hash]
15
- #
16
- # @api private
17
- attr_reader :data
18
-
19
- # @api private
20
- def initialize
21
- @data = Concurrent::Hash.new
22
- end
23
-
24
- # @return [Dataset]
25
- #
26
- # @api private
27
- def [](name)
28
- data[name]
29
- end
30
-
31
- # Register a new dataset
32
- #
33
- # @return [Dataset]
34
- #
35
- # @api private
36
- def create_dataset(name)
37
- data[name] = Dataset.new(Concurrent::Array.new)
38
- end
39
-
40
- # Check if there's dataset under specified key
41
- #
42
- # @return [Boolean]
43
- #
44
- # @api private
45
- def key?(name)
46
- data.key?(name)
47
- end
48
-
49
- # Return registered datasets count
50
- #
51
- # @return [Integer]
52
- #
53
- # @api private
54
- def size
55
- data.size
56
- end
57
- end
58
- end
59
- end
@@ -1,9 +0,0 @@
1
- require 'rom/types'
2
-
3
- module ROM
4
- module Memory
5
- module Types
6
- include ROM::Types
7
- end
8
- end
9
- end
data/lib/rom/memory.rb DELETED
@@ -1,4 +0,0 @@
1
- require 'rom/memory/gateway'
2
- require 'rom/memory/relation'
3
-
4
- ROM.register_adapter(:memory, ROM::Memory)