rom 0.5.0 → 0.6.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 (142) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +19 -15
  3. data/.rubocop_todo.yml +28 -0
  4. data/.travis.yml +8 -1
  5. data/CHANGELOG.md +40 -0
  6. data/Gemfile +10 -2
  7. data/Guardfile +12 -10
  8. data/README.md +42 -43
  9. data/Rakefile +13 -23
  10. data/lib/rom.rb +19 -27
  11. data/lib/rom/command.rb +118 -0
  12. data/lib/rom/command_registry.rb +13 -27
  13. data/lib/rom/commands.rb +1 -59
  14. data/lib/rom/commands/abstract.rb +147 -0
  15. data/lib/rom/commands/composite.rb +47 -0
  16. data/lib/rom/commands/create.rb +2 -17
  17. data/lib/rom/commands/delete.rb +5 -25
  18. data/lib/rom/commands/result.rb +5 -5
  19. data/lib/rom/commands/update.rb +3 -27
  20. data/lib/rom/constants.rb +19 -0
  21. data/lib/rom/env.rb +85 -35
  22. data/lib/rom/global.rb +173 -42
  23. data/lib/rom/header.rb +5 -5
  24. data/lib/rom/header/attribute.rb +2 -2
  25. data/lib/rom/lint/enumerable_dataset.rb +52 -0
  26. data/lib/rom/lint/linter.rb +64 -0
  27. data/lib/rom/lint/repository.rb +78 -0
  28. data/lib/rom/lint/spec.rb +20 -0
  29. data/lib/rom/lint/test.rb +98 -0
  30. data/lib/rom/mapper.rb +32 -5
  31. data/lib/rom/mapper/attribute_dsl.rb +240 -0
  32. data/lib/rom/mapper/dsl.rb +100 -0
  33. data/lib/rom/mapper/model_dsl.rb +55 -0
  34. data/lib/rom/mapper_registry.rb +8 -1
  35. data/lib/rom/memory.rb +4 -0
  36. data/lib/rom/memory/commands.rb +46 -0
  37. data/lib/rom/memory/dataset.rb +72 -0
  38. data/lib/rom/memory/relation.rb +44 -0
  39. data/lib/rom/memory/repository.rb +62 -0
  40. data/lib/rom/memory/storage.rb +57 -0
  41. data/lib/rom/model_builder.rb +44 -5
  42. data/lib/rom/processor.rb +1 -1
  43. data/lib/rom/processor/transproc.rb +109 -16
  44. data/lib/rom/reader.rb +91 -39
  45. data/lib/rom/relation.rb +165 -26
  46. data/lib/rom/relation/composite.rb +132 -0
  47. data/lib/rom/relation/curried.rb +48 -0
  48. data/lib/rom/relation/lazy.rb +173 -0
  49. data/lib/rom/relation/loaded.rb +75 -0
  50. data/lib/rom/relation/registry_reader.rb +23 -0
  51. data/lib/rom/repository.rb +93 -34
  52. data/lib/rom/setup.rb +54 -98
  53. data/lib/rom/setup/finalize.rb +85 -76
  54. data/lib/rom/setup_dsl/command.rb +36 -0
  55. data/lib/rom/setup_dsl/command_dsl.rb +34 -0
  56. data/lib/rom/setup_dsl/mapper.rb +32 -0
  57. data/lib/rom/setup_dsl/mapper_dsl.rb +30 -0
  58. data/lib/rom/setup_dsl/relation.rb +21 -0
  59. data/lib/rom/setup_dsl/setup.rb +75 -0
  60. data/lib/rom/support/array_dataset.rb +38 -0
  61. data/lib/rom/support/class_builder.rb +44 -0
  62. data/lib/rom/support/class_macros.rb +56 -0
  63. data/lib/rom/support/data_proxy.rb +102 -0
  64. data/lib/rom/support/enumerable_dataset.rb +58 -0
  65. data/lib/rom/support/inflector.rb +73 -0
  66. data/lib/rom/support/options.rb +188 -0
  67. data/lib/rom/support/registry.rb +4 -8
  68. data/lib/rom/version.rb +1 -1
  69. data/rakelib/benchmark.rake +13 -0
  70. data/rakelib/mutant.rake +16 -0
  71. data/rakelib/rubocop.rake +18 -0
  72. data/rom.gemspec +4 -7
  73. data/spec/integration/commands/create_spec.rb +32 -24
  74. data/spec/integration/commands/delete_spec.rb +15 -7
  75. data/spec/integration/commands/update_spec.rb +13 -11
  76. data/spec/integration/mappers/deep_embedded_spec.rb +4 -11
  77. data/spec/integration/mappers/definition_dsl_spec.rb +31 -44
  78. data/spec/integration/mappers/embedded_spec.rb +9 -24
  79. data/spec/integration/mappers/group_spec.rb +22 -30
  80. data/spec/integration/mappers/prefixing_attributes_spec.rb +18 -23
  81. data/spec/integration/mappers/renaming_attributes_spec.rb +23 -38
  82. data/spec/integration/mappers/symbolizing_attributes_spec.rb +18 -24
  83. data/spec/integration/mappers/wrap_spec.rb +22 -30
  84. data/spec/integration/multi_repo_spec.rb +15 -37
  85. data/spec/integration/relations/reading_spec.rb +82 -14
  86. data/spec/integration/repositories/extending_relations_spec.rb +50 -0
  87. data/spec/integration/{adapters → repositories}/setting_logger_spec.rb +6 -5
  88. data/spec/integration/setup_spec.rb +59 -62
  89. data/spec/shared/enumerable_dataset.rb +49 -0
  90. data/spec/shared/one_behavior.rb +26 -0
  91. data/spec/shared/users_and_tasks.rb +11 -23
  92. data/spec/spec_helper.rb +16 -7
  93. data/spec/support/constant_leak_finder.rb +14 -0
  94. data/spec/test/memory_repository_lint_test.rb +27 -0
  95. data/spec/unit/rom/command_registry_spec.rb +44 -0
  96. data/spec/unit/rom/commands/result_spec.rb +14 -0
  97. data/spec/unit/rom/commands_spec.rb +174 -0
  98. data/spec/unit/rom/env_spec.rb +40 -7
  99. data/spec/unit/rom/global_spec.rb +14 -0
  100. data/spec/unit/rom/{mapper_builder_spec.rb → mapper/dsl_spec.rb} +52 -38
  101. data/spec/unit/rom/mapper_spec.rb +51 -10
  102. data/spec/unit/rom/{adapter/memory → memory}/dataset_spec.rb +6 -4
  103. data/spec/unit/rom/memory/repository_spec.rb +12 -0
  104. data/spec/unit/rom/memory/storage_spec.rb +45 -0
  105. data/spec/unit/rom/model_builder_spec.rb +4 -3
  106. data/spec/unit/rom/processor/transproc_spec.rb +1 -0
  107. data/spec/unit/rom/reader_spec.rb +97 -24
  108. data/spec/unit/rom/relation/composite_spec.rb +65 -0
  109. data/spec/unit/rom/relation/lazy_spec.rb +145 -0
  110. data/spec/unit/rom/relation/loaded_spec.rb +28 -0
  111. data/spec/unit/rom/relation_spec.rb +111 -6
  112. data/spec/unit/rom/repository_spec.rb +59 -9
  113. data/spec/unit/rom/setup_spec.rb +99 -11
  114. data/spec/unit/rom/support/array_dataset_spec.rb +59 -0
  115. data/spec/unit/rom/support/class_builder_spec.rb +42 -0
  116. data/spec/unit/rom/support/enumerable_dataset_spec.rb +17 -0
  117. data/spec/unit/rom/support/inflector_spec.rb +89 -0
  118. data/spec/unit/rom/support/options_spec.rb +119 -0
  119. metadata +74 -112
  120. data/lib/rom/adapter.rb +0 -191
  121. data/lib/rom/adapter/memory.rb +0 -32
  122. data/lib/rom/adapter/memory/commands.rb +0 -31
  123. data/lib/rom/adapter/memory/dataset.rb +0 -67
  124. data/lib/rom/adapter/memory/storage.rb +0 -26
  125. data/lib/rom/commands/with_options.rb +0 -18
  126. data/lib/rom/config.rb +0 -70
  127. data/lib/rom/mapper_builder.rb +0 -52
  128. data/lib/rom/mapper_builder/mapper_dsl.rb +0 -114
  129. data/lib/rom/mapper_builder/model_dsl.rb +0 -29
  130. data/lib/rom/reader_builder.rb +0 -48
  131. data/lib/rom/relation_builder.rb +0 -62
  132. data/lib/rom/setup/base_relation_dsl.rb +0 -46
  133. data/lib/rom/setup/command_dsl.rb +0 -46
  134. data/lib/rom/setup/mapper_dsl.rb +0 -19
  135. data/lib/rom/setup/relation_dsl.rb +0 -20
  136. data/lib/rom/setup/schema_dsl.rb +0 -33
  137. data/spec/integration/adapters/extending_relations_spec.rb +0 -41
  138. data/spec/integration/commands/try_spec.rb +0 -27
  139. data/spec/integration/schema_spec.rb +0 -77
  140. data/spec/unit/config_spec.rb +0 -60
  141. data/spec/unit/rom/adapter_spec.rb +0 -79
  142. data/spec/unit/rom_spec.rb +0 -14
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 39759c82e1343f0fbffc57f13776e3c6c32a8cc9
4
- data.tar.gz: 28daebfe7db350be6ac1b591d369274a6d64dea2
3
+ metadata.gz: 814ed4ee8e88aefe0b86817fb61169b1e35f94ba
4
+ data.tar.gz: 999033f0c7c9afb931cf8cb18a333026e8b3efae
5
5
  SHA512:
