rom 3.3.3 → 4.0.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (241) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +2 -599
  3. data/lib/rom/version.rb +1 -1
  4. data/lib/rom.rb +3 -44
  5. metadata +19 -295
  6. data/.gitignore +0 -24
  7. data/.rspec +0 -3
  8. data/.rubocop.yml +0 -87
  9. data/.rubocop_todo.yml +0 -46
  10. data/.travis.yml +0 -24
  11. data/.yardopts +0 -2
  12. data/CODE_OF_CONDUCT.md +0 -13
  13. data/CONTRIBUTING.md +0 -1
  14. data/Gemfile +0 -54
  15. data/Guardfile +0 -24
  16. data/Rakefile +0 -28
  17. data/lib/rom/array_dataset.rb +0 -44
  18. data/lib/rom/association_set.rb +0 -49
  19. data/lib/rom/auto_curry.rb +0 -55
  20. data/lib/rom/command.rb +0 -494
  21. data/lib/rom/command_registry.rb +0 -148
  22. data/lib/rom/commands/class_interface.rb +0 -270
  23. data/lib/rom/commands/composite.rb +0 -53
  24. data/lib/rom/commands/create.rb +0 -13
  25. data/lib/rom/commands/delete.rb +0 -14
  26. data/lib/rom/commands/graph/builder.rb +0 -176
  27. data/lib/rom/commands/graph/class_interface.rb +0 -62
  28. data/lib/rom/commands/graph/input_evaluator.rb +0 -62
  29. data/lib/rom/commands/graph.rb +0 -95
  30. data/lib/rom/commands/lazy/create.rb +0 -23
  31. data/lib/rom/commands/lazy/delete.rb +0 -27
  32. data/lib/rom/commands/lazy/update.rb +0 -34
  33. data/lib/rom/commands/lazy.rb +0 -99
  34. data/lib/rom/commands/result.rb +0 -96
  35. data/lib/rom/commands/update.rb +0 -14
  36. data/lib/rom/commands.rb +0 -3
  37. data/lib/rom/configuration.rb +0 -90
  38. data/lib/rom/configuration_dsl/command.rb +0 -41
  39. data/lib/rom/configuration_dsl/command_dsl.rb +0 -35
  40. data/lib/rom/configuration_dsl/mapper.rb +0 -36
  41. data/lib/rom/configuration_dsl/mapper_dsl.rb +0 -43
  42. data/lib/rom/configuration_dsl/relation.rb +0 -26
  43. data/lib/rom/configuration_dsl.rb +0 -107
  44. data/lib/rom/configuration_plugin.rb +0 -17
  45. data/lib/rom/constants.rb +0 -36
  46. data/lib/rom/container.rb +0 -233
  47. data/lib/rom/create_container.rb +0 -60
  48. data/lib/rom/data_proxy.rb +0 -94
  49. data/lib/rom/enumerable_dataset.rb +0 -68
  50. data/lib/rom/environment.rb +0 -70
  51. data/lib/rom/gateway.rb +0 -196
  52. data/lib/rom/global/plugin_dsl.rb +0 -47
  53. data/lib/rom/global.rb +0 -58
  54. data/lib/rom/initializer.rb +0 -26
  55. data/lib/rom/lint/enumerable_dataset.rb +0 -54
  56. data/lib/rom/lint/gateway.rb +0 -120
  57. data/lib/rom/lint/linter.rb +0 -78
  58. data/lib/rom/lint/spec.rb +0 -20
  59. data/lib/rom/lint/test.rb +0 -98
  60. data/lib/rom/mapper_registry.rb +0 -35
  61. data/lib/rom/memory/commands.rb +0 -56
  62. data/lib/rom/memory/dataset.rb +0 -97
  63. data/lib/rom/memory/gateway.rb +0 -64
  64. data/lib/rom/memory/relation.rb +0 -62
  65. data/lib/rom/memory/schema.rb +0 -13
  66. data/lib/rom/memory/storage.rb +0 -59
  67. data/lib/rom/memory/types.rb +0 -9
  68. data/lib/rom/memory.rb +0 -4
  69. data/lib/rom/pipeline.rb +0 -122
  70. data/lib/rom/plugin.rb +0 -20
  71. data/lib/rom/plugin_base.rb +0 -40
  72. data/lib/rom/plugin_registry.rb +0 -173
  73. data/lib/rom/plugins/command/schema.rb +0 -37
  74. data/lib/rom/plugins/configuration/configuration_dsl.rb +0 -21
  75. data/lib/rom/plugins/relation/instrumentation.rb +0 -51
  76. data/lib/rom/plugins/relation/key_inference.rb +0 -48
  77. data/lib/rom/plugins/relation/registry_reader.rb +0 -33
  78. data/lib/rom/registry.rb +0 -50
  79. data/lib/rom/relation/class_interface.rb +0 -356
  80. data/lib/rom/relation/composite.rb +0 -46
  81. data/lib/rom/relation/curried.rb +0 -109
  82. data/lib/rom/relation/graph.rb +0 -125
  83. data/lib/rom/relation/loaded.rb +0 -127
  84. data/lib/rom/relation/materializable.rb +0 -66
  85. data/lib/rom/relation/name.rb +0 -102
  86. data/lib/rom/relation/view_dsl.rb +0 -64
  87. data/lib/rom/relation.rb +0 -250
  88. data/lib/rom/relation_registry.rb +0 -9
  89. data/lib/rom/schema/attribute.rb +0 -390
  90. data/lib/rom/schema/dsl.rb +0 -67
  91. data/lib/rom/schema.rb +0 -407
  92. data/lib/rom/setup/auto_registration.rb +0 -74
  93. data/lib/rom/setup/auto_registration_strategies/base.rb +0 -16
  94. data/lib/rom/setup/auto_registration_strategies/custom_namespace.rb +0 -63
  95. data/lib/rom/setup/auto_registration_strategies/no_namespace.rb +0 -20
  96. data/lib/rom/setup/auto_registration_strategies/with_namespace.rb +0 -18
  97. data/lib/rom/setup/finalize/finalize_commands.rb +0 -47
  98. data/lib/rom/setup/finalize/finalize_mappers.rb +0 -36
  99. data/lib/rom/setup/finalize/finalize_relations.rb +0 -83
  100. data/lib/rom/setup/finalize.rb +0 -152
  101. data/lib/rom/setup.rb +0 -65
  102. data/lib/rom/support/configurable.rb +0 -85
  103. data/lib/rom/transaction.rb +0 -24
  104. data/lib/rom/types.rb +0 -49
  105. data/log/.gitkeep +0 -0
  106. data/rakelib/benchmark.rake +0 -15
  107. data/rakelib/mutant.rake +0 -19
  108. data/rakelib/rubocop.rake +0 -18
  109. data/rom.gemspec +0 -25
  110. data/spec/fixtures/app/commands/create_user.rb +0 -2
  111. data/spec/fixtures/app/mappers/user_list.rb +0 -2
  112. data/spec/fixtures/app/my_commands/create_user.rb +0 -2
  113. data/spec/fixtures/app/my_mappers/user_list.rb +0 -2
  114. data/spec/fixtures/app/my_relations/users.rb +0 -2
  115. data/spec/fixtures/app/relations/users.rb +0 -2
  116. data/spec/fixtures/custom/commands/create_user.rb +0 -6
  117. data/spec/fixtures/custom/mappers/user_list.rb +0 -6
  118. data/spec/fixtures/custom/relations/users.rb +0 -6
  119. data/spec/fixtures/custom_namespace/commands/create_customer.rb +0 -8
  120. data/spec/fixtures/custom_namespace/mappers/customer_list.rb +0 -8
  121. data/spec/fixtures/custom_namespace/relations/customers.rb +0 -8
  122. data/spec/fixtures/lib/persistence/commands/create_user.rb +0 -6
  123. data/spec/fixtures/lib/persistence/mappers/user_list.rb +0 -6
  124. data/spec/fixtures/lib/persistence/my_commands/create_user.rb +0 -6
  125. data/spec/fixtures/lib/persistence/my_mappers/user_list.rb +0 -6
  126. data/spec/fixtures/lib/persistence/my_relations/users.rb +0 -6
  127. data/spec/fixtures/lib/persistence/relations/users.rb +0 -6
  128. data/spec/fixtures/wrong/commands/create_customer.rb +0 -8
  129. data/spec/fixtures/wrong/mappers/customer_list.rb +0 -8
  130. data/spec/fixtures/wrong/relations/customers.rb +0 -8
  131. data/spec/integration/command_registry_spec.rb +0 -47
  132. data/spec/integration/commands/create_spec.rb +0 -157
  133. data/spec/integration/commands/delete_spec.rb +0 -67
  134. data/spec/integration/commands/error_handling_spec.rb +0 -25
  135. data/spec/integration/commands/graph_builder_spec.rb +0 -213
  136. data/spec/integration/commands/graph_spec.rb +0 -294
  137. data/spec/integration/commands/update_spec.rb +0 -86
  138. data/spec/integration/commands_spec.rb +0 -67
  139. data/spec/integration/gateways/extending_relations_spec.rb +0 -58
  140. data/spec/integration/gateways/setting_logger_spec.rb +0 -34
  141. data/spec/integration/mappers/combine_spec.rb +0 -117
  142. data/spec/integration/mappers/deep_embedded_spec.rb +0 -44
  143. data/spec/integration/mappers/definition_dsl_spec.rb +0 -206
  144. data/spec/integration/mappers/embedded_spec.rb +0 -62
  145. data/spec/integration/mappers/exclude_spec.rb +0 -27
  146. data/spec/integration/mappers/fold_spec.rb +0 -71
  147. data/spec/integration/mappers/group_spec.rb +0 -163
  148. data/spec/integration/mappers/overwrite_attributes_value_spec.rb +0 -51
  149. data/spec/integration/mappers/prefix_separator_spec.rb +0 -52
  150. data/spec/integration/mappers/prefix_spec.rb +0 -48
  151. data/spec/integration/mappers/prefixing_attributes_spec.rb +0 -37
  152. data/spec/integration/mappers/registering_custom_mappers_spec.rb +0 -28
  153. data/spec/integration/mappers/renaming_attributes_spec.rb +0 -125
  154. data/spec/integration/mappers/reusing_mappers_spec.rb +0 -43
  155. data/spec/integration/mappers/step_spec.rb +0 -119
  156. data/spec/integration/mappers/symbolizing_attributes_spec.rb +0 -77
  157. data/spec/integration/mappers/unfold_spec.rb +0 -92
  158. data/spec/integration/mappers/ungroup_spec.rb +0 -126
  159. data/spec/integration/mappers/unwrap_spec.rb +0 -93
  160. data/spec/integration/mappers/wrap_spec.rb +0 -155
  161. data/spec/integration/memory/commands/create_spec.rb +0 -23
  162. data/spec/integration/memory/commands/delete_spec.rb +0 -23
  163. data/spec/integration/memory/commands/update_spec.rb +0 -23
  164. data/spec/integration/multi_env_spec.rb +0 -69
  165. data/spec/integration/multi_repo_spec.rb +0 -46
  166. data/spec/integration/relations/default_dataset_spec.rb +0 -38
  167. data/spec/integration/relations/inheritance_spec.rb +0 -37
  168. data/spec/integration/relations/reading_spec.rb +0 -169
  169. data/spec/integration/relations/registry_dsl_spec.rb +0 -45
  170. data/spec/integration/setup_spec.rb +0 -193
  171. data/spec/shared/command_behavior.rb +0 -28
  172. data/spec/shared/command_graph.rb +0 -54
  173. data/spec/shared/container.rb +0 -9
  174. data/spec/shared/enumerable_dataset.rb +0 -52
  175. data/spec/shared/gateway_only.rb +0 -6
  176. data/spec/shared/materializable.rb +0 -36
  177. data/spec/shared/no_container.rb +0 -16
  178. data/spec/shared/one_behavior.rb +0 -26
  179. data/spec/shared/proxy.rb +0 -0
  180. data/spec/shared/users_and_tasks.rb +0 -10
  181. data/spec/spec_helper.rb +0 -59
  182. data/spec/support/constant_leak_finder.rb +0 -14
  183. data/spec/support/mutant.rb +0 -10
  184. data/spec/support/schema.rb +0 -14
  185. data/spec/support/types.rb +0 -5
  186. data/spec/test/memory_repository_lint_test.rb +0 -27
  187. data/spec/unit/rom/array_dataset_spec.rb +0 -59
  188. data/spec/unit/rom/association_set_spec.rb +0 -48
  189. data/spec/unit/rom/auto_curry_spec.rb +0 -71
  190. data/spec/unit/rom/commands/graph_spec.rb +0 -192
  191. data/spec/unit/rom/commands/lazy_spec.rb +0 -310
  192. data/spec/unit/rom/commands/pre_and_post_processors_spec.rb +0 -343
  193. data/spec/unit/rom/commands/result_spec.rb +0 -70
  194. data/spec/unit/rom/commands_spec.rb +0 -188
  195. data/spec/unit/rom/configurable_spec.rb +0 -49
  196. data/spec/unit/rom/configuration_spec.rb +0 -61
  197. data/spec/unit/rom/container_spec.rb +0 -109
  198. data/spec/unit/rom/create_container_spec.rb +0 -151
  199. data/spec/unit/rom/enumerable_dataset_spec.rb +0 -15
  200. data/spec/unit/rom/environment_spec.rb +0 -123
  201. data/spec/unit/rom/gateway_spec.rb +0 -146
  202. data/spec/unit/rom/mapper_registry_spec.rb +0 -25
  203. data/spec/unit/rom/memory/commands_spec.rb +0 -43
  204. data/spec/unit/rom/memory/dataset_spec.rb +0 -31
  205. data/spec/unit/rom/memory/gateway_spec.rb +0 -12
  206. data/spec/unit/rom/memory/inheritance_spec.rb +0 -32
  207. data/spec/unit/rom/memory/relation_spec.rb +0 -121
  208. data/spec/unit/rom/memory/storage_spec.rb +0 -45
  209. data/spec/unit/rom/plugin_spec.rb +0 -150
  210. data/spec/unit/rom/plugins/command/schema_spec.rb +0 -66
  211. data/spec/unit/rom/plugins/relation/instrumentation_spec.rb +0 -44
  212. data/spec/unit/rom/plugins/relation/key_inference_spec.rb +0 -85
  213. data/spec/unit/rom/registry_spec.rb +0 -86
  214. data/spec/unit/rom/relation/attribute_reader_spec.rb +0 -17
  215. data/spec/unit/rom/relation/call_spec.rb +0 -51
  216. data/spec/unit/rom/relation/composite_spec.rb +0 -106
  217. data/spec/unit/rom/relation/curried_spec.rb +0 -67
  218. data/spec/unit/rom/relation/graph_spec.rb +0 -106
  219. data/spec/unit/rom/relation/lazy/combine_spec.rb +0 -165
  220. data/spec/unit/rom/relation/lazy/graph_spec.rb +0 -165
  221. data/spec/unit/rom/relation/lazy_spec.rb +0 -214
  222. data/spec/unit/rom/relation/loaded_spec.rb +0 -53
  223. data/spec/unit/rom/relation/name_spec.rb +0 -58
  224. data/spec/unit/rom/relation/output_schema_spec.rb +0 -28
  225. data/spec/unit/rom/relation/schema_spec.rb +0 -259
  226. data/spec/unit/rom/relation/view_spec.rb +0 -158
  227. data/spec/unit/rom/relation_spec.rb +0 -252
  228. data/spec/unit/rom/schema/accessing_attributes_spec.rb +0 -52
  229. data/spec/unit/rom/schema/append_spec.rb +0 -17
  230. data/spec/unit/rom/schema/exclude_spec.rb +0 -15
  231. data/spec/unit/rom/schema/finalize_spec.rb +0 -59
  232. data/spec/unit/rom/schema/key_predicate_spec.rb +0 -15
  233. data/spec/unit/rom/schema/merge_spec.rb +0 -17
  234. data/spec/unit/rom/schema/prefix_spec.rb +0 -16
  235. data/spec/unit/rom/schema/project_spec.rb +0 -15
  236. data/spec/unit/rom/schema/rename_spec.rb +0 -22
  237. data/spec/unit/rom/schema/type_spec.rb +0 -49
  238. data/spec/unit/rom/schema/uniq_spec.rb +0 -21
  239. data/spec/unit/rom/schema/wrap_spec.rb +0 -18
  240. data/spec/unit/rom/schema_spec.rb +0 -10
  241. data/spec/unit/rom/setup/auto_registration_spec.rb +0 -214
