rom 0.4.2 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (100) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +81 -0
  3. data/.travis.yml +2 -1
  4. data/CHANGELOG.md +41 -0
  5. data/Gemfile +12 -8
  6. data/Guardfile +17 -11
  7. data/README.md +7 -7
  8. data/Rakefile +29 -0
  9. data/lib/rom.rb +9 -66
  10. data/lib/rom/adapter.rb +45 -12
  11. data/lib/rom/adapter/memory.rb +0 -4
  12. data/lib/rom/adapter/memory/commands.rb +0 -10
  13. data/lib/rom/adapter/memory/dataset.rb +18 -6
  14. data/lib/rom/adapter/memory/storage.rb +0 -3
  15. data/lib/rom/command_registry.rb +24 -43
  16. data/lib/rom/commands.rb +5 -6
  17. data/lib/rom/commands/create.rb +5 -5
  18. data/lib/rom/commands/delete.rb +8 -6
  19. data/lib/rom/commands/result.rb +82 -0
  20. data/lib/rom/commands/update.rb +5 -4
  21. data/lib/rom/commands/with_options.rb +1 -4
  22. data/lib/rom/config.rb +70 -0
  23. data/lib/rom/env.rb +11 -3
  24. data/lib/rom/global.rb +107 -0
  25. data/lib/rom/header.rb +122 -89
  26. data/lib/rom/header/attribute.rb +148 -0
  27. data/lib/rom/mapper.rb +46 -67
  28. data/lib/rom/mapper_builder.rb +20 -73
  29. data/lib/rom/mapper_builder/mapper_dsl.rb +114 -0
  30. data/lib/rom/mapper_builder/model_dsl.rb +29 -0
  31. data/lib/rom/mapper_registry.rb +21 -0
  32. data/lib/rom/model_builder.rb +11 -17
  33. data/lib/rom/processor.rb +28 -0
  34. data/lib/rom/processor/transproc.rb +105 -0
  35. data/lib/rom/reader.rb +81 -21
  36. data/lib/rom/reader_builder.rb +14 -4
  37. data/lib/rom/relation.rb +19 -5
  38. data/lib/rom/relation_builder.rb +20 -6
  39. data/lib/rom/repository.rb +0 -2
  40. data/lib/rom/setup.rb +156 -0
  41. data/lib/rom/{boot → setup}/base_relation_dsl.rb +4 -8
  42. data/lib/rom/setup/command_dsl.rb +46 -0
  43. data/lib/rom/setup/finalize.rb +125 -0
  44. data/lib/rom/setup/mapper_dsl.rb +19 -0
  45. data/lib/rom/{boot → setup}/relation_dsl.rb +1 -4
  46. data/lib/rom/setup/schema_dsl.rb +33 -0
  47. data/lib/rom/support/registry.rb +10 -6
  48. data/lib/rom/version.rb +1 -1
  49. data/rom.gemspec +3 -1
  50. data/spec/integration/adapters/extending_relations_spec.rb +0 -2
  51. data/spec/integration/commands/create_spec.rb +2 -9
  52. data/spec/integration/commands/delete_spec.rb +4 -5
  53. data/spec/integration/commands/error_handling_spec.rb +4 -3
  54. data/spec/integration/commands/update_spec.rb +3 -8
  55. data/spec/integration/mappers/deep_embedded_spec.rb +52 -0
  56. data/spec/integration/mappers/definition_dsl_spec.rb +0 -118
  57. data/spec/integration/mappers/embedded_spec.rb +82 -0
  58. data/spec/integration/mappers/group_spec.rb +170 -0
  59. data/spec/integration/mappers/prefixing_attributes_spec.rb +2 -2
  60. data/spec/integration/mappers/renaming_attributes_spec.rb +8 -6
  61. data/spec/integration/mappers/symbolizing_attributes_spec.rb +80 -0
  62. data/spec/integration/mappers/wrap_spec.rb +162 -0
  63. data/spec/integration/multi_repo_spec.rb +64 -0
  64. data/spec/integration/relations/reading_spec.rb +12 -8
  65. data/spec/integration/relations/registry_dsl_spec.rb +1 -3
  66. data/spec/integration/schema_spec.rb +10 -0
  67. data/spec/integration/setup_spec.rb +57 -6
  68. data/spec/spec_helper.rb +2 -1
  69. data/spec/unit/config_spec.rb +60 -0
  70. data/spec/unit/rom/adapter/memory/dataset_spec.rb +52 -0
  71. data/spec/unit/rom/adapter_spec.rb +31 -11
  72. data/spec/unit/rom/header_spec.rb +60 -16
  73. data/spec/unit/rom/mapper_builder_spec.rb +311 -0
  74. data/spec/unit/rom/mapper_registry_spec.rb +25 -0
  75. data/spec/unit/rom/mapper_spec.rb +4 -5
  76. data/spec/unit/rom/model_builder_spec.rb +15 -13
  77. data/spec/unit/rom/processor/transproc_spec.rb +331 -0
  78. data/spec/unit/rom/reader_spec.rb +73 -0
  79. data/spec/unit/rom/registry_spec.rb +38 -0
  80. data/spec/unit/rom/relation_spec.rb +0 -1
  81. data/spec/unit/rom/setup_spec.rb +55 -0
  82. data/spec/unit/rom_spec.rb +14 -0
  83. metadata +62 -22
  84. data/Gemfile.devtools +0 -71
  85. data/lib/rom/boot.rb +0 -197
  86. data/lib/rom/boot/command_dsl.rb +0 -48
  87. data/lib/rom/boot/dsl.rb +0 -37
  88. data/lib/rom/boot/mapper_dsl.rb +0 -23
  89. data/lib/rom/boot/schema_dsl.rb +0 -27
  90. data/lib/rom/ra.rb +0 -172
  91. data/lib/rom/ra/operation/group.rb +0 -47
  92. data/lib/rom/ra/operation/join.rb +0 -39
  93. data/lib/rom/ra/operation/wrap.rb +0 -45
  94. data/lib/rom/transformer.rb +0 -77
  95. data/spec/integration/ra/group_spec.rb +0 -46
  96. data/spec/integration/ra/join_spec.rb +0 -50
  97. data/spec/integration/ra/wrap_spec.rb +0 -37
  98. data/spec/unit/rom/ra/operation/group_spec.rb +0 -55
  99. data/spec/unit/rom/ra/operation/wrap_spec.rb +0 -29
  100. data/spec/unit/rom/transformer_spec.rb +0 -41
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 85a6e3c77b6e9a8d724fdd73056c4bdde3730beb
4
- data.tar.gz: 6f964fb1181920ab5222f66d3482cf9ebcddf810
3
+ metadata.gz: 39759c82e1343f0fbffc57f13776e3c6c32a8cc9
4
+ data.tar.gz: 28daebfe7db350be6ac1b591d369274a6d64dea2
5
5
  SHA512:
