rom-rethinkdb 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: bf51e41aa01e1f33029552faf947afdb96819a4b
4
+ data.tar.gz: 388abcfd2f07fdc77ec2c239d26554138e74a499
5
+ SHA512:
6
+ metadata.gz: 156ed915c53b0af035210b6cde5c9c347e87c642dc4153a7c70e6d44efd4b39fcf114741b8761c2cb685b0747cab336fb9d8243c289fea0fc558afbae0f08348
7
+ data.tar.gz: 84b853a2790d83828229e032e06237e74ae91890ed4d7ef7b1f9fb59d4cc22df61f9670bccc701cc307bfbb028183582af1122c7fcb9f68e2927ea97733addc7
@@ -0,0 +1,17 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ *.bundle
11
+ *.so
12
+ *.o
13
+ *.a
14
+ mkmf.log
15
+ log/*.log
16
+ .ruby-version
17
+ rethinkdb_data
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --order random
@@ -0,0 +1,67 @@
1
+ # Generated by `rubocop --auto-gen-config`
2
+ inherit_from: .rubocop_todo.yml
3
+
4
+ # It’s quite readable when we know what we are doing
5
+ Lint/AssignmentInCondition:
6
+ Enabled: false
7
+
8
+ # No need to handle LoadError in rake
9
+ Lint/HandleExceptions:
10
+ Exclude:
11
+ - Rakefile
12
+
13
+ # The enforced style doesn’t match Vim’s defaults
14
+ Style/AlignParameters:
15
+ Enabled: false
16
+
17
+ # UTF-8 is perfectly fine in comments
18
+ Style/AsciiComments:
19
+ Enabled: false
20
+
21
+ # Allow using braces for value-returning blocks
22
+ Style/Blocks:
23
+ Enabled: false
24
+
25
+ # Documentation checked by Inch CI
26
+ Style/Documentation:
27
+ Enabled: false
28
+
29
+ # Early returns have their vices
30
+ Style/GuardClause:
31
+ Enabled: false
32
+
33
+ # Need to be skipped for >-> usage
34
+ Style/Lambda:
35
+ Enabled: false
36
+
37
+ # Multiline block chains are ok
38
+ Style/MultilineBlockChain:
39
+ Enabled: false
40
+
41
+ # Even a single escaped slash can be confusing
42
+ Style/RegexpLiteral:
43
+ MaxSlashes: 0
44
+
45
+ # Don’t introduce semantic fail/raise distinction
46
+ Style/SignalException:
47
+ EnforcedStyle: only_raise
48
+
49
+ # Need to be skipped for >-> usage
50
+ Style/SpaceAroundOperators:
51
+ Enabled: false
52
+
53
+ # Accept both single and double quotes
54
+ Style/StringLiterals:
55
+ Enabled: false
56
+
57
+ # Allow def self.foo; @foo; end
58
+ Style/TrivialAccessors:
59
+ Enabled: false
60
+
61
+ # Allow rom-rethinkdb
62
+ Style/FileName:
63
+ Enabled: false
64
+
65
+ # Allow logical `or`/`and` in conditionals
66
+ Style/AndOr:
67
+ EnforcedStyle: conditionals
@@ -0,0 +1,21 @@
1
+ # This configuration was generated by `rubocop --auto-gen-config`
2
+ # on 2015-05-01 14:40:38 +0200 using RuboCop version 0.30.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: 2
9
+ Style/Documentation:
10
+ Enabled: false
11
+
12
+ # Offense count: 1
13
+ # Configuration parameters: Exclude.
14
+ Style/FileName:
15
+ Enabled: false
16
+
17
+ # Offense count: 16
18
+ # Cop supports --auto-correct.
19
+ # Configuration parameters: EnforcedStyle, SupportedStyles.
20
+ Style/StringLiterals:
21
+ Enabled: false
@@ -0,0 +1,27 @@
1
+ language: ruby
2
+ bundler_args: --without yard guard benchmarks
3
+ before_script:
4
+ - source /etc/lsb-release && echo "deb http://download.rethinkdb.com/apt $DISTRIB_CODENAME main" | sudo tee /etc/apt/sources.list.d/rethinkdb.list
5
+ - wget -qO- http://download.rethinkdb.com/apt/pubkey.gpg | sudo apt-key add -
6
+ - sudo apt-get update
7
+ - sudo apt-get install rethinkdb
8
+ - sudo cp /etc/rethinkdb/default.conf.sample /etc/rethinkdb/instances.d/instance1.conf
9
+ - sudo /etc/init.d/rethinkdb restart
10
+ script: "bundle exec rake spec"
11
+ rvm:
12
+ - 2.0
13
+ - 2.1
14
+ - 2.2
15
+ - rbx-2
16
+ - jruby
17
+ - ruby-head
18
+ matrix:
19
+ allow_failures:
20
+ - rvm: ruby-head
21
+ notifications:
22
+ webhooks:
23
+ urls:
24
+ - https://webhooks.gitter.im/e/39e1225f489f38b0bd09
25
+ on_success: change
26
+ on_failure: always
27
+ on_start: false
@@ -0,0 +1,3 @@
1
+ 0.0.1 2015-08-19
2
+
3
+ First public release \o/
data/Gemfile ADDED
@@ -0,0 +1,15 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
4
+
5
+ group :test do
6
+ gem 'rom', github: 'rom-rb/rom', branch: 'master'
7
+ gem 'virtus'
8
+ gem 'activesupport'
9
+ gem 'rspec', '~> 3.1'
10
+ gem 'codeclimate-test-reporter', require: false
11
+ end
12
+
13
+ group :tools do
14
+ gem 'rubocop', '~> 0.28.0'
15
+ end
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2015 Ruby Object Mapper
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
22
+
@@ -0,0 +1,36 @@
1
+ [gem]: https://rubygems.org/gems/rom-rethinkdb
2
+ [travis]: https://travis-ci.org/rom-rb/rom-rethinkdb
3
+ [gemnasium]: https://gemnasium.com/rom-rb/rom-rethinkdb
4
+ [codeclimate]: https://codeclimate.com/github/rom-rb/rom-rethinkdb
5
+ [inchpages]: http://inch-ci.org/github/rom-rb/rom-rethinkdb
6
+
7
+ # ROM::Rethinkdb
8
+
9
+ [![Gem Version](https://badge.fury.io/rb/rom-rethinkdb.svg)][gem]
10
+ [![Build Status](https://travis-ci.org/rom-rb/rom-rethinkdb.svg?branch=master)][travis]
11
+ [![Dependency Status](https://gemnasium.com/rom-rb/rom-rethinkdb.png)][gemnasium]
12
+ [![Code Climate](https://codeclimate.com/github/rom-rb/rom-rethinkdb/badges/gpa.svg)][codeclimate]
13
+ [![Test Coverage](https://codeclimate.com/github/rom-rb/rom-rethinkdb/badges/coverage.svg)][codeclimate]
14
+ [![Inline docs](http://inch-ci.org/github/rom-rb/rom-rethinkdb.svg?branch=master)][inchpages]
15
+
16
+ RethinkDB suport for [Ruby Object Mapper](https://github.com/rom-rb/rom).
17
+
18
+ ## Installation
19
+
20
+ Add this line to your application's Gemfile:
21
+
22
+ ```ruby
23
+ gem 'rom-rethinkdb'
24
+ ```
25
+
26
+ And then execute:
27
+
28
+ $ bundle
29
+
30
+ Or install it yourself as:
31
+
32
+ $ gem install rom-rethinkdb
33
+
34
+ ## License
35
+
36
+ See `LICENSE` file.
@@ -0,0 +1,10 @@
1
+ require 'rubocop/rake_task'
2
+ RuboCop::RakeTask.new
3
+
4
+ require "rspec/core/rake_task"
5
+ RSpec::Core::RakeTask.new(:spec)
6
+
7
+ task default: [:ci]
8
+
9
+ desc "Run CI tasks"
10
+ task ci: [:spec]
@@ -0,0 +1 @@
1
+ require 'rom/rethinkdb'
@@ -0,0 +1,8 @@
1
+ require 'rethinkdb'
2
+
3
+ require 'rom'
4
+ require 'rom/rethinkdb/version'
5
+ require 'rom/rethinkdb/relation'
6
+ require 'rom/rethinkdb/gateway'
7
+
8
+ ROM.register_adapter(:rethinkdb, ROM::RethinkDB)
@@ -0,0 +1,3 @@
1
+ require 'rom/rethinkdb/commands/create'
2
+ require 'rom/rethinkdb/commands/update'
3
+ require 'rom/rethinkdb/commands/delete'
@@ -0,0 +1,34 @@
1
+ require 'rom/commands'
2
+ require 'rom/commands/create'
3
+
4
+ module ROM
5
+ module RethinkDB
6
+ module Commands
7
+ class Create < ROM::Commands::Create
8
+ adapter :rethinkdb
9
+
10
+ def execute(tuples)
11
+ insert_tuples = [tuples].flatten.map do |tuple|
12
+ attributes = input[tuple]
13
+ validator.call(attributes)
14
+ attributes.to_h
15
+ end
16
+
17
+ insert(insert_tuples)
18
+ end
19
+
20
+ def insert(tuples)
21
+ pks = dataset.scope.insert(tuples)
22
+ .run(dataset.connection)["generated_keys"]
23
+
24
+ dataset.filter { |user| relation.rql.expr(pks).contains(user["id"]) }
25
+ .to_a
26
+ end
27
+
28
+ def dataset
29
+ relation.dataset
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,22 @@
1
+ require 'rom/commands'
2
+ require 'rom/commands/delete'
3
+
4
+ module ROM
5
+ module RethinkDB
6
+ module Commands
7
+ class Delete < ROM::Commands::Delete
8
+ adapter :rethinkdb
9
+
10
+ def execute
11
+ deleted = dataset.to_a
12
+ dataset.scope.delete.run(dataset.connection)
13
+ deleted
14
+ end
15
+
16
+ def dataset
17
+ relation.dataset
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,29 @@
1
+ require 'rom/commands'
2
+ require 'rom/commands/update'
3
+
4
+ module ROM
5
+ module RethinkDB
6
+ module Commands
7
+ class Update < ROM::Commands::Update
8
+ adapter :rethinkdb
9
+
10
+ def execute(tuple)
11
+ attributes = input[tuple]
12
+ validator.call(attributes)
13
+ tuple = attributes.to_h
14
+
15
+ update(tuple)
16
+ end
17
+
18
+ def update(tuple)
19
+ dataset.scope.update(tuple).run(dataset.connection)
20
+ dataset.to_a
21
+ end
22
+
23
+ def dataset
24
+ relation.dataset
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,35 @@
1
+ module ROM
2
+ module RethinkDB
3
+ # Dataset for RethinkDB
4
+ #
5
+ # @api public
6
+ class Dataset
7
+ attr_reader :scope, :rql, :connection
8
+
9
+ def initialize(scope, rql, connection)
10
+ @scope = scope
11
+ @rql = rql
12
+ @connection = connection
13
+ end
14
+
15
+ def to_a
16
+ scope.run(connection)
17
+ end
18
+
19
+ def each(&block)
20
+ to_a.each(&block)
21
+ end
22
+
23
+ def count
24
+ scope.count.run(connection)
25
+ end
26
+
27
+ [:filter, :pluck, :order_by].each do |method_name|
28
+ define_method(method_name) do |*args, &block|
29
+ self.class.new(scope.send(method_name, *args, &block), rql,
30
+ connection)
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,74 @@
1
+ require 'rom/rethinkdb/dataset'
2
+ require 'rom/rethinkdb/commands'
3
+
4
+ module ROM
5
+ module RethinkDB
6
+ class Gateway < ROM::Gateway
7
+ # RethinkDB gateway interface
8
+ #
9
+ # @overload connect(options)
10
+ # Connects to database passing options
11
+ #
12
+ # @param [Hash] options connection options
13
+ #
14
+ # @example
15
+ # gateway = ROM::RethinkDB::Gateway.new({ host: 'localhost',
16
+ # port: 28015, db: 'database' })
17
+ #
18
+ # @api public
19
+ def initialize(options)
20
+ @datasets = {}
21
+ @options = options
22
+ @rql = ::RethinkDB::RQL.new
23
+ @connection = rql.connect(options)
24
+ end
25
+
26
+ # Return dataset with the given name
27
+ #
28
+ # @param [String] name a dataset name
29
+ #
30
+ # @return [Dataset]
31
+ #
32
+ # @api public
33
+ def dataset(name)
34
+ rql.db(options[:db]).table(name.to_s).run(connection)
35
+ datasets[name] = Dataset.new(rql.table(name.to_s), rql, connection)
36
+ end
37
+
38
+ # Return dataset with the given name
39
+ #
40
+ # @param [String] name dataset name
41
+ #
42
+ # @return [Dataset]
43
+ #
44
+ # @api public
45
+ def [](name)
46
+ datasets[name.to_s]
47
+ end
48
+
49
+ # Check if dataset exists
50
+ #
51
+ # @param [String] name dataset name
52
+ #
53
+ # @api public
54
+ def dataset?(name)
55
+ rql.db(options[:db]).table(name.to_s).run(connection)
56
+ true
57
+ rescue ::RethinkDB::RqlRuntimeError
58
+ false
59
+ end
60
+
61
+ # Disconnect from database
62
+ #
63
+ # @api public
64
+ def disconnect
65
+ connection.close
66
+ end
67
+
68
+ private
69
+
70
+ # @api private
71
+ attr_reader :datasets, :options, :rql
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,34 @@
1
+ module ROM
2
+ module RethinkDB
3
+ # Relation subclass of RethinkDB adapter
4
+ #
5
+ # @example
6
+ # class Users < ROM::Relation[:rethinkdb]
7
+ # end
8
+ #
9
+ # @api public
10
+ class Relation < ROM::Relation
11
+ adapter :rethinkdb
12
+
13
+ def rql
14
+ dataset.rql
15
+ end
16
+
17
+ def count
18
+ dataset.count
19
+ end
20
+
21
+ def filter(*args, &block)
22
+ __new__(dataset.__send__(__method__, *args, &block))
23
+ end
24
+
25
+ def pluck(*args, &block)
26
+ __new__(dataset.__send__(__method__, *args, &block))
27
+ end
28
+
29
+ def order_by(*args, &block)
30
+ __new__(dataset.__send__(__method__, *args, &block))
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,5 @@
1
+ module ROM
2
+ module RethinkDB
3
+ VERSION = '0.0.1'
4
+ end
5
+ end
@@ -0,0 +1,26 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'rom/rethinkdb/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'rom-rethinkdb'
8
+ spec.version = ROM::RethinkDB::VERSION
9
+ spec.authors = ['Krzysztof Wawer']
10
+ spec.email = ['krzysztof.wawer@gmail.com']
11
+ spec.summary = 'RethinkDB support for ROM'
12
+ spec.description = spec.summary
13
+ spec.homepage = 'http://rom-rb.org'
14
+ spec.license = 'MIT'
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ['lib']
20
+
21
+ spec.add_runtime_dependency 'rethinkdb'
22
+ spec.add_runtime_dependency 'rom', '~> 0.9', '>= 0.9.0'
23
+
24
+ spec.add_development_dependency 'bundler'
25
+ spec.add_development_dependency 'rake', '~> 10.0'
26
+ end
@@ -0,0 +1,77 @@
1
+ require 'spec_helper'
2
+ require 'virtus'
3
+
4
+ describe 'Commands / Create' do
5
+ subject(:rom) { setup.finalize }
6
+
7
+ # If :rethinkdb is not passed in the gateway is named `:default`
8
+ let(:setup) { ROM.setup(:rethinkdb, db_options.merge(db: 'test_db')) }
9
+
10
+ subject(:users) { rom.commands.users }
11
+
12
+ before do
13
+ create_table('test_db', 'users')
14
+
15
+ setup.relation(:users)
16
+
17
+ class User
18
+ include Virtus.model
19
+
20
+ attribute :id, Integer
21
+ attribute :name, String
22
+ attribute :street, String
23
+ end
24
+
25
+ setup.mappers do
26
+ define(:users) do
27
+ model User
28
+ register_as :entity
29
+ end
30
+ end
31
+
32
+ setup.commands(:users) do
33
+ define(:create) do
34
+ result :one
35
+ end
36
+
37
+ define(:create_many, type: :create) do
38
+ result :many
39
+ end
40
+ end
41
+ end
42
+
43
+ after do
44
+ drop_table('test_db', 'users')
45
+ end
46
+
47
+ it 'returns a single tuple when result is set to :one' do
48
+ result = users.try do
49
+ users.create.call('name' => 'John', 'street' => 'Main Street')
50
+ end
51
+ result = result.value
52
+ result.delete("id")
53
+ expect(result).to eql('name' => 'John', 'street' => 'Main Street')
54
+
55
+ result = rom.relation(:users).as(:entity).to_a
56
+ expect(result.count).to eql(1)
57
+ end
58
+
59
+ it 'returns tuples when result is set to :many' do
60
+ result = users.try do
61
+ users.create_many.call([
62
+ { 'name' => 'Jane', 'street' => 'Main Street' },
63
+ { 'name' => 'Jack', 'street' => 'Main Street' }
64
+ ])
65
+ end
66
+ result = result.value.to_a
67
+ result.each_with_index { |_, index| result[index].delete('id') }
68
+
69
+ expect(result).to match_array([
70
+ { 'name' => 'Jane', 'street' => 'Main Street' },
71
+ { 'name' => 'Jack', 'street' => 'Main Street' }
72
+ ])
73
+
74
+ result = rom.relation(:users).as(:entity).to_a
75
+ expect(result.count).to eql(2)
76
+ end
77
+ end
@@ -0,0 +1,52 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Commands / Delete' do
4
+ subject(:rom) { setup.finalize }
5
+
6
+ # If :rethinkdb is not passed in the gateway is named `:default`
7
+ let(:setup) { ROM.setup(:rethinkdb, db_options.merge(db: 'test_db')) }
8
+
9
+ subject(:users) { rom.commands.users }
10
+ let(:gateway) { rom.gateways[:default] }
11
+
12
+ before do
13
+ create_table('test_db', 'users')
14
+
15
+ setup.relation(:users) do
16
+ def by_id(id)
17
+ filter(id: id)
18
+ end
19
+ end
20
+
21
+ setup.commands(:users) do
22
+ define(:delete) do
23
+ result :one
24
+ end
25
+ end
26
+
27
+ # fill table
28
+ [
29
+ { name: 'John', street: 'Main Street' }
30
+ ].each do |data|
31
+ gateway.send(:rql).table('users').insert(data)
32
+ .run(gateway.connection)
33
+ end
34
+ end
35
+
36
+ after do
37
+ drop_table('test_db', 'users')
38
+ end
39
+
40
+ it 'deletes all tuples in a restricted relation' do
41
+ element = rom.relation(:users).to_a.first
42
+
43
+ result = users.try { users.delete.by_id(element['id']).call }
44
+ result = result.value
45
+ result.delete('id')
46
+
47
+ expect(result).to eql('name' => 'John', 'street' => 'Main Street')
48
+
49
+ result = rom.relation(:users).to_a
50
+ expect(result.count).to eql(0)
51
+ end
52
+ end
@@ -0,0 +1,68 @@
1
+ require 'spec_helper'
2
+ require 'virtus'
3
+
4
+ describe 'Commands / Updates' do
5
+ subject(:rom) { setup.finalize }
6
+
7
+ # If :rethinkdb is not passed in the gateway is named `:default`
8
+ let(:setup) { ROM.setup(:rethinkdb, db_options.merge(db: 'test_db')) }
9
+
10
+ subject(:users) { rom.commands.users }
11
+ let(:gateway) { rom.gateways[:default] }
12
+
13
+ before do
14
+ create_table('test_db', 'users')
15
+
16
+ setup.relation(:users) do
17
+ def by_id(id)
18
+ filter(id: id)
19
+ end
20
+ end
21
+
22
+ class User
23
+ include Virtus.model
24
+
25
+ attribute :id, Integer
26
+ attribute :name, String
27
+ attribute :street, String
28
+ end
29
+
30
+ setup.mappers do
31
+ define(:users) do
32
+ model User
33
+ register_as :entity
34
+ end
35
+ end
36
+
37
+ setup.commands(:users) do
38
+ define(:update)
39
+ end
40
+
41
+ # fill table
42
+ [
43
+ { name: 'John', street: 'Main Street' }
44
+ ].each do |data|
45
+ gateway.send(:rql).table('users').insert(data)
46
+ .run(gateway.connection)
47
+ end
48
+ end
49
+
50
+ after do
51
+ drop_table('test_db', 'users')
52
+ end
53
+
54
+ it 'updates everything when there is no original tuple' do
55
+ element = rom.relation(:users).as(:entity).to_a.first
56
+ expect(element.name).to eql('John')
57
+ expect(element.street).to eql('Main Street')
58
+
59
+ result = users.try do
60
+ users.update.by_id(element.id).call(street: '2nd Street')
61
+ end
62
+ result = result.value.to_a
63
+ result.each_with_index { |_, index| result[index].delete('id') }
64
+
65
+ expect(result)
66
+ .to match_array([{ 'name' => 'John', 'street' => '2nd Street' }])
67
+ end
68
+ end
@@ -0,0 +1,122 @@
1
+ require 'spec_helper'
2
+
3
+ require 'virtus'
4
+
5
+ describe 'RethinkDB gateway' do
6
+ include PrepareDB
7
+
8
+ let(:gateway) { rom.gateways[:default] }
9
+ let(:setup) { ROM.setup(:rethinkdb, db_options.merge(db: 'test_db')) }
10
+ subject(:rom) { setup.finalize }
11
+
12
+ before do
13
+ create_table('test_db', 'users')
14
+
15
+ setup.relation(:users) do
16
+ def with_name(name)
17
+ filter(name: name)
18
+ end
19
+
20
+ def only_john_and_jane
21
+ filter { |user| rql.expr(%w(John Jane)).contains(user["name"]) }
22
+ end
23
+
24
+ def only_names
25
+ pluck('name')
26
+ end
27
+
28
+ def by_name
29
+ order_by('name')
30
+ end
31
+
32
+ def names_on_street(street)
33
+ filter(street: street).order_by('name').pluck(:name)
34
+ end
35
+ end
36
+
37
+ class User
38
+ include Virtus.value_object
39
+
40
+ values do
41
+ attribute :id, Integer
42
+ attribute :name, String
43
+ attribute :street, String
44
+ end
45
+ end
46
+
47
+ setup.mappers do
48
+ define(:users) do
49
+ model(User)
50
+ register_as(:entity)
51
+ end
52
+ end
53
+
54
+ # fill table
55
+ [
56
+ { name: 'John', street: 'Main Street' },
57
+ { name: 'Joe', street: '2nd Street' },
58
+ { name: 'Jane', street: 'Main Street' }
59
+ ].each do |data|
60
+ gateway.send(:rql).table('users').insert(data)
61
+ .run(gateway.connection)
62
+ end
63
+ end
64
+
65
+ after do
66
+ drop_table('test_db', 'users')
67
+ end
68
+
69
+ describe 'env#relation' do
70
+ it 'returns mapped object' do
71
+ jane = rom.relation(:users).as(:entity).with_name('Jane').to_a.first
72
+
73
+ expect(jane.name).to eql('Jane')
74
+ end
75
+
76
+ it 'returns John and Jane objects' do
77
+ users = rom.relation(:users).as(:entity).only_john_and_jane.to_a
78
+
79
+ expect(users.count).to eql(2)
80
+ expect(users.map(&:name).sort).to eql(%w(Jane John))
81
+ end
82
+
83
+ it 'returns specified fields' do
84
+ user = rom.relation(:users).as(:entity).only_names.to_a.first
85
+
86
+ expect(user.id).to be_nil
87
+ expect(user.name).not_to be_nil
88
+ expect(user.street).to be_nil
89
+ end
90
+
91
+ it 'returns ordered data' do
92
+ results = rom.relation(:users).as(:entity).by_name.to_a
93
+
94
+ expect(results[0].name).to eql('Jane')
95
+ expect(results[1].name).to eql('Joe')
96
+ expect(results[2].name).to eql('John')
97
+ end
98
+
99
+ it 'returns data with combined conditions' do
100
+ results = rom.relation(:users).as(:entity).names_on_street('Main Street')
101
+ .to_a
102
+
103
+ expect(results[0].id).to be_nil
104
+ expect(results[0].name).to eql('Jane')
105
+ expect(results[0].street).to be_nil
106
+
107
+ expect(results[1].id).to be_nil
108
+ expect(results[1].name).to eql('John')
109
+ expect(results[1].street).to be_nil
110
+ end
111
+ end
112
+
113
+ describe 'gateway#dataset?' do
114
+ it 'returns true if a collection exists' do
115
+ expect(gateway.dataset?(:users)).to be(true)
116
+ end
117
+
118
+ it 'returns false if a does not collection exist' do
119
+ expect(gateway.dataset?(:not_here)).to be(false)
120
+ end
121
+ end
122
+ end
@@ -0,0 +1,27 @@
1
+ # encoding: utf-8
2
+
3
+ require 'bundler'
4
+ Bundler.require
5
+
6
+ if RUBY_ENGINE == 'rbx'
7
+ require 'codeclimate-test-reporter'
8
+ CodeClimate::TestReporter.start
9
+ end
10
+
11
+ require 'rom-rethinkdb'
12
+
13
+ require_relative 'support/prepare_db'
14
+
15
+ RSpec.configure do |config|
16
+ config.include PrepareDB
17
+
18
+ config.before(:all) do
19
+ create_database('test_db')
20
+ end
21
+
22
+ config.after(:all) do
23
+ drop_database('test_db')
24
+ end
25
+ end
26
+
27
+ ROM.use :auto_registration
@@ -0,0 +1,50 @@
1
+ module PrepareDB
2
+ def create_database(database)
3
+ drop_database(database)
4
+
5
+ rql.db_create(database).run(connection)
6
+ end
7
+
8
+ def drop_database(database)
9
+ database_exist?(database) && rql.db_drop(database).run(connection)
10
+ end
11
+
12
+ def database_exist?(database)
13
+ database_list.include?(database.to_s)
14
+ end
15
+
16
+ def database_list
17
+ rql.db_list.run(connection)
18
+ end
19
+
20
+ def create_table(database, table)
21
+ drop_table(database, table)
22
+ rql.db(database).table_create(table).run(connection)
23
+ end
24
+
25
+ def drop_table(database, table)
26
+ if table_exist?(database, table)
27
+ rql.db(database).table_drop(table).run(connection)
28
+ end
29
+ end
30
+
31
+ def table_exist?(database, table)
32
+ table_list(database).include?(table.to_s)
33
+ end
34
+
35
+ def table_list(database)
36
+ rql.db(database).table_list.run(connection)
37
+ end
38
+
39
+ def rql
40
+ @rql ||= ::RethinkDB::RQL.new
41
+ end
42
+
43
+ def connection
44
+ @connection ||= rql.connect(db_options)
45
+ end
46
+
47
+ def db_options
48
+ { host: 'localhost', port: '28015' }
49
+ end
50
+ end
@@ -0,0 +1,24 @@
1
+ require 'spec_helper'
2
+
3
+ require 'rom/lint/spec'
4
+
5
+ describe ROM::RethinkDB::Gateway do
6
+ let(:gateway) { ROM::RethinkDB::Gateway }
7
+ let(:uri) { { host: 'localhost', port: '28015', db: 'database' } }
8
+
9
+ it_behaves_like "a rom gateway" do
10
+ let(:identifier) { :rethinkdb }
11
+ end
12
+
13
+ describe '.new' do
14
+ context 'default values' do
15
+ let(:connection) { gateway.new(uri).connection }
16
+
17
+ it 'returns them' do
18
+ expect(connection.default_db).to eql('database')
19
+ expect(connection.host).to eql('localhost')
20
+ expect(connection.port).to eql(28_015)
21
+ end
22
+ end
23
+ end
24
+ end
metadata ADDED
@@ -0,0 +1,141 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rom-rethinkdb
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Krzysztof Wawer
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-08-19 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rethinkdb
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rom
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '0.9'
34
+ - - ">="
35
+ - !ruby/object:Gem::Version
36
+ version: 0.9.0
37
+ type: :runtime
38
+ prerelease: false
39
+ version_requirements: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - "~>"
42
+ - !ruby/object:Gem::Version
43
+ version: '0.9'
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: 0.9.0
47
+ - !ruby/object:Gem::Dependency
48
+ name: bundler
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: '0'
61
+ - !ruby/object:Gem::Dependency
62
+ name: rake
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '10.0'
68
+ type: :development
69
+ prerelease: false
70
+ version_requirements: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: '10.0'
75
+ description: RethinkDB support for ROM
76
+ email:
77
+ - krzysztof.wawer@gmail.com
78
+ executables: []
79
+ extensions: []
80
+ extra_rdoc_files: []
81
+ files:
82
+ - ".gitignore"
83
+ - ".rspec"
84
+ - ".rubocop.yml"
85
+ - ".rubocop_todo.yml"
86
+ - ".travis.yml"
87
+ - CHANGELOG.md
88
+ - Gemfile
89
+ - LICENSE
90
+ - README.md
91
+ - Rakefile
92
+ - lib/rom-rethinkdb.rb
93
+ - lib/rom/rethinkdb.rb
94
+ - lib/rom/rethinkdb/commands.rb
95
+ - lib/rom/rethinkdb/commands/create.rb
96
+ - lib/rom/rethinkdb/commands/delete.rb
97
+ - lib/rom/rethinkdb/commands/update.rb
98
+ - lib/rom/rethinkdb/dataset.rb
99
+ - lib/rom/rethinkdb/gateway.rb
100
+ - lib/rom/rethinkdb/relation.rb
101
+ - lib/rom/rethinkdb/version.rb
102
+ - rom-rethinkdb.gemspec
103
+ - spec/integration/commands/create_spec.rb
104
+ - spec/integration/commands/delete_spec.rb
105
+ - spec/integration/commands/update_spec.rb
106
+ - spec/integration/repository_spec.rb
107
+ - spec/spec_helper.rb
108
+ - spec/support/prepare_db.rb
109
+ - spec/unit/gateway_spec.rb
110
+ homepage: http://rom-rb.org
111
+ licenses:
112
+ - MIT
113
+ metadata: {}
114
+ post_install_message:
115
+ rdoc_options: []
116
+ require_paths:
117
+ - lib
118
+ required_ruby_version: !ruby/object:Gem::Requirement
119
+ requirements:
120
+ - - ">="
121
+ - !ruby/object:Gem::Version
122
+ version: '0'
123
+ required_rubygems_version: !ruby/object:Gem::Requirement
124
+ requirements:
125
+ - - ">="
126
+ - !ruby/object:Gem::Version
127
+ version: '0'
128
+ requirements: []
129
+ rubyforge_project:
130
+ rubygems_version: 2.4.5
131
+ signing_key:
132
+ specification_version: 4
133
+ summary: RethinkDB support for ROM
134
+ test_files:
135
+ - spec/integration/commands/create_spec.rb
136
+ - spec/integration/commands/delete_spec.rb
137
+ - spec/integration/commands/update_spec.rb
138
+ - spec/integration/repository_spec.rb
139
+ - spec/spec_helper.rb
140
+ - spec/support/prepare_db.rb
141
+ - spec/unit/gateway_spec.rb