6
- metadata.gz: 27528eadcc25bd65907de664a36a88a3abd9478873d9f213111c8aa33b32dccb95e22596202459bf43c9e7c093688807f8d218351b17d16defd40af683085720
7
- data.tar.gz: 22d152bd43402e7d04d6ac53e80ea8744fb683742fe92710f796e8853e505823d0c3070923137b2e8da75c3271ecbe6c404e90206841dbfac4e3fa675c8ee115
6
+ metadata.gz: fac52ead0bcbbe6c2404b59b8520facb25374050e8dbf6d98964aab073896fe8dca05f589d91ad34769f169ca284006f14685d2b4808e18571794bf0a8fd635c
7
+ data.tar.gz: 866166744b5e93f3fca5c623414579814efd7d6765d2cc695af3437e3b233f720e52f403f7f98b9cb288bc548e45e015f6ab3035692a4a05f57e6bdcbc893d69
data/.rubocop.yml CHANGED
@@ -1,29 +1,24 @@
1
- # FIXME: Lower by refactoring biggest offenders
2
- Metrics/AbcSize:
3
- Max: 27
1
+ # Generated by `rubocop --auto-gen-config`
2
+ inherit_from: .rubocop_todo.yml
4
3
 
5
- # FIXME: Lower by refactoring biggest offenders
6
- Metrics/MethodLength:
7
- Max: 29
8
-
9
- # FIXME: Lower by refactoring biggest offenders
10
- Metrics/PerceivedComplexity:
11
- Max: 8
4
+ # Exclude temporary files
5
+ AllCops:
6
+ Exclude:
7
+ - tmp/**/*
12
8
 