6
- metadata.gz: 31e1ff16669d9481ba1d516f27d9016054ef35c1ac2daa3dad5de8792ef9bd30813b7de01f48132726574f52edb7a1b2a374245602932683b02a473e1c577e93
7
- data.tar.gz: 62698c8268af71829168e3c8b27edac7553cc7e03b7c6362b485585e9404e10bd9bb1438f68cf3be9f8122c7d8670ac280e4867345f9f5a1d8aa6759e5e2d265
6
+ metadata.gz: 27528eadcc25bd65907de664a36a88a3abd9478873d9f213111c8aa33b32dccb95e22596202459bf43c9e7c093688807f8d218351b17d16defd40af683085720
7
+ data.tar.gz: 22d152bd43402e7d04d6ac53e80ea8744fb683742fe92710f796e8853e505823d0c3070923137b2e8da75c3271ecbe6c404e90206841dbfac4e3fa675c8ee115
@@ -0,0 +1,81 @@
1
+ # FIXME: Lower by refactoring biggest offenders
2
+ Metrics/AbcSize:
3
+ Max: 27
4
+
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
12
+
13
+ # It’s quite readable when we know what we are doing
14
+ Lint/AssignmentInCondition:
15
+ Enabled: false
16
+
17
+ Lint/HandleExceptions:
18
+ Exclude:
19
+ - Rakefile
20
+
21
+ Metrics/ClassLength:
22
+ Max: 120
23
+
24
+ # gemspec is a special snowflake
25
+ Metrics/LineLength:
26
+ Max: 84
27
+ Exclude:
28
+ - rom.gemspec
29
+
30
+ # The enforced style doesn’t match Vim’s defaults
31
+ Style/AlignParameters:
32
+ Enabled: false
33
+
34
+ # UTF-8 is perfectly fine in comments
35
+ Style/AsciiComments:
36
+ Enabled: false
37
+
38
+ # Allow using braces for value-returning blocks
39
+ Style/Blocks:
40
+ Enabled: false
41
+
42
+ # Documentation checked by Inch CI
43
+ Style/Documentation:
44
+ Enabled: false
45
+
46
+ # Early returns have their vices
47
+ Style/GuardClause:
48
+ Enabled: false
49
+
50
+ # Need to be skipped for >-> usage
51
+ Style/Lambda:
52
+ Enabled: false
53
+
54
+ # Multiline block chains are ok
55
+ Style/MultilineBlockChain:
56
+ Enabled: false
57
+
58
+ # Result::Success and Result::Failure use > for callbacks
59
+ Style/OpMethod:
60
+ Exclude:
61
+ - lib/rom/command_registry.rb
62
+
63
+ # Even a single escaped slash can be confusing
64
+ Style/RegexpLiteral:
65
+ MaxSlashes: 0
66
+
67
+ # Don’t introduce semantic fail/raise distinction
68
+ Style/SignalException:
69
+ EnforcedStyle: only_raise
70
+
71
+ # Need to be skipped for >-> usage
72
+ Style/SpaceAroundOperators:
73
+ Enabled: false
74
+
75
+ # Accept both single and double quotes
76
+ Style/StringLiterals:
77
+ Enabled: false
78
+
79
+ # Allow def self.foo; @foo; end
80
+ Style/TrivialAccessors:
81
+ Enabled: false
@@ -1,11 +1,12 @@
1
1
  language: ruby
