rom 0.4.0 → 0.4.1
Sign up to get free protection for your applications and to get access to all the features.
- 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