13
9
  # It’s quite readable when we know what we are doing
14
10
  Lint/AssignmentInCondition:
15
11
  Enabled: false
16
12
 
13
+ # No need to handle LoadError in Rakefile
17
14
  Lint/HandleExceptions:
18
15
  Exclude:
19
- - Rakefile
20
-
21
- Metrics/ClassLength:
22
- Max: 120
16
+ - rakelib/*.rake
17
+ - spec/spec_helper.rb
18
+ - benchmarks/setup.rb
23
19
 
24
20
  # gemspec is a special snowflake
25
21
  Metrics/LineLength:
26
- Max: 84
27
22
  Exclude:
28
23
  - rom.gemspec
29
24
 
@@ -79,3 +74,12 @@ Style/StringLiterals:
79
74
  # Allow def self.foo; @foo; end
80
75
  Style/TrivialAccessors:
81
76
  Enabled: false
77
+
78
+ # Allow compact style for specs
79
+ Style/ClassAndModuleChildren:
80
+ Exclude:
81
+ - spec/**/*_spec.rb
82
+
83
+ # Allow logical `or`/`and` in conditionals
84
+ Style/AndOr:
85
+ EnforcedStyle: conditionals
data/.rubocop_todo.yml ADDED
@@ -0,0 +1,28 @@
1
+ # This configuration was generated by `rubocop --auto-gen-config`
2
+ # on 2015-02-26 16:54:42 +0100 using RuboCop version 0.29.1.
3
+ # The point is for the user to remove these configuration records
4
+ # one by one as the offenses are removed from the code base.
5
+ # Note that changes in the inspected code, or installation of new
6
+ # versions of RuboCop, may require this file to be generated again.
7
+
8
+ # Offense count: 4
9
+ Metrics/AbcSize:
10
+ Max: 22
11
+
12
+ # Offense count: 1
13
+ Metrics/CyclomaticComplexity:
14
+ Max: 7
15
+
16
+ # Offense count: 40
17
+ # Configuration parameters: AllowURI, URISchemes.
18
+ Metrics/LineLength:
19
+ Max: 88
20
+
21
+ # Offense count: 15
22
+ # Configuration parameters: CountComments.
23
+ Metrics/MethodLength:
24
+ Max: 21
25
+
26
+ # Offense count: 1
27
+ Metrics/PerceivedComplexity:
28
+ Max: 10
data/.travis.yml CHANGED
@@ -1,8 +1,10 @@
1
1
  language: ruby
