rom 0.4.0 → 0.4.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +16 -0
- data/Gemfile +10 -4
- data/README.md +1 -1
- data/lib/rom.rb +38 -1
- data/lib/rom/adapter/memory.rb +6 -2
- data/lib/rom/adapter/memory/dataset.rb +7 -4
- data/lib/rom/adapter/memory/storage.rb +5 -1
- data/lib/rom/boot.rb +4 -1
- data/lib/rom/boot/base_relation_dsl.rb +16 -10
- data/lib/rom/mapper.rb +14 -6
- data/lib/rom/mapper_builder.rb +7 -1
- data/lib/rom/ra/operation/wrap.rb +1 -1
- data/lib/rom/reader.rb +1 -1
- data/lib/rom/reader_builder.rb +18 -8
- data/lib/rom/relation.rb +1 -0
- data/lib/rom/version.rb +1 -1
- data/rom.gemspec +1 -1
- data/spec/integration/mappers/definition_dsl_spec.rb +32 -9
- data/spec/integration/ra/wrap_spec.rb +0 -2
- data/spec/integration/relations/reading_spec.rb +20 -2
- data/spec/integration/schema_spec.rb +40 -2
- data/spec/integration/setup_spec.rb +37 -0
- data/spec/unit/rom/mapper_spec.rb +16 -4
- data/spec/unit/rom/relation_spec.rb +2 -2
- metadata +3 -10
- data/config/devtools.yml +0 -4
- data/config/flay.yml +0 -3
- data/config/flog.yml +0 -2
- data/config/mutant.yml +0 -3
- data/config/reek.yml +0 -103
- data/config/rubocop.yml +0 -92
- data/config/yardstick.yml +0 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1cedd21af22c9eed4d993f2550a24089b9f8cacb
|
4
|
+
data.tar.gz: 5275819a3330d267f7ffd5dc8d9cc8a8ea186a9b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c4d159975a7a1a8ed67c08f7f085e9f8fa57c1ac40c36ed71d20b6111d326b3ac8d18fe46d94f9e436e13fc73f099320c0eab1e50fb717c2c246459575261496
|
7
|
+
data.tar.gz: a77514fb8bbafeeaef756c069e182b77d147999aca85000bc7089ff4a9d557cd3a003704b1766645fefe0d80c49c41456f19a38eaebed6697b5f8c96da0b1632
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,19 @@
|
|
1
|
+
## v0.4.1 2014-12-15
|
2
|
+
|
3
|
+
### Added
|
4
|
+
|
5
|
+
* Adapter can now implement `Adapter#dataset(name, header)` to return a dataset (solnic)
|
6
|
+
* For multi-step setup the DSL is available in `ROM` too (solnic)
|
7
|
+
* Global environment can be stored via `ROM.finalize` and accessible via `ROM.env` (solnic)
|
8
|
+
|
9
|
+
### Changed
|
10
|
+
|
11
|
+
* Schema can be defined in multiple steps (solnic)
|
12
|
+
* Setting model in mapper DSL is no longer required and defaults to `Hash` (solnic)
|
13
|
+
* Adapter datasets no longer have to return headers when they are provided by schema (solnic)
|
14
|
+
|
15
|
+
[Compare v0.4.0...v0.4.1](https://github.com/rom-rb/rom/compare/v0.4.0...v0.4.1)
|
16
|
+
|
1
17
|
## v0.4.0 2014-12-06
|
2
18
|
|
3
19
|
### Added
|
data/Gemfile
CHANGED
@@ -9,12 +9,18 @@ end
|
|
9
9
|
|
10
10
|
group :test do
|
11
11
|
gem 'virtus'
|
12
|
-
gem 'mutant'
|
13
|
-
gem 'mutant-rspec'
|
14
|
-
gem 'rubysl-bigdecimal', platforms: :rbx
|
15
12
|
gem 'guard'
|
16
13
|
gem 'guard-rspec'
|
17
|
-
|
14
|
+
|
15
|
+
platforms :rbx do
|
16
|
+
gem 'rubysl-bigdecimal', platforms: :rbx
|
17
|
+
gem 'codeclimate-test-reporter', require: false
|
18
|
+
end
|
19
|
+
|
20
|
+
platforms :mri do
|
21
|
+
gem 'mutant'
|
22
|
+
gem 'mutant-rspec'
|
23
|
+
end
|
18
24
|
end
|
19
25
|
|
20
26
|
group :sql do
|
data/README.md
CHANGED
@@ -18,7 +18,7 @@ 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:
|
20
20
|
|
21
|
-
*
|
21
|
+
* Querying a database is considered as a private implementation detail
|
22
22
|
* Abstract query interfaces are evil and a source of unnecessary complexity
|
23
23
|
* Reading and mutating data are 2 distinct concerns and should be treated separately
|
24
24
|
* It must be **simple** to use the full power of your database
|
data/lib/rom.rb
CHANGED
@@ -55,8 +55,45 @@ module ROM
|
|
55
55
|
boot.instance_exec(&block)
|
56
56
|
boot.finalize
|
57
57
|
else
|
58
|
-
boot
|
58
|
+
@boot = boot
|
59
59
|
end
|
60
60
|
end
|
61
61
|
|
62
|
+
# @api public
|
63
|
+
def self.schema(&block)
|
64
|
+
boot.schema(&block)
|
65
|
+
end
|
66
|
+
|
67
|
+
# @api public
|
68
|
+
def self.relation(*args, &block)
|
69
|
+
boot.relation(*args, &block)
|
70
|
+
end
|
71
|
+
|
72
|
+
# @api public
|
73
|
+
def self.commands(*args, &block)
|
74
|
+
boot.commands(*args, &block)
|
75
|
+
end
|
76
|
+
|
77
|
+
# @api public
|
78
|
+
def self.mappers(*args, &block)
|
79
|
+
boot.mappers(*args, &block)
|
80
|
+
end
|
81
|
+
|
82
|
+
# @api public
|
83
|
+
def self.env
|
84
|
+
@env
|
85
|
+
end
|
86
|
+
|
87
|
+
# @api public
|
88
|
+
def self.finalize
|
89
|
+
@env = boot.finalize
|
90
|
+
@boot = nil
|
91
|
+
self
|
92
|
+
end
|
93
|
+
|
94
|
+
# @api private
|
95
|
+
def self.boot
|
96
|
+
@boot
|
97
|
+
end
|
98
|
+
|
62
99
|
end
|
data/lib/rom/adapter/memory.rb
CHANGED
@@ -17,14 +17,18 @@ module ROM
|
|
17
17
|
@connection = Storage.new
|
18
18
|
end
|
19
19
|
|
20
|
-
def []
|
21
|
-
connection
|
20
|
+
def dataset(name, header = [])
|
21
|
+
connection.create_dataset(name, header)
|
22
22
|
end
|
23
23
|
|
24
24
|
def dataset?(name)
|
25
25
|
connection.key?(name)
|
26
26
|
end
|
27
27
|
|
28
|
+
def [](name)
|
29
|
+
connection[name]
|
30
|
+
end
|
31
|
+
|
28
32
|
Adapter.register(self)
|
29
33
|
end
|
30
34
|
|
@@ -5,6 +5,13 @@ module ROM
|
|
5
5
|
class Dataset
|
6
6
|
include Charlatan.new(:data)
|
7
7
|
|
8
|
+
attr_reader :header
|
9
|
+
|
10
|
+
def initialize(data, header)
|
11
|
+
super
|
12
|
+
@header = header
|
13
|
+
end
|
14
|
+
|
8
15
|
def to_ary
|
9
16
|
data.dup
|
10
17
|
end
|
@@ -41,10 +48,6 @@ module ROM
|
|
41
48
|
self
|
42
49
|
end
|
43
50
|
|
44
|
-
def header
|
45
|
-
[]
|
46
|
-
end
|
47
|
-
|
48
51
|
end
|
49
52
|
|
50
53
|
end
|
data/lib/rom/boot.rb
CHANGED
@@ -39,7 +39,10 @@ module ROM
|
|
39
39
|
#
|
40
40
|
# @api public
|
41
41
|
def schema(&block)
|
42
|
-
|
42
|
+
base_relations = DSL.new(self).schema(&block)
|
43
|
+
base_relations.each do |repo, relations|
|
44
|
+
(@schema[repo] ||= []).concat(relations)
|
45
|
+
end
|
43
46
|
self
|
44
47
|
end
|
45
48
|
|
@@ -2,12 +2,12 @@ module ROM
|
|
2
2
|
class Boot
|
3
3
|
|
4
4
|
class BaseRelationDSL
|
5
|
-
attr_reader :env, :name, :
|
5
|
+
attr_reader :env, :name, :header
|
6
6
|
|
7
7
|
def initialize(env, name)
|
8
8
|
@env = env
|
9
9
|
@name = name
|
10
|
-
@
|
10
|
+
@header = []
|
11
11
|
end
|
12
12
|
|
13
13
|
def repository(name = nil)
|
@@ -19,22 +19,28 @@ module ROM
|
|
19
19
|
end
|
20
20
|
|
21
21
|
def attribute(name)
|
22
|
-
|
22
|
+
header << name
|
23
23
|
end
|
24
24
|
|
25
25
|
def call(&block)
|
26
26
|
instance_exec(&block)
|
27
27
|
|
28
|
-
dataset =
|
29
|
-
|
30
|
-
|
31
|
-
if attributes.any?
|
32
|
-
attributes
|
28
|
+
dataset =
|
29
|
+
if adapter.respond_to?(:dataset)
|
30
|
+
adapter.dataset(name, header)
|
33
31
|
else
|
34
|
-
|
32
|
+
adapter[name]
|
35
33
|
end
|
36
34
|
|
37
|
-
|
35
|
+
base_header = dataset.respond_to?(:header) ? dataset.header : header
|
36
|
+
|
37
|
+
[name, dataset, base_header]
|
38
|
+
end
|
39
|
+
|
40
|
+
private
|
41
|
+
|
42
|
+
def adapter
|
43
|
+
repository.adapter
|
38
44
|
end
|
39
45
|
|
40
46
|
end
|
data/lib/rom/mapper.rb
CHANGED
@@ -2,18 +2,18 @@ module ROM
|
|
2
2
|
|
3
3
|
# @api private
|
4
4
|
class Mapper
|
5
|
-
attr_reader :header, :model
|
5
|
+
attr_reader :header, :model, :loader
|
6
6
|
|
7
7
|
class Basic < Mapper
|
8
8
|
attr_reader :mapping
|
9
9
|
|
10
|
-
def initialize(
|
10
|
+
def initialize(*args)
|
11
11
|
super
|
12
12
|
@mapping = header.mapping
|
13
13
|
end
|
14
14
|
|
15
15
|
def load(tuple, mapping = self.mapping)
|
16
|
-
|
16
|
+
loader[Hash[call(tuple, mapping)]]
|
17
17
|
end
|
18
18
|
|
19
19
|
def call(tuple, mapping = self.mapping)
|
@@ -44,16 +44,24 @@ module ROM
|
|
44
44
|
self
|
45
45
|
end
|
46
46
|
|
47
|
-
|
47
|
+
loader =
|
48
|
+
if model
|
49
|
+
-> tuple { model.new(tuple) }
|
50
|
+
else
|
51
|
+
-> tuple { tuple }
|
52
|
+
end
|
53
|
+
|
54
|
+
klass.new(header, model, loader)
|
48
55
|
end
|
49
56
|
|
50
|
-
def initialize(header, model)
|
57
|
+
def initialize(header, model, loader)
|
51
58
|
@header = header
|
52
59
|
@model = model
|
60
|
+
@loader = loader
|
53
61
|
end
|
54
62
|
|
55
63
|
def load(tuple)
|
56
|
-
|
64
|
+
loader[tuple]
|
57
65
|
end
|
58
66
|
|
59
67
|
end
|
data/lib/rom/mapper_builder.rb
CHANGED
@@ -28,7 +28,13 @@ module ROM
|
|
28
28
|
@name = name
|
29
29
|
@root = root
|
30
30
|
@prefix = options[:prefix]
|
31
|
-
|
31
|
+
|
32
|
+
@attributes =
|
33
|
+
if options[:inherit_header]
|
34
|
+
root.header.map { |attr| [prefix ? :"#{prefix}_#{attr}" : attr] }
|
35
|
+
else
|
36
|
+
[]
|
37
|
+
end
|
32
38
|
end
|
33
39
|
|
34
40
|
def model(options)
|
@@ -20,7 +20,7 @@ module ROM
|
|
20
20
|
def each(&block)
|
21
21
|
return to_enum unless block
|
22
22
|
|
23
|
-
results = relation.
|
23
|
+
results = relation.each_with_object([]) do |tuple, wrapped|
|
24
24
|
result = tuple.reject { |k,_| attribute_names.include?(k) }
|
25
25
|
result[key] = tuple.reject { |k,_| !attribute_names.include?(k) }
|
26
26
|
|
data/lib/rom/reader.rb
CHANGED
@@ -15,13 +15,13 @@ module ROM
|
|
15
15
|
def initialize(path, relation, mappers = {})
|
16
16
|
@path = path.to_s
|
17
17
|
@relation = relation
|
18
|
-
@header = relation.header
|
19
18
|
@mappers = mappers
|
20
19
|
|
21
20
|
names = @path.split('.')
|
22
21
|
|
23
22
|
mapper_key = names.reverse.detect { |name| mappers.key?(name.to_sym) }
|
24
23
|
@mapper = mappers.fetch(mapper_key.to_sym)
|
24
|
+
@header = mapper.header
|
25
25
|
end
|
26
26
|
|
27
27
|
# Yields tuples mapped to objects
|
data/lib/rom/reader_builder.rb
CHANGED
@@ -2,6 +2,8 @@ module ROM
|
|
2
2
|
|
3
3
|
# @api private
|
4
4
|
class ReaderBuilder
|
5
|
+
DEFAULT_OPTIONS = { inherit_header: true }.freeze
|
6
|
+
|
5
7
|
attr_reader :relations, :readers
|
6
8
|
|
7
9
|
# @api private
|
@@ -11,17 +13,25 @@ module ROM
|
|
11
13
|
end
|
12
14
|
|
13
15
|
# @api private
|
14
|
-
def call(name,
|
15
|
-
|
16
|
+
def call(name, input_options = {}, &block)
|
17
|
+
with_options(input_options) do |options|
|
18
|
+
parent = relations[options.fetch(:parent) { name }]
|
19
|
+
|
20
|
+
builder = MapperBuilder.new(name, parent, options)
|
21
|
+
builder.instance_exec(&block) if block
|
22
|
+
mapper = builder.call
|
16
23
|
|
17
|
-
|
18
|
-
|
19
|
-
|
24
|
+
mappers = options[:parent] ? readers.fetch(parent.name).mappers : {}
|
25
|
+
|
26
|
+
mappers[name] = mapper
|
27
|
+
readers[name] = Reader.new(name, parent, mappers) unless options[:parent]
|
28
|
+
end
|
29
|
+
end
|
20
30
|
|
21
|
-
|
31
|
+
private
|
22
32
|
|
23
|
-
|
24
|
-
|
33
|
+
def with_options(options)
|
34
|
+
yield(DEFAULT_OPTIONS.merge(options))
|
25
35
|
end
|
26
36
|
|
27
37
|
end
|
data/lib/rom/relation.rb
CHANGED
data/lib/rom/version.rb
CHANGED
data/rom.gemspec
CHANGED
@@ -5,7 +5,7 @@ require File.expand_path('../lib/rom/version', __FILE__)
|
|
5
5
|
Gem::Specification.new do |gem|
|
6
6
|
gem.name = 'rom'
|
7
7
|
gem.summary = 'Ruby Object Mapper'
|
8
|
-
gem.description =
|
8
|
+
gem.description = 'Persistence and mapping toolkit for Ruby'
|
9
9
|
gem.authors = 'Piotr Solnica',
|
10
10
|
gem.email = 'piotr.solnica@gmail.com'
|
11
11
|
gem.homepage = 'http://rom-rb.org'
|
@@ -34,20 +34,43 @@ describe 'Mapper definition DSL' do
|
|
34
34
|
end
|
35
35
|
|
36
36
|
describe 'excluding attributes' do
|
37
|
-
|
37
|
+
context 'using exclude' do
|
38
|
+
subject(:mapper) { rom.read(:users).mapper }
|
38
39
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
40
|
+
before do
|
41
|
+
setup.mappers do
|
42
|
+
define(:users) do
|
43
|
+
model name: 'User'
|
43
44
|
|
44
|
-
|
45
|
+
exclude :name
|
46
|
+
end
|
45
47
|
end
|
46
48
|
end
|
49
|
+
|
50
|
+
it 'only maps provided attributes' do
|
51
|
+
expect(header.keys).to eql([:email])
|
52
|
+
end
|
47
53
|
end
|
48
54
|
|
49
|
-
|
50
|
-
|
55
|
+
context 'by setting :inherit_header to false' do
|
56
|
+
subject(:mapper) { rom.read(:users).email_index.mapper }
|
57
|
+
|
58
|
+
before do
|
59
|
+
setup.mappers do
|
60
|
+
define(:users) do
|
61
|
+
model name: 'User'
|
62
|
+
end
|
63
|
+
|
64
|
+
define(:email_index, parent: :users, inherit_header: false) do
|
65
|
+
model name: 'UserWithoutName'
|
66
|
+
attribute :email
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
it 'only maps provided attributes' do
|
72
|
+
expect(header.keys).to eql([:email])
|
73
|
+
end
|
51
74
|
end
|
52
75
|
end
|
53
76
|
|
@@ -70,7 +93,7 @@ describe 'Mapper definition DSL' do
|
|
70
93
|
end
|
71
94
|
|
72
95
|
it 'inherits the attributes from the parent by default' do
|
73
|
-
expect(header.keys).to eql(
|
96
|
+
expect(header.keys).to eql([:email])
|
74
97
|
end
|
75
98
|
|
76
99
|
it 'builds a new model' do
|
@@ -58,7 +58,7 @@ describe 'Reading relations' do
|
|
58
58
|
User.send(:include, Equalizer.new(:name, :email))
|
59
59
|
UserWithTasks.send(:include, Equalizer.new(:name, :email, :tasks))
|
60
60
|
|
61
|
-
expect(rom.read(:users).with_tasks.header).to eql([:name, :email, :tasks])
|
61
|
+
expect(rom.read(:users).with_tasks.header.keys).to eql([:name, :email, :tasks])
|
62
62
|
|
63
63
|
user = rom.read(:users).sorted.first
|
64
64
|
|
@@ -104,7 +104,7 @@ describe 'Reading relations' do
|
|
104
104
|
User.send(:include, Equalizer.new(:name, :email))
|
105
105
|
UserWithTask.send(:include, Equalizer.new(:name, :email, :task))
|
106
106
|
|
107
|
-
expect(rom.read(:users).with_task.header).to eql([:name, :email, :task])
|
107
|
+
expect(rom.read(:users).with_task.header.keys).to eql([:name, :email, :task])
|
108
108
|
|
109
109
|
user = rom.read(:users).sorted.with_task.first
|
110
110
|
|
@@ -113,4 +113,22 @@ describe 'Reading relations' do
|
|
113
113
|
task: { title: "be cool", priority: 2 })
|
114
114
|
)
|
115
115
|
end
|
116
|
+
|
117
|
+
it 'maps hashes' do
|
118
|
+
setup.relation(:users) do
|
119
|
+
def by_name(name)
|
120
|
+
restrict(name: name)
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
setup.mappers do
|
125
|
+
define(:users)
|
126
|
+
end
|
127
|
+
|
128
|
+
rom = setup.finalize
|
129
|
+
|
130
|
+
user = rom.read(:users).by_name("Jane").first
|
131
|
+
|
132
|
+
expect(user).to eql(name: "Jane", email: "jane@doe.org")
|
133
|
+
end
|
116
134
|
end
|
@@ -5,8 +5,8 @@ describe 'Defining schema' do
|
|
5
5
|
let(:rom) { setup.finalize }
|
6
6
|
let(:schema) { rom.schema }
|
7
7
|
|
8
|
-
|
9
|
-
|
8
|
+
shared_context 'valid schema' do
|
9
|
+
before do
|
10
10
|
setup.schema do
|
11
11
|
base_relation(:users) do
|
12
12
|
repository :memory
|
@@ -15,15 +15,53 @@ describe 'Defining schema' do
|
|
15
15
|
attribute :name
|
16
16
|
end
|
17
17
|
end
|
18
|
+
end
|
18
19
|
|
20
|
+
it 'returns schema with relations' do
|
19
21
|
users = schema.users
|
20
22
|
|
21
23
|
expect(users.dataset.to_a).to eql(rom.memory.users.to_a)
|
22
24
|
expect(users.header).to eql([:id, :name])
|
23
25
|
end
|
26
|
+
end
|
24
27
|
|
28
|
+
describe '.schema' do
|
25
29
|
it 'returns an empty schema if it was not defined' do
|
26
30
|
expect(schema.users).to be_nil
|
27
31
|
end
|
32
|
+
|
33
|
+
context 'with an adapter that supports header injection' do
|
34
|
+
it_behaves_like 'valid schema'
|
35
|
+
end
|
36
|
+
|
37
|
+
context 'can be called multiple times' do
|
38
|
+
before do
|
39
|
+
setup.schema do
|
40
|
+
base_relation(:tasks) do
|
41
|
+
repository :memory
|
42
|
+
attribute :title
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
it_behaves_like 'valid schema' do
|
48
|
+
it 'registers all base relations' do
|
49
|
+
expect(schema.tasks.dataset).to be(rom.memory.tasks)
|
50
|
+
expect(schema.tasks.header).to eql([:title])
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
context 'with an adapter that does not support header injection' do
|
56
|
+
before do
|
57
|
+
ROM::Adapter::Memory::Dataset.send(:undef_method, :header)
|
58
|
+
end
|
59
|
+
|
60
|
+
after do
|
61
|
+
ROM::Adapter::Memory::Dataset.send(:attr_reader, :header)
|
62
|
+
end
|
63
|
+
|
64
|
+
it_behaves_like 'valid schema'
|
65
|
+
end
|
28
66
|
end
|
29
67
|
end
|
@@ -65,4 +65,41 @@ describe 'Setting up ROM' do
|
|
65
65
|
expect(rom.read(:users).by_name('Jane').to_a).to eql([User.new(name: 'Jane')])
|
66
66
|
end
|
67
67
|
end
|
68
|
+
|
69
|
+
describe 'multi-step setup' do
|
70
|
+
it 'exposes boot DSL that can be invoked multiple times' do
|
71
|
+
User = Class.new { include Virtus.value_object; values { attribute :name, String } }
|
72
|
+
|
73
|
+
ROM.setup(memory: 'memory://test')
|
74
|
+
|
75
|
+
ROM.schema do
|
76
|
+
base_relation(:users) do
|
77
|
+
repository :memory
|
78
|
+
attribute :name
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
ROM.relation(:users) do
|
83
|
+
def by_name(name)
|
84
|
+
restrict(name: name)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
ROM.commands(:users) do
|
89
|
+
define(:create)
|
90
|
+
end
|
91
|
+
|
92
|
+
ROM.mappers do
|
93
|
+
define(:users) do
|
94
|
+
model User
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
rom = ROM.finalize.env
|
99
|
+
|
100
|
+
rom.command(:users).create.call(name: 'Jane')
|
101
|
+
|
102
|
+
expect(rom.read(:users).by_name('Jane').to_a).to eql([User.new(name: 'Jane')])
|
103
|
+
end
|
104
|
+
end
|
68
105
|
end
|
@@ -3,11 +3,23 @@ require 'spec_helper'
|
|
3
3
|
require 'ostruct'
|
4
4
|
|
5
5
|
describe ROM::Mapper do
|
6
|
-
subject(:mapper)
|
6
|
+
subject(:mapper) do
|
7
|
+
ROM::Mapper.build(ROM::Header.coerce(relation.header.zip), user_model)
|
8
|
+
end
|
9
|
+
|
10
|
+
let(:relation) do
|
11
|
+
ROM::Relation.new(dataset, dataset.header)
|
12
|
+
end
|
7
13
|
|
8
|
-
let(:
|
9
|
-
|
10
|
-
|
14
|
+
let(:dataset) do
|
15
|
+
ROM::Adapter::Memory::Dataset.new(
|
16
|
+
[{id: 1, name: 'Jane'}, {id: 2, name: 'Joe'}], [:id, :name]
|
17
|
+
)
|
18
|
+
end
|
19
|
+
|
20
|
+
let(:user_model) do
|
21
|
+
Class.new(OpenStruct) { include Equalizer.new(:id, :name) }
|
22
|
+
end
|
11
23
|
|
12
24
|
let(:jane) { user_model.new(id: 1, name: 'Jane') }
|
13
25
|
let(:joe) { user_model.new(id: 2, name: 'Joe') }
|
@@ -1,9 +1,9 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe ROM::Relation do
|
4
|
-
subject(:relation) { ROM::Relation.new(dataset,
|
4
|
+
subject(:relation) { ROM::Relation.new(dataset, dataset.header) }
|
5
5
|
|
6
|
-
let(:dataset) { ROM::Adapter::Memory::Dataset.new([jane, joe]) }
|
6
|
+
let(:dataset) { ROM::Adapter::Memory::Dataset.new([jane, joe], [:id, :name]) }
|
7
7
|
|
8
8
|
let(:jane) { { id: 1, name: 'Jane' } }
|
9
9
|
let(:joe) { { id: 2, name: 'Joe' } }
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rom
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Piotr Solnica
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-12-
|
12
|
+
date: 2014-12-15 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: addressable
|
@@ -147,7 +147,7 @@ dependencies:
|
|
147
147
|
- - "~>"
|
148
148
|
- !ruby/object:Gem::Version
|
149
149
|
version: '3.1'
|
150
|
-
description:
|
150
|
+
description: Persistence and mapping toolkit for Ruby
|
151
151
|
email: piotr.solnica@gmail.com
|
152
152
|
executables: []
|
153
153
|
extensions: []
|
@@ -164,13 +164,6 @@ files:
|
|
164
164
|
- LICENSE
|
165
165
|
- README.md
|
166
166
|
- Rakefile
|
167
|
-
- config/devtools.yml
|
168
|
-
- config/flay.yml
|
169
|
-
- config/flog.yml
|
170
|
-
- config/mutant.yml
|
171
|
-
- config/reek.yml
|
172
|
-
- config/rubocop.yml
|
173
|
-
- config/yardstick.yml
|
174
167
|
- lib/rom.rb
|
175
168
|
- lib/rom/adapter.rb
|
176
169
|
- lib/rom/adapter/memory.rb
|
data/config/devtools.yml
DELETED
data/config/flay.yml
DELETED
data/config/flog.yml
DELETED
data/config/mutant.yml
DELETED
data/config/reek.yml
DELETED
@@ -1,103 +0,0 @@
|
|
1
|
-
---
|
2
|
-
Attribute:
|
3
|
-
enabled: true
|
4
|
-
exclude: []
|
5
|
-
BooleanParameter:
|
6
|
-
enabled: true
|
7
|
-
exclude: []
|
8
|
-
ClassVariable:
|
9
|
-
enabled: true
|
10
|
-
exclude: []
|
11
|
-
ControlParameter:
|
12
|
-
enabled: true
|
13
|
-
exclude: []
|
14
|
-
DataClump:
|
15
|
-
enabled: true
|
16
|
-
exclude: []
|
17
|
-
max_copies: 2
|
18
|
-
min_clump_size: 2
|
19
|
-
DuplicateMethodCall:
|
20
|
-
enabled: true
|
21
|
-
exclude: []
|
22
|
-
max_calls: 1
|
23
|
-
allow_calls: []
|
24
|
-
FeatureEnvy:
|
25
|
-
enabled: true
|
26
|
-
exclude: []
|
27
|
-
IrresponsibleModule:
|
28
|
-
enabled: true
|
29
|
-
exclude: []
|
30
|
-
LongParameterList:
|
31
|
-
enabled: true
|
32
|
-
exclude: []
|
33
|
-
max_params: 2
|
34
|
-
overrides:
|
35
|
-
initialize:
|
36
|
-
max_params: 3
|
37
|
-
LongYieldList:
|
38
|
-
enabled: true
|
39
|
-
exclude: []
|
40
|
-
max_params: 2
|
41
|
-
NestedIterators:
|
42
|
-
enabled: true
|
43
|
-
exclude: []
|
44
|
-
max_allowed_nesting: 1
|
45
|
-
ignore_iterators: []
|
46
|
-
NilCheck:
|
47
|
-
enabled: true
|
48
|
-
exclude: []
|
49
|
-
RepeatedConditional:
|
50
|
-
enabled: true
|
51
|
-
exclude: []
|
52
|
-
max_ifs: 1
|
53
|
-
TooManyInstanceVariables:
|
54
|
-
enabled: true
|
55
|
-
exclude: []
|
56
|
-
max_instance_variables: 3
|
57
|
-
TooManyMethods:
|
58
|
-
enabled: true
|
59
|
-
exclude: []
|
60
|
-
max_methods: 10
|
61
|
-
TooManyStatements:
|
62
|
-
enabled: true
|
63
|
-
exclude:
|
64
|
-
- each
|
65
|
-
max_statements: 2
|
66
|
-
UncommunicativeMethodName:
|
67
|
-
enabled: true
|
68
|
-
exclude: []
|
69
|
-
reject:
|
70
|
-
- !ruby/regexp /^[a-z]$/
|
71
|
-
- !ruby/regexp /[0-9]$/
|
72
|
-
- !ruby/regexp /[A-Z]/
|
73
|
-
accept: []
|
74
|
-
UncommunicativeModuleName:
|
75
|
-
enabled: true
|
76
|
-
exclude: []
|
77
|
-
reject:
|
78
|
-
- !ruby/regexp /^.$/
|
79
|
-
- !ruby/regexp /[0-9]$/
|
80
|
-
accept: []
|
81
|
-
UncommunicativeParameterName:
|
82
|
-
enabled: true
|
83
|
-
exclude: []
|
84
|
-
reject:
|
85
|
-
- !ruby/regexp /^.$/
|
86
|
-
- !ruby/regexp /[0-9]$/
|
87
|
-
- !ruby/regexp /[A-Z]/
|
88
|
-
accept: []
|
89
|
-
UncommunicativeVariableName:
|
90
|
-
enabled: true
|
91
|
-
exclude: []
|
92
|
-
reject:
|
93
|
-
- !ruby/regexp /^.$/
|
94
|
-
- !ruby/regexp /[0-9]$/
|
95
|
-
- !ruby/regexp /[A-Z]/
|
96
|
-
accept: []
|
97
|
-
UnusedParameters:
|
98
|
-
enabled: true
|
99
|
-
exclude: []
|
100
|
-
UtilityFunction:
|
101
|
-
enabled: true
|
102
|
-
exclude: []
|
103
|
-
max_helper_calls: 0
|
data/config/rubocop.yml
DELETED
@@ -1,92 +0,0 @@
|
|
1
|
-
AllCops:
|
2
|
-
Includes:
|
3
|
-
- '**/*.rake'
|
4
|
-
- 'Gemfile'
|
5
|
-
- 'Gemfile.devtools'
|
6
|
-
Excludes:
|
7
|
-
- '**/vendor/**'
|
8
|
-
- '**/benchmarks/**'
|
9
|
-
|
10
|
-
# Avoid parameter lists longer than five parameters.
|
11
|
-
ParameterLists:
|
12
|
-
Max: 3
|
13
|
-
CountKeywordArgs: true
|
14
|
-
|
15
|
-
# Limit method length
|
16
|
-
MethodLength:
|
17
|
-
CountComments: false
|
18
|
-
Max: 10
|
19
|
-
|
20
|
-
# Avoid more than `Max` levels of nesting.
|
21
|
-
BlockNesting:
|
22
|
-
Max: 3
|
23
|
-
|
24
|
-
# Align with the style guide.
|
25
|
-
CollectionMethods:
|
26
|
-
PreferredMethods:
|
27
|
-
collect: 'map'
|
28
|
-
inject: 'reduce'
|
29
|
-
find: 'detect'
|
30
|
-
find_all: 'select'
|
31
|
-
|
32
|
-
# Do not force public/protected/private keyword to be indented at the same
|
33
|
-
# level as the def keyword. My personal preference is to outdent these keywords
|
34
|
-
# because I think when scanning code it makes it easier to identify the
|
35
|
-
# sections of code and visually separate them. When the keyword is at the same
|
36
|
-
# level I think it sort of blends in with the def keywords and makes it harder
|
37
|
-
# to scan the code and see where the sections are.
|
38
|
-
AccessModifierIndentation:
|
39
|
-
Enabled: false
|
40
|
-
|
41
|
-
# Limit line length
|
42
|
-
LineLength:
|
43
|
-
Max: 79
|
44
|
-
|
45
|
-
# Disable documentation checking until a class needs to be documented once
|
46
|
-
Documentation:
|
47
|
-
Enabled: false
|
48
|
-
|
49
|
-
# Do not always use &&/|| instead of and/or.
|
50
|
-
AndOr:
|
51
|
-
Enabled: false
|
52
|
-
|
53
|
-
# Do not favor modifier if/unless usage when you have a single-line body
|
54
|
-
IfUnlessModifier:
|
55
|
-
Enabled: false
|
56
|
-
|
57
|
-
# Allow case equality operator (in limited use within the specs)
|
58
|
-
CaseEquality:
|
59
|
-
Enabled: false
|
60
|
-
|
61
|
-
# Constants do not always have to use SCREAMING_SNAKE_CASE
|
62
|
-
ConstantName:
|
63
|
-
Enabled: false
|
64
|
-
|
65
|
-
# Not all trivial readers/writers can be defined with attr_* methods
|
66
|
-
TrivialAccessors:
|
67
|
-
Enabled: false
|
68
|
-
|
69
|
-
# Do not prefer do/end over {} for multiline blocks
|
70
|
-
Blocks:
|
71
|
-
Enabled: false
|
72
|
-
|
73
|
-
# Allow empty lines around body
|
74
|
-
EmptyLinesAroundBody:
|
75
|
-
Enabled: false
|
76
|
-
|
77
|
-
# Prefer String#% over Kernel#sprintf
|
78
|
-
FormatString:
|
79
|
-
Enabled: false
|
80
|
-
|
81
|
-
# Use square brackets for literal Array objects
|
82
|
-
PercentLiteralDelimiters:
|
83
|
-
PreferredDelimiters:
|
84
|
-
'%': ()
|
85
|
-
'%i': '[]'
|
86
|
-
'%q': ()
|
87
|
-
'%Q': ()
|
88
|
-
'%r': '{}'
|
89
|
-
'%s': ()
|
90
|
-
'%w': '[]'
|
91
|
-
'%W': '[]'
|
92
|
-
'%x': ()
|
data/config/yardstick.yml
DELETED