@@ -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/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,56 +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
- relation.insert(attributes.to_h)
21
- attributes
22
- }.to_a
23
- end
24
- end
25
-
26
- # In-memory update command
27
- #
28
- # @api public
29
- class Update < ROM::Commands::Update
30
- adapter :memory
31
- use :schema
32
-
33
- # @see ROM::Commands::Update#execute
34
- def execute(params)
35
- attributes = input[params]
36
- relation.map { |tuple| tuple.update(attributes.to_h) }
37
- end
38
- end
39
-
40
- # In-memory delete command
41
- #
42
- # @api public
43
- class Delete < ROM::Commands::Delete
44
- adapter :memory
45
-
46
- # @see ROM::Commands::Delete#execute
47
- def execute
48
- relation.to_a.map do |tuple|
49
- source.delete(tuple)
50
- tuple
51
- end
52
- end
53
- end
54
- end
55
- end
56
- end
@@ -1,97 +0,0 @@
1
- require 'rom/array_dataset'
2
-
3
- module ROM
4
- module Memory
5
- # In-memory dataset
6
- #
7
- # @api public
8
- class Dataset
9
- include ArrayDataset
10
-
11
- # Join two datasets
12
- #
13
- # @api public
14
- def join(*args)
15
- left, right = args.size > 1 ? args : [self, args.first]
16
-
17
- join_map = left.each_with_object({}) { |tuple, h|
18
- others = right.to_a.find_all { |t| (tuple.to_a & t.to_a).any? }
19
- (h[tuple] ||= []).concat(others)
20
- }
21
-
22
- tuples = left.flat_map { |tuple|
23
- join_map[tuple].map { |other| tuple.merge(other) }
24
- }
25
-
26
- self.class.new(tuples, options)
27
- end
28
-
29
- # Restrict a dataset
30
- #
31
- # @api public
32
- def restrict(criteria = nil)
33
- return find_all { |tuple| yield(tuple) } unless criteria
34
- find_all do |tuple|
35
- criteria.all? do |k, v|
36
- case v
37
- when Array then v.include?(tuple[k])
38
- when Regexp then tuple[k].match(v)
39
- else tuple[k].eql?(v)
40
- end
41
- end
42
- end
43
- end
44
-
45
- # Project a dataset
46
- #
47
- # @api public
48
- def project(*names)
49
- map { |tuple| tuple.reject { |key| !names.include?(key) } }
50
- end
51
-
52
- # Sort a dataset
53
- #
54
- # @param [Array<Symbol>] names
55
- # Names of fields to order tuples by
56
- #
57
- # @option [Boolean] :nils_first (false)
58
- # Whether `nil` values should be placed before others
59
- #
60
- # @api public
61
- def order(*fields)
62
- nils_first = fields.pop[:nils_first] if fields.last.is_a?(Hash)
63
-
64
- sort do |a, b|
65
- fields # finds the first difference between selected fields of tuples
66
- .map { |n| __compare__ a[n], b[n], nils_first }
67
- .detect(-> { 0 }) { |r| r != 0 }
68
- end
69
- end
70
-
71
- # Insert tuple into a dataset
72
- #
73
- # @api public
74
- def insert(tuple)
75
- data << tuple
76
- self
77
- end
78
- alias_method :<<, :insert
79
-
80
- # Delete tuples from a dataset
81
- #
82
- # @api public
83
- def delete(tuple)
84
- data.delete(tuple)
85
- self
86
- end
87
-
88
- private
89
-
90
- # Compares two values, that are either comparable, or can be nils
91
- def __compare__(a, b, nils_first)
92
- return a <=> b unless a.nil? ^ b.nil?
93
- (nils_first ^ b.nil?) ? -1 : 1
94
- end
95
- end
96
- end
97
- 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,62 +0,0 @@
1
- require 'rom/memory/types'
2
- require 'rom/memory/schema'
3
-
4
- module ROM
5
- module Memory
6
- # Relation subclass for memory adapter
7
- #
8
- # @example
9
- # class Users < ROM::Relation[:memory]
10
- # end
11
- #
12
- # @api public
13
- class Relation < ROM::Relation
14
- include Enumerable
15
- include Memory
16
-
17
- adapter :memory
18
- schema_class Memory::Schema
19
-
20
- forward :take, :join, :restrict, :order
21
-
22
- # Project a relation with provided attribute names
23
- #
24
- # @param [*Array] names A list with attribute names
25
- #
26
- # @return [Memory::Relation]
27
- #
28
- # @api public
29
- def project(*names)
30
- schema.project(*names).(self)
31
- end
32
-
33
- # Insert tuples into the relation
34
- #
35
- # @example
36
- # users.insert(name: 'Jane')
37
- #
38
- # @return [Relation]
39
- #
40
- # @api public
41
- def insert(*args)
42
- dataset.insert(*args)
43
- self
44
- end
45
- alias_method :<<, :insert
46
-
47
- # Delete tuples from the relation
48
- #
49
- # @example
50
- # users.insert(name: 'Jane')
51
- # users.delete(name: 'Jane')
52
- #
53
- # @return [Relation]
54
- #
55
- # @api public
56
- def delete(*args)
57
- dataset.delete(*args)
58
- self
59
- end
60
- end
61
- end
62
- end
@@ -1,13 +0,0 @@
1
- require 'rom/schema'
2
-
3
- module ROM
4
- module Memory
5
- class Schema < ROM::Schema
6
- # @see Schema#call
7
- # @api public
8
- def call(relation)
9
- relation.new(relation.dataset.project(*map(&:name)), schema: self)
10
- end
11
- end
12
- end
13
- 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)