2
+ sudo: false
3
+ cache: bundler
2
4
  env:
3
5
  - CODECLIMATE_REPO_TOKEN=f7c652b65a700fcf1032174afc5ea243b991e48bf73077cc34c148e1c800a2f7
4
6
  bundler_args: --without sql benchmarks console tools
5
- script: "bundle exec rake spec"
7
+ script: "bundle exec rake ci"
6
8
  rvm:
7
9
  - 2.0
8
10
  - 2.1
@@ -10,9 +12,14 @@ rvm:
10
12
  - rbx-2
11
13
  - jruby
12
14
  - ruby-head
15
+ - jruby-head
16
+ env:
17
+ global:
18
+ - JRUBY_OPTS='--dev -J-Xmx1024M'
13
19
  matrix:
14
20
  allow_failures:
15
21
  - rvm: ruby-head
22
+ - rvm: jruby-head
16
23
  notifications:
17
24
  webhooks:
18
25
  urls:
data/CHANGELOG.md CHANGED
@@ -1,3 +1,43 @@
1
+ ## v0.6.0 to-be-released
2
+
3
+ ### Added
4
+
5
+ * It is now possible to define custom relation, mapper and command classes during setup (solnic)
6
+ * New `Env#relation` interface for reading and mapping relations which supports:
7
+ * `Relation::Lazy` with auto-currying, mapping and composition features (solnic)
8
+ * `Relation::Composite` allowing data-pipelining with arbitrary objects (solnic)
9
+ * Passing a block which yields relation with adapter query DSL available (solnic)
10
+ * Relations can be extended with plugins using Options API (solnic)
11
+ * Commands are now composable via `>>` operator (solnic)
12
+ * Mappers support `prefix_separator` option (solnic)
13
+ * Mappers can be registered under custom names (solnic)
14
+ * Relation `dataset` name is inferred from the class name by default (gotar)
15
+ * Relation can be registered under a custom name via `register_as` option (mcls)
16
+ * Adapters can use helper modules for datasets: `ArrayDataset` and `EnumerableDataset` (solnic)
17
+ * Adapter interface can now be tested via a lint test (elskwid + solnic + splattael)
18
+ * `tuple_count` interface in AbstractCommand which can be overridden by adapter (solnic)
19
+ * Custom Inflector API that auto-detects a specific inflection engine (mjtko)
20
+
21
+ ### Changed
22
+
23
+ * [BREAKING] Command API was simplified - commands should be accessed directly in `.try` block (solnic)
24
+ * [BREAKING] Schema DSL was **removed** - attributes can be specified only in mapper DSL
25
+ and default repository can be changed when defining a relation (solnic)
26
+ * `.setup` interface requires either an adapter identifier or can accept a repository
27
+ instance (aflatter)
28
+ * Adapter interface no longer requires specific constructor to be defined (aflatter)
29
+ * Adapters no longer need to handle connection URIs (aflatter)
30
+ * Adapter/Repository has been collapsed to *just* `Repository` (solnic)
31
+ * Relation no longer needs a header object and only operates on an adapters dataset (solnic)
32
+ * Relation no longer uses on Charlatan with method_missing magic (solnic)
33
+ * Adapter's dataset no longer requires header (solnic)
34
+ * Make storage in memory adapter thread-safe #110 (splattael)
35
+ * An Adapter can provide its own Relation subclass with custom behavior (solnic)
36
+ * Relation provides its "public interface" using method_added hook (splattael + solnic)
37
+ * ROM no longer depends on charlatan, concord and inflecto gems (mjtko + solnic)
38
+
39
+ [Compare v0.5.0...master](https://github.com/rom-rb/rom/compare/v0.5.0...master)
40
+
1
41
  ## v0.5.0 2014-12-31
2
42
 
3
43
  ### Added
data/Gemfile CHANGED
@@ -9,6 +9,10 @@ end
9
9
 
10
10
  group :test do
11
11
  gem 'virtus'
12
+ gem 'minitest'
13
+ gem 'thread_safe'
14
+ gem 'activesupport'
15
+ gem 'inflecto', '~> 0.0', '>= 0.0.2'
12
16
 
13
17
  platforms :rbx do
14
18
  gem 'rubysl-bigdecimal', platforms: :rbx
@@ -35,6 +39,10 @@ group :tools do
35
39
  gem 'guard-rspec'
36
40
  gem 'guard-rubocop'
37
41
 
38
- gem 'mutant'
39
- gem 'mutant-rspec'
42
+ gem 'byebug'
43
+
44
+ platform :mri do
45
+ gem 'mutant', '>= 0.7.7'
46
+ gem 'mutant-rspec'
47
+ end
40
48
  end
data/Guardfile CHANGED
@@ -1,22 +1,24 @@
1
1
  group :red_green_refactor, halt_on_fail: true do
2
- guard :rspec, cmd: "rspec" do
3
- # run all specs if configuration is modified
4
- watch('Guardfile') { 'spec' }
5
- watch('Gemfile.lock') { 'spec' }
6
- watch('spec/spec_helper.rb') { 'spec' }
2
+ guard :rspec, cmd: "rspec", all_on_start: true do
3
+ # run all specs if Gemfile.lock is modified
4
+ watch('Gemfile.lock') { 'spec' }
7
5
 
8
- # run all specs if supporting files files are modified
9
- watch(%r{\Aspec/(?:lib|support|shared)/.+\.rb\z}) { 'spec' }
6
+ # run all specs if any library code is modified
7
+ watch(%r{\Alib/.+\.rb\z}) { 'spec' }
10
8
 
11
- watch(%r{\Alib/(.+)\.rb\z}) { |_m| 'spec' }
9
+ # run all specs if supporting files are modified
10
+ watch('spec/spec_helper.rb') { 'spec' }
11
+ watch(%r{\Aspec/(?:lib|support|shared)/.+\.rb\z}) { 'spec' }
12
12
 
13
13
  # run a spec if it is modified
14
14
  watch(%r{\Aspec/(?:unit|integration)/.+_spec\.rb\z})
15
15
 
16
- notification :tmux, display_message: true
16
+ notification :tmux, display_message: true if ENV.key?('TMUX')
17
17
  end
18
18
 
19
19
  guard :rubocop do
20
- watch(%r{\Alib/(.+)\.rb\z})
20
+ # run rubocop on modified file
21
+ watch(%r{\Alib/.+\.rb\z})
22
+ watch(%r{\Aspec/.+\.rb\z})
21
23
  end
22
24
  end
data/README.md CHANGED
@@ -12,25 +12,23 @@
12
12
  [![Dependency Status](https://gemnasium.com/rom-rb/rom.png)][gemnasium]
13
13
  [![Code Climate](https://codeclimate.com/github/rom-rb/rom/badges/gpa.svg)][codeclimate]
14
14
  [![Test Coverage](https://codeclimate.com/github/rom-rb/rom/badges/coverage.svg)][codeclimate]
15
- [![Inline docs](http://inch-ci.org/github/rom-rb/rom.svg?branch=master)][inchpages]
15
+ [![Inline docs](http://inch-ci.org/github/rom-rb/rom.svg?branch=master&style=flat)][inchpages]
16
16
 
17
- ROM is an experimental Ruby ORM that aims to bring powerful object mapping
18
- capabilities and give you back the full power of your database. It is based on
19
- a couple of core concepts which makes it different from a typical ORM:
17
+ Ruby Object Mapper (ROM) is an experimental Ruby library with the goal to
18
+ provide powerful object mapping capabilities without limiting the full power of
19
+ your datastore.
20
20
 
21
- * Querying a database is considered as a private implementation detail
22
- * Abstract query interfaces are evil and a source of unnecessary complexity
23
- * Reading and mutating data are 2 distinct concerns and should be treated separately
24
- * It must be **simple** to use the full power of your database
21
+ Learn more:
25
22
 
26
- With that in mind ROM ships with adapters that allow you to connect to any
27
- database and exposes a DSL to define **relations**, **mappers** and **commands**
28
- to simplify accessing and changing the data.
23
+ * [Introduction](http://rom-rb.org/introduction/)
24
+ * [Rails tutorial](http://rom-rb.org/tutorials/rails/)
29
25
 
30
- Database support:
26
+ ## Adapters
31
27
 
32
28
  * [rom-sql](https://github.com/rom-rb/rom-sql)
33
29
  * [rom-mongo](https://github.com/rom-rb/rom-mongo)
30
+ * [rom-yaml](https://github.com/rom-rb/rom-yaml)
31
+ * [rom-csv](https://github.com/rom-rb/rom-csv)
34
32
 
35
33
  See [issues](https://github.com/rom-rb/rom/issues?q=is%3Aopen+is%3Aissue+label%3Aadapter+label%3Afeature)
36
34
  for a list of adapters that are planned to be added soon.
@@ -41,57 +39,57 @@ Integration with other frameworks is planned.
41
39
  ## Synopsis
42
40
 
43
41
  ``` ruby
44
- require 'rom-sql'
42
+ ROM.setup(:memory)
45
43
 
46
- setup = ROM.setup(sqlite: "sqlite::memory")
44
+ # This is our domain-specific class
45
+ class User
46
+ attr_reader :name, :age
47
47
 
48
- setup.sqlite.connection.create_table :users do
49
- primary_key :id
50
- String :name
51
- Integer :age
48
+ def initialize(attributes)
49
+ @name, @age = attributes.values_at(:name, :age)
50
+ end
52
51
  end
53
52
 
54
- # set up relations
55
-
56
- setup.relation(:users) do
53
+ # Here we define user relation which encapsulates accessing user data that
54
+ # we can map to domain objects
55
+ class Users < ROM::Relation[:memory]
57
56
  def by_name(name)
58
- where(name: name)
57
+ restrict(name: name)
59
58
  end
60
59
 
61
60
  def adults
62
- where { age >= 18 }
61
+ restrict { |user| user[:age] >= 18 }
63
62
  end
64
63
  end
65
64
 
66
- # set up commands
65
+ # Even though mappers can be derived from model definitions here's how you
66
+ # could define it explicitly
67
+ class UserMapper < ROM::Mapper
68
+ relation :users
67
69
 
68
- setup.commands(:users) do
69
- define(:create)
70
- end
70
+ model User
71
71
 
72
- # set up mappers
72
+ attribute :name
73
+ attribute :age
74
+ end
73
75
 
74
- setup.mappers do
75
- define(:users) do
76
- model(name: 'User')
77
- end
76
+ # You can define specialized commands that handle creating, updating and deleting
77
+ # data, those classes can use external input param handlers and validators too
78
+ class CreateUser < ROM::Commands::Create[:memory]
79
+ register_as :create
80
+ relation :users
81
+ result :one
78
82
  end
79
83
 
80
- rom = setup.finalize
84
+ # finalize the setup and retrieve object registry (aka ROM env)
85
+ rom = ROM.finalize.env
81
86
 
82
87
  # accessing defined commands
83
-
84
- rom.command(:users).try { create(name: "Joe", age: 17) }
85
- rom.command(:users).try { create(name: "Jane", age: 18) }
86
-
87
- # accessing registered relations
88
- users = rom.relations.users
89
-
90
- puts users.by_name("Jane").adults.to_a.inspect
91
- # => [{:id=>2, :name=>"Jane", :age=>18}]
88
+ rom.command(:users).create.call(name: "Joe", age: 17)
89
+ rom.command(:users).create.call(name: "Jane", age: 18)
92
90
 
93
91
  # reading relations using defined mappers
94
- puts rom.read(:users).by_name("Jane").adults.to_a.inspect
92
+ puts rom.relation(:users) { |r| r.by_name("Jane").adults }.as(:users).to_a.inspect
95
93
  # => [#<User:0x007fdba161cc48 @id=2, @name="Jane", @age=18>]
96
94
  ```
97
95
 
@@ -102,6 +100,7 @@ for details.
102
100
 
103
101
  ## Community
104
102
 
103
+ * [Official Blog](http://rom-rb.org/blog/)
105
104
  * [![Gitter chat](https://badges.gitter.im/rom-rb/chat.png)](https://gitter.im/rom-rb/chat)
106
105
  * [Ruby Object Mapper](https://groups.google.com/forum/#!forum/rom-rb) mailing list
107
106
 
data/Rakefile CHANGED
@@ -1,32 +1,22 @@
1
1
  require "rspec/core/rake_task"
2
+ require "rake/testtask"
2
3
 
3
4
  RSpec::Core::RakeTask.new(:spec)
4
- task default: [:spec]
5
+ task default: [:ci]
5
6
 
6
- begin
7
- require "rubocop/rake_task"
8
-
9
- Rake::Task[:default].enhance [:rubocop]
10
-
11
- RuboCop::RakeTask.new do |task|
12
- task.options << "--display-cop-names"
7
+ desc 'Run specs in isolation'
8
+ task :"spec:isolation" do
9
+ FileList["spec/**/*_spec.rb"].each do |spec|
10
+ sh "rspec", spec
13
11
  end
14
- rescue LoadError
15
12
  end
16
13
 
17
- desc "Run mutant against a specific subject"
18
- task :mutant do
19
- subject = ARGV.last
20
- if subject == 'mutant'
21
- abort "usage: rake mutant SUBJECT\nexample: rake mutant ROM::Header"
22
- else
23
- opts = {
24
- 'include' => 'lib',
25
- 'require' => 'rom',
26
- 'use' => 'rspec',
27
- 'ignore-subject' => "#{subject}#respond_to_missing?"
28
- }.to_a.map { |k, v| "--#{k} #{v}" }.join(' ')
14
+ desc "Run CI tasks"
15
+ task ci: [:spec, :lint, :"spec:isolation"]
29
16
 
30
- exec("bundle exec mutant #{opts} #{subject}")
31
- end
17
+ Rake::TestTask.new(:lint) do |test|
18
+ test.description = "Run adapter lint tests against memory adapter"
19
+ test.test_files = FileList.new('spec/test/*_test.rb')
20
+ test.libs << 'test'
21
+ test.verbose = true
32
22
  end
data/lib/rom.rb CHANGED
@@ -1,45 +1,37 @@
1
- require 'concord'
2
- require 'charlatan'
3
- require 'inflecto'
1
+ require 'equalizer'
4
2
 
5
3
  require 'rom/version'
4
+ require 'rom/constants'
5
+
6
+ # internal ROM support lib
7
+ require 'rom/support/inflector'
6
8
  require 'rom/support/registry'
9
+ require 'rom/support/options'
10
+ require 'rom/support/class_macros'
11
+ require 'rom/support/class_builder'
7
12
 
8
- require 'rom/header'
13
+ # core parts
9
14
  require 'rom/relation'
10
15
  require 'rom/mapper'
11
16
  require 'rom/reader'
17
+ require 'rom/command'
12
18
 
19
+ # default mapper processor using Transproc gem
13
20
  require 'rom/processor/transproc'
14
21
 
15
- require 'rom/commands'
22
+ # support for global-style setup
23
+ require 'rom/global'
24
+ require 'rom/setup'
16
25
 
17
- require 'rom/adapter'
18
- require 'rom/repository'
26
+ # TODO: consider to make this part optional and don't require it here
27
+ require 'rom/setup_dsl/setup'
19
28
 
20
- require 'rom/config'
29
+ # env with registries
21
30
  require 'rom/env'
22
31
 
23
- require 'rom/global'
24
- require 'rom/setup'
25
-
26
32
  module ROM
27
- EnvAlreadyFinalizedError = Class.new(StandardError)
28
- CommandError = Class.new(StandardError)
29
- TupleCountMismatchError = Class.new(CommandError)
30
- NoRelationError = Class.new(StandardError)
31
-
32
- InvalidOptionError = Class.new(StandardError) do
33
- def initialize(option, valid_values)
34
- super("#{option} should be one of #{valid_values.inspect}")
35
- end
36
- end
37
-
38
- Schema = Class.new(Registry)
33
+ extend Global
34
+
39
35
  RelationRegistry = Class.new(Registry)
40
36
  ReaderRegistry = Class.new(Registry)
41
-
42
- EMPTY_HASH = {}.freeze
43
-
44
- extend Global
45
37
  end