2
2
  env:
3
3
  - CODECLIMATE_REPO_TOKEN=f7c652b65a700fcf1032174afc5ea243b991e48bf73077cc34c148e1c800a2f7
4
- bundler_args: --without sql benchmarks console
4
+ bundler_args: --without sql benchmarks console tools
5
5
  script: "bundle exec rake spec"
6
6
  rvm:
7
7
  - 2.0
8
8
  - 2.1
9
+ - 2.2
9
10
  - rbx-2
10
11
  - jruby
11
12
  - ruby-head
@@ -1,3 +1,44 @@
1
+ ## v0.5.0 2014-12-31
2
+
3
+ ### Added
4
+
5
+ * Mapper DSL supports `embedded` interface for nested tuples (solnic)
6
+ * Support for nested `group` mapping (solnic)
7
+ * Support for nested `wrap` mapping (solnic)
8
+ * Support for primitive type coercions (:to_string, :to_integer etc.) (solnic)
9
+ * Support for top-level `:prefix` option in mapping DSL (solnic)
10
+ * Support for top-level `:symbolize_keys` option in mapping DSL (solnic)
11
+ * Support for `:prefix` option in wrap/group mapping DSL (solnic)
12
+ * Interface for registering data mapping processors (solnic)
13
+ * Remaining relations are automatically setup from the schema (solnic)
14
+ * Each relation has now access to other relations (previously they only had
15
+ access to raw datasets) (solnic)
16
+ * `ROM.setup` supports passing in *just an uri* which will setup a default repository (solnic)
17
+ * `ROM.setup` supports passing in conventional database connection hash (solnic)
18
+ * Adapters support extra options in addition to the base connection URI (solnic)
19
+
20
+ ### Changed
21
+
22
+ * Mapping backend replaced by integration with transproc (solnic)
23
+ * Readers no longer expose adapter query DSL (solnic)
24
+ * Registry objects raise `ROM::Registry::ElementNotFoundError` when missing
25
+ element is referenced (rather than raw KeyError) (solnic)
26
+ * Performance improvements in Reader (solnic)
27
+ * `ROM::RA` was merged into in-memory adapter as this fits there perfectly (solnic)
28
+ * It is no longer needed to explicitly execute a delete command in try block (solnic)
29
+
30
+ ### Fixed
31
+
32
+ * Wrap/group skips empty tuples now (solnic)
33
+ * Readers raise a meaningful error when relation is missing (solnic)
34
+
35
+ ## Internal
36
+
37
+ * Massive code clean-up and rubocop integration (chastell)
38
+ * Refactored `Reader` and mapper-specific logic into `MapperRegistry` (solnic)
39
+
40
+ [Compare v0.4.2...v0.5.0](https://github.com/rom-rb/rom/compare/v0.4.2...v0.5.0)
41
+
1
42
  ## v0.4.2 2014-12-19
2
43
 
3
44
  ### Added
data/Gemfile CHANGED
@@ -9,18 +9,11 @@ end
9
9
 
10
10
  group :test do
11
11
  gem 'virtus'
12
- gem 'guard'
13
- gem 'guard-rspec'
14
12
 
15
13
  platforms :rbx do
16
14
  gem 'rubysl-bigdecimal', platforms: :rbx
17
15
  gem 'codeclimate-test-reporter', require: false
18
16
  end
19
-
20
- platforms :mri do
21
- gem 'mutant'
22
- gem 'mutant-rspec'
23
- end
24
17
  end
25
18
 
26
19
  group :sql do
@@ -31,6 +24,17 @@ group :sql do
31
24
  end
32
25
 
33
26
  group :benchmarks do
34
- gem 'activerecord', '4.2.0.rc3'
27
+ gem 'activerecord', '4.2.0'
35
28
  gem 'benchmark-ips'
36
29
  end
30
+
31
+ group :tools do
32
+ gem 'rubocop'
33
+
34
+ gem 'guard'
35
+ gem 'guard-rspec'
36
+ gem 'guard-rubocop'
37
+
38
+ gem 'mutant'
39
+ gem 'mutant-rspec'
40
+ end
data/Guardfile CHANGED
@@ -1,16 +1,22 @@
1
- guard :rspec, cmd: "rspec" do
2
- #run all specs if configuration is modified
3
- watch('Guardfile') { 'spec' }
4
- watch('Gemfile.lock') { 'spec' }
5
- watch('spec/spec_helper.rb') { 'spec' }
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' }
6
7
 
7
- # run all specs if supporting files files are modified
8
- watch(%r{\Aspec/(?:lib|support|shared)/.+\.rb\z}) { 'spec' }
8
+ # run all specs if supporting files files are modified
9
+ watch(%r{\Aspec/(?:lib|support|shared)/.+\.rb\z}) { 'spec' }
9
10
 
10
- watch(%r{\Alib/(.+)\.rb\z}) { |m| 'spec' }
11
+ watch(%r{\Alib/(.+)\.rb\z}) { |_m| 'spec' }
11
12
 
12
- # run a spec if it is modified
13
- watch(%r{\Aspec/(?:unit|integration)/.+_spec\.rb\z})
13
+ # run a spec if it is modified
14
+ watch(%r{\Aspec/(?:unit|integration)/.+_spec\.rb\z})
14
15
 
15
- notification :tmux, :display_message => true
16
+ notification :tmux, display_message: true
17
+ end
18
+
19
+ guard :rubocop do
20
+ watch(%r{\Alib/(.+)\.rb\z})
21
+ end
16
22
  end
data/README.md CHANGED
@@ -1,10 +1,3 @@
1
- [![Gem Version](https://badge.fury.io/rb/rom.svg)][gem]
2
- [![Build Status](https://travis-ci.org/rom-rb/rom.svg?branch=master)][travis]
3
- [![Dependency Status](https://gemnasium.com/rom-rb/rom.png)][gemnasium]
4
- [![Code Climate](https://codeclimate.com/github/rom-rb/rom/badges/gpa.svg)][codeclimate]
5
- [![Test Coverage](https://codeclimate.com/github/rom-rb/rom/badges/coverage.svg)][codeclimate]
6
- [![Inline docs](http://inch-ci.org/github/rom-rb/rom.svg?branch=master)][inchpages]
7
-
8
1
  [gem]: https://rubygems.org/gems/rom
9
2
  [travis]: https://travis-ci.org/rom-rb/rom
10
3
  [gemnasium]: https://gemnasium.com/rom-rb/rom
@@ -14,6 +7,13 @@
14
7
 
15
8
  # Ruby Object Mapper
16
9
 
10
+ [![Gem Version](https://badge.fury.io/rb/rom.svg)][gem]
11
+ [![Build Status](https://travis-ci.org/rom-rb/rom.svg?branch=master)][travis]
12
+ [![Dependency Status](https://gemnasium.com/rom-rb/rom.png)][gemnasium]
13
+ [![Code Climate](https://codeclimate.com/github/rom-rb/rom/badges/gpa.svg)][codeclimate]
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]
16
+
17
17
  ROM is an experimental Ruby ORM that aims to bring powerful object mapping
18
18
  capabilities and give you back the full power of your database. It is based on
19
19
  a couple of core concepts which makes it different from a typical ORM:
data/Rakefile CHANGED
@@ -1,3 +1,32 @@
1
1
  require "rspec/core/rake_task"
2
2
 
3
3
  RSpec::Core::RakeTask.new(:spec)
4
+ task default: [:spec]
5
+
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"
13
+ end
14
+ rescue LoadError
15
+ end
16
+
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(' ')
29
+
30
+ exec("bundle exec mutant #{opts} #{subject}")
31
+ end
32
+ end
data/lib/rom.rb CHANGED
@@ -7,24 +7,27 @@ require 'rom/support/registry'
7
7
 
8
8
  require 'rom/header'
9
9
  require 'rom/relation'
10
- require 'rom/transformer'
11
10
  require 'rom/mapper'
12
11
  require 'rom/reader'
13
12
 
13
+ require 'rom/processor/transproc'
14
+
14
15
  require 'rom/commands'
15
16
 
16
17
  require 'rom/adapter'
17
18
  require 'rom/repository'
18
- require 'rom/env'
19
19
 
20
- require 'rom/ra'
20
+ require 'rom/config'
21
+ require 'rom/env'
21
22
 
22
- require 'rom/boot'
23
+ require 'rom/global'
24
+ require 'rom/setup'
23
25
 
24
26
  module ROM
25
27
  EnvAlreadyFinalizedError = Class.new(StandardError)
26
28
  CommandError = Class.new(StandardError)
27
29
  TupleCountMismatchError = Class.new(CommandError)
30
+ NoRelationError = Class.new(StandardError)
28
31
 
29
32
  InvalidOptionError = Class.new(StandardError) do
30
33
  def initialize(option, valid_values)
@@ -36,67 +39,7 @@ module ROM
36
39
  RelationRegistry = Class.new(Registry)
37
40
  ReaderRegistry = Class.new(Registry)
38
41
 
39
- # Starts the setup process for schema, relations and mappers
40
- #
41
- # @param [Hash] options repository URIs
42
- #
43
- # @return [Boot] boot object
44
- #
45
- # @api public
46
- def self.setup(options, &block)
47
- adapters = options.each_with_object({}) do |(name, uri), hash|
48
- hash[name] = Adapter.setup(uri)
49
- end
50
-
51
- repositories = adapters.each_with_object({}) do |(name, adapter), hash|
52
- hash[name] = Repository.new(adapter)
53
- end
54
-
55
- boot = Boot.new(repositories)
56
-
57
- if block
58
- boot.instance_exec(&block)
59
- boot.finalize
60
- else
61
- @boot = boot
62
- end
63
- end
64
-
65
- # @api public
66
- def self.schema(&block)
67
- boot.schema(&block)
68
- end
69
-
70
- # @api public
71
- def self.relation(*args, &block)
72
- boot.relation(*args, &block)
73
- end
74
-
75
- # @api public
76
- def self.commands(*args, &block)
77
- boot.commands(*args, &block)
78
- end
79
-
80
- # @api public
81
- def self.mappers(*args, &block)
82
- boot.mappers(*args, &block)
83
- end
84
-
85
- # @api public
86
- def self.env
87
- @env
88
- end
89
-
90
- # @api public
91
- def self.finalize
92
- @env = boot.finalize
93
- @boot = nil
94
- self
95
- end
96
-
97
- # @api private
98
- def self.boot
99
- @boot
100
- end
42
+ EMPTY_HASH = {}.freeze
101
43
 
44
+ extend Global
102
45
  end
@@ -1,15 +1,12 @@
1
1
  require 'addressable/uri'
2
2
 
3
3
  module ROM
4
-
5
4
  # Abstract adapter class
6
5
  #
7
6
  # @api public
8
7
  class Adapter
9
8
  include Equalizer.new(:connection)
10
9
 
11
- @adapters = []
12
-
13
10
  # Return connection URI associated with the adapter
14
11
  #
15
12
  # @return [String]
@@ -24,6 +21,23 @@ module ROM
24
21
  # @api public
25
22
  attr_reader :connection
26
23
 
24
+ # Additional options hash
25
+ #
26
+ # @return [Hash]
27
+ #
28
+ # @api public
29
+ attr_reader :options
30
+
31
+ # @api private
32
+ def self.inherited(adapter)
33
+ Adapter.adapters.unshift(adapter)
34
+ end
35
+
36
+ # @api private
37
+ def self.adapters
38
+ @_adapters ||= []
39
+ end
40
+
27
41
  # Setup an adapter instance with the given connection URI
28
42
  #
29
43
  # @example
@@ -41,14 +55,15 @@ module ROM
41
55
  # @return [Adapter]
42
56
  #
43
57
  # @api public
44
- def self.setup(uri_string)
58
+ def self.setup(uri_string, options = {})
45
59
  uri = Addressable::URI.parse(uri_string)
60
+ adapter = self[uri.scheme]
46
61
 
47
- unless adapter = self[uri.scheme]
62
+ unless adapter
48
63
  raise ArgumentError, "#{uri_string.inspect} uri is not supported"
49
64
  end
50
65
 
51
- adapter.new(uri)
66
+ adapter.new(uri, options)
52
67
  end
53
68
 
54
69
  # Register adapter class
@@ -67,8 +82,8 @@ module ROM
67
82
  # @return [Array] registered adapters
68
83
  #
69
84
  # @api public
70
- def self.register(adapter)
71
- @adapters.unshift adapter
85
+ def self.register(_adapter)
86
+ warn "Adapter.register is no longer needed [#{caller[0]}"
72
87
  end
73
88
 
74
89
  # Return adapter class for the given scheme
@@ -79,12 +94,25 @@ module ROM
79
94
  #
80
95
  # @api public
81
96
  def self.[](scheme)
82
- @adapters.detect { |adapter| adapter.schemes.include?(scheme.to_sym) }
97
+ adapters.detect { |adapter| adapter.schemes.include?(scheme.to_sym) }
83
98
  end
84
99
 
100
+ # Hook for adapters to normalize scheme name
101
+ #
85
102
  # @api private
86
- def initialize(uri)
103
+ def self.normalize_scheme(scheme)
104
+ scheme
105
+ end
106
+
107
+ # @api private
108
+ def self.database_file?(_scheme)
109
+ false
110
+ end
111
+
112
+ # @api private
113
+ def initialize(uri, options = {})
87
114
  @uri = uri
115
+ @options = options
88
116
  end
89
117
 
90
118
  # Extension hook for adding adapter-specific behavior to a relation class
@@ -144,6 +172,13 @@ module ROM
144
172
  []
145
173
  end
146
174
 
175
+ # Disconnect is optional and it's a no-op by default
176
+ #
177
+ # @api public
178
+ def disconnect
179
+ # noop
180
+ end
181
+
147
182
  # Return namespace with adapter-specific command classes
148
183
  #
149
184
  # @return [Module]
@@ -152,7 +187,5 @@ module ROM
152
187
  def command_namespace
153
188
  self.class.const_get(:Commands)
154
189
  end
155
-
156
190
  end
157
-
158
191
  end