activerecord-crate-adapter 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c92b2e7b75c81dd6a9311fa896e68b2f7fb7f11f
4
- data.tar.gz: 68fba8a8fd6fa57c4c4c134a235b5d8a87a2c545
3
+ metadata.gz: d4ded4506bbde8a818b21084414eebea95deb49e
4
+ data.tar.gz: 4ad62050c12839e881c4c940aca845b6a45144d7
5
5
  SHA512:
6
- metadata.gz: a6bbd362b466ffc8757f2dbe464b2fe25f136244161819ff95f4b79c6e9c928dd5e0e66ba0017a51b9f1d64a7f09cb497bbe23a5ae8ce6e2f170995ff6229ba2
7
- data.tar.gz: 45b2e48e6699be970d98613bc9f4368fe5aa4de1f9715a7b2aad11fdf84b00956e0957cb507ec788ce40dc2495137ac822ceaf7bd909d3257a9fffebd7a3b019
6
+ metadata.gz: ac47bffc111c1dcef655bf62a5553f40d5b4ff42908e8f3ede12c2b34bbf5ff02bb362e912d9bb2c3fd4146b535ec8370e4b33cb096ebf6909f4261eb07735fa
7
+ data.tar.gz: a29e36b5e7cca424ab1233eb8d68884330e5befce62168180533c2b4b87c7cf257298ea1d7cf1ea77566e1b0d4aa390630dc10451aa8ab2927f97f4729e53676
@@ -1,16 +1,15 @@
1
1
  language: ruby
2
2
  rvm:
3
3
  - "1.9.3"
4
- - "2.1.1"
5
4
  - "2.0.0"
5
+ - "2.1.5"
6
+ - "2.2.0"
6
7
  # uncomment this line if your project needs to run something other than `rake`:
7
8
 
8
9
  before_script:
9
- - wget https://cdn.crate.io/downloads/releases/crate-0.39.0.tar.gz -O /tmp/crate.tar.gz
10
+ - wget https://cdn.crate.io/downloads/releases/crate-0.47.3.tar.gz -O /tmp/crate.tar.gz
10
11
  - tar -xvf /tmp/crate.tar.gz
11
- - ls
12
- - echo $PWD
13
- - bundle exec ruby spec/travis_test_server.rb $PWD/crate-0.39.0/ 4209
12
+ - bundle exec ruby spec/test_server.rb $PWD/crate-0.47.3/ true
14
13
 
15
14
  script: bundle exec rspec spec
16
15
 
data/README.md CHANGED
@@ -8,6 +8,8 @@ The [Crate](http://www.crate.io) adapter for ActiveRecord.
8
8
 
9
9
  ## Installation
10
10
 
11
+ **Note:** `activerecord-crate-adapter` currently only works with Rails 4.1.x
12
+
11
13
  Add this line to your application's Gemfile:
12
14
 
13
15
  gem 'activerecord-crate-adapter'
@@ -44,20 +46,20 @@ please add an issue so we can discuss.
44
46
  end
45
47
 
46
48
  end
47
-
49
+
48
50
  ## Special Data Types
49
51
 
50
52
  ### Array
51
53
  You can simply create Array columns by specifying t.array and passing array_type when you create a migration.
52
-
54
+
53
55
  t.array :tags, array_type: :string
54
56
  t.array :votes, array_type: :integer
55
57
  t.array :bool_arr, array_type: :boolean
56
-
58
+
57
59
  When you create an object just pass your Array directly
58
60
 
59
61
  Post.create!(title: 'Arrays are awesome', tags: %w(hot fresh), votes: [1,2])
60
- post = Post.where("'fresh' = ANY (tags)")
62
+ post = Post.where("'fresh' = ANY (tags)")
61
63
 
62
64
  ### Object
63
65
  Crate allows you to define nested objects. I tried to make it as simply as possible to use and reuse existing AR functionality,
@@ -69,27 +71,27 @@ I tried to make your guys life easier and created a module that does this automa
69
71
  and assign it in the initializer. So a serialized class should look like this:
70
72
 
71
73
  require 'active_record/attribute_methods/crate_object'
72
-
74
+
73
75
  class Address
74
76
  attr_accessor :street, :city, :phones, :zip
75
-
77
+
76
78
  include CrateObject
77
-
79
+
78
80
  def initialize(opts)
79
81
  @street = opts[:street]
80
82
  @city = opts[:city]
81
83
  @phones = opts[:phones]
82
84
  @zip = opts[:zip]
83
85
  end
84
-
86
+
85
87
  end
86
88
 
87
- Check out CrateObject module if you need to write your own serializer.
88
-
89
+ Check out CrateObject module if you need to write your own serializer.
90
+
89
91
  Then in your model simply use #serialize to have objects working
90
92
 
91
- class User < ActiveRecord::Base
92
- serialize :address, Address
93
+ class User < ActiveRecord::Base
94
+ serialize :address, Address
93
95
  end
94
96
 
95
97
  Note: I do not plan to support nested objects inside objects.
@@ -97,11 +99,11 @@ Note: I do not plan to support nested objects inside objects.
97
99
  #### Object Migrations
98
100
 
99
101
  In the migrations you can create an object and specify the object behaviour(strict|dynamic|ignored) and it's schema.
100
-
102
+
101
103
  t.object :address, object_schema_behaviour: :strict,
102
104
  object_schema: {street: :string, city: :string, phones: {array: :string}, zip: :integer}
103
-
104
-
105
+
106
+
105
107
 
106
108
  ## Migrations
107
109
 
@@ -121,13 +123,14 @@ Crate does not support Joins (yet) so joins won't work.
121
123
 
122
124
  ## Tests
123
125
 
124
- First run the test instance of crate
126
+ Start up the crate server before running the tests
127
+
128
+ ruby spec/test_server.rb /path/to/crate
125
129
 
126
- $ ./spec/test_server.rb
130
+ Then run tests with
127
131
 
128
- then run the tests
132
+ bundle exec rspec spec
129
133
 
130
- $ rspec spec
131
134
 
132
135
  ## Contributing
133
136
 
@@ -141,4 +144,5 @@ Please refer to CONTRIBUTING.rst for further information.
141
144
  * [Christoph Klocker](http://www.vedanova.com), [@corck](http://www.twitter.com/corck)
142
145
 
143
146
  ##License & Copyright
144
- See LICENSE for details.
147
+
148
+ see LICENSE for details.
@@ -28,8 +28,8 @@ Gem::Specification.new do |spec|
28
28
  spec.version = ActiverecordCrateAdapter::VERSION
29
29
  spec.authors = ["Christoph Klocker", "CRATE Technology GmbH"]
30
30
  spec.email = ["office@crate.io"]
31
- spec.summary = "ActiveRecord Crate Data Adapter"
32
- spec.description = "ActiveRecord adapter for Crate Data, a shared-nothing, fully searchable, document-oriented cluster data store."
31
+ spec.summary = "ActiveRecord adapter for Crate"
32
+ spec.description = "ActiveRecord adapter for Crate, the distributed database for Docker."
33
33
  spec.homepage = "https://crate.io"
34
34
  spec.license = "Apache License, v2.0"
35
35
 
@@ -42,8 +42,7 @@ Gem::Specification.new do |spec|
42
42
  spec.add_development_dependency "rake"
43
43
  spec.add_development_dependency "rspec", "~> 2.14"
44
44
 
45
- spec.add_dependency('activerecord', '>= 4.0.0')
46
- spec.add_dependency('arel', '>= 4.0.0')
47
- spec.add_dependency('crate_ruby', '~> 0.0.6')
48
-
45
+ spec.add_dependency('activerecord', '~> 4.1.0')
46
+ spec.add_dependency('arel', '>= 5.0.0')
47
+ spec.add_dependency('crate_ruby', '~> 0.0.7')
49
48
  end
@@ -1,11 +1,18 @@
1
1
  # coding: UTF-8
2
2
 
3
3
  === unreleased
4
+
5
+ === 0.0.4
6
+
7
+ * Updated crate version to 0.45.7
8
+
4
9
  === 0.0.3
10
+
5
11
  * now officially supported by Crate Data and available under the
6
12
  Apache 2.0 License
7
13
 
8
14
  === 0.0.2
15
+
9
16
  * Switched query execution to parameter substitution
10
17
 
11
18
  === 0.0.1
@@ -131,11 +131,16 @@ module ActiveRecord
131
131
 
132
132
  def columns(table_name) #:nodoc:
133
133
  cols = @connection.table_structure(table_name).map do |field|
134
- CrateColumn.new(field[2], nil, field[4], nil)
134
+ name = dotted_name(field[2])
135
+ CrateColumn.new(name, nil, field[4], nil)
135
136
  end
136
137
  cols
137
138
  end
138
139
 
140
+ def dotted_name(name)
141
+ name.gsub(%r(\[['"]), '.').delete(%{'"]})
142
+ end
143
+
139
144
  def tables
140
145
  @connection.tables
141
146
  end
@@ -20,5 +20,5 @@
20
20
  # software solely pursuant to the terms of the relevant commercial agreement.
21
21
 
22
22
  module ActiverecordCrateAdapter
23
- VERSION = "0.0.3"
23
+ VERSION = "0.0.4"
24
24
  end
@@ -33,6 +33,7 @@ describe "Post#array" do
33
33
  t.array :bool_arr, array_type: :boolean
34
34
  end
35
35
  end
36
+ ensure_status('yellow')
36
37
  Post.reset_column_information
37
38
  end
38
39
 
@@ -81,4 +82,4 @@ describe "Post#array" do
81
82
 
82
83
  end
83
84
 
84
- end
85
+ end
@@ -31,6 +31,7 @@ describe "User#object" do
31
31
  object_schema: {street: :string, city: :string, phones: {array: :string}, zip: :integer}
32
32
  end
33
33
  end
34
+ ensure_status('yellow')
34
35
  User.reset_column_information
35
36
  end
36
37
 
@@ -56,4 +57,4 @@ describe "User#object" do
56
57
 
57
58
  end
58
59
 
59
- end
60
+ end
@@ -30,6 +30,7 @@ describe Post do
30
30
  t.integer :views
31
31
  end
32
32
  end
33
+ ensure_status('yellow')
33
34
  Post.reset_column_information
34
35
  end
35
36
 
@@ -61,7 +62,7 @@ describe Post do
61
62
  end
62
63
 
63
64
  it 'should persist the record to the database' do
64
- @post.persisted?.should be_true
65
+ @post.persisted?.should eq true
65
66
  refresh_posts
66
67
  Post.count.should eq 1
67
68
  end
@@ -29,6 +29,9 @@ require 'dummy/app/models/address'
29
29
  require 'dummy/app/models/post'
30
30
  require 'dummy/app/models/user'
31
31
 
32
+ HOST = "127.0.0.1"
33
+ PORT = 44200
34
+
32
35
  RSpec.configure do |config|
33
36
 
34
37
  config.before(:each) do
@@ -49,8 +52,8 @@ def connect
49
52
  'arunit' => {
50
53
  adapter: 'crate',
51
54
  min_messages: 'warning',
52
- port: 4209,
53
- host: '127.0.0.1'
55
+ host: HOST,
56
+ port: PORT,
54
57
  }
55
58
  }
56
59
  ActiveRecord::Base.establish_connection :arunit
@@ -61,4 +64,16 @@ end
61
64
  # query for the primary key
62
65
  def refresh_posts
63
66
  Post.connection.raw_connection.refresh_table('posts')
64
- end
67
+ end
68
+
69
+ # Wait till all table is synced to all shards
70
+ # this should be used after each create_table to prevent flaky tests
71
+ def ensure_status(expected_status)
72
+ req = Net::HTTP::Get.new("/_cluster/health?wait_for_status=#{expected_status}&timeout=10s")
73
+ resp = Net::HTTP.new(HOST, PORT)
74
+ response = resp.start { |http| http.request(req) }
75
+ actual_status = JSON.parse(response.body)['status']
76
+ raise WrongStatusError, "expected status #{expected_status}, got #{actual_status}" if actual_status != expected_status
77
+ end
78
+
79
+ class WrongStatusError < StandardError; end
@@ -21,57 +21,54 @@
21
21
  # software solely pursuant to the terms of the relevant commercial agreement.
22
22
 
23
23
  require 'net/http'
24
+
24
25
  class TestServer
25
- CRATE_PATH = "~/crate"
26
- TEST_PORT = 4209
27
26
  NAME = "TestCluster"
27
+ HOST = "127.0.0.1"
28
+ PORT = 44200
29
+ TIMEOUT = 30
28
30
 
29
-
30
- def initialize(crate_home = nil, port = nil, host = "127.0.0.1")
31
- @crate_home = crate_home || CRATE_PATH
32
- @port = port || TEST_PORT
33
- @host = host
31
+ def initialize(crate_home = '~/crate', run_in_background = false)
32
+ @crate_home = crate_home
33
+ @run_in_background = run_in_background
34
34
  end
35
35
 
36
36
  def start
37
- cmd = "sh #{File.join(@crate_home, 'bin/crate')} #{start_params}"
38
- @pid = spawn(cmd, :out => "/tmp/crate_test_server.out", :err => "/tmp/crate_test_server.err")
37
+ cmd = "sh #{File.join(@crate_home, 'bin', 'crate')} #{start_params}"
38
+ @pid = spawn(cmd, out: "/tmp/crate_test_server.out",
39
+ err: "/tmp/crate_test_server.err")
39
40
  Process.detach(@pid)
40
- puts 'starting'
41
+ puts 'Starting Crate... (this will take a few seconds)'
41
42
  time_slept = 0
43
+ interval = 2
42
44
  while true
43
- puts "Crate not yet fully available. Waiting since #{time_slept} seconds..." unless alive?
44
- sleep(2)
45
- time_slept += 2
45
+ if !alive? and time_slept > TIMEOUT
46
+ puts "Crate hasn't started for #{TIMEOUT} seconds. Giving up now..."
47
+ exit
48
+ end
49
+ if alive? and @run_in_background
50
+ exit
51
+ end
52
+ sleep(interval)
53
+ time_slept += interval
46
54
  end
47
55
  end
48
56
 
49
- def stop
50
- Process.kill("HUP", @pid)
51
- end
52
-
53
57
  private
54
58
 
55
-
56
- def crate_exec
57
- end
58
-
59
- def crate_config
60
- end
61
-
62
59
  def start_params
63
60
  "-Des.index.storage.type=memory " +
64
61
  "-Des.node.name=#{NAME} " +
65
- "-Des.cluster.name=Testing#{@port} " +
66
- "-Des.http.port=#{@port}-#{@port} " +
62
+ "-Des.cluster.name=Testing#{PORT} " +
63
+ "-Des.http.port=#{PORT}-#{PORT} " +
67
64
  "-Des.network.host=localhost " +
68
- "-Des.discovery.type=zen " +
69
- "-Des.discovery.zen.ping.multicast.enabled=false"
65
+ "-Des.discovery.zen.ping.multicast.enabled=false " +
66
+ "-Des.es.api.enabled=true"
70
67
  end
71
68
 
72
69
  def alive?
73
70
  req = Net::HTTP::Get.new('/')
74
- resp = Net::HTTP.new(@host, @port)
71
+ resp = Net::HTTP.new(HOST, PORT)
75
72
  begin
76
73
  response = resp.start { |http| http.request(req) }
77
74
  response.code == "200" ? true : false
@@ -79,15 +76,7 @@ class TestServer
79
76
  false
80
77
  end
81
78
  end
82
-
83
79
  end
84
80
 
85
- server = TestServer.new *ARGV
81
+ server = TestServer.new(*ARGV)
86
82
  server.start
87
-
88
- trap("INT") do
89
- puts "Script terminated by user."
90
- server.stop
91
- puts "Server stopped"
92
- exit
93
- end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activerecord-crate-adapter
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Christoph Klocker
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-07-29 00:00:00.000000000 Z
12
+ date: 2015-02-18 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -57,46 +57,45 @@ dependencies:
57
57
  name: activerecord
58
58
  requirement: !ruby/object:Gem::Requirement
59
59
  requirements:
60
- - - '>='
60
+ - - ~>
61
61
  - !ruby/object:Gem::Version
62
- version: 4.0.0
62
+ version: 4.1.0
63
63
  type: :runtime
64
64
  prerelease: false
65
65
  version_requirements: !ruby/object:Gem::Requirement
66
66
  requirements:
67
- - - '>='
67
+ - - ~>
68
68
  - !ruby/object:Gem::Version
69
- version: 4.0.0
69
+ version: 4.1.0
70
70
  - !ruby/object:Gem::Dependency
71
71
  name: arel
72
72
  requirement: !ruby/object:Gem::Requirement
73
73
  requirements:
74
74
  - - '>='
75
75
  - !ruby/object:Gem::Version
76
- version: 4.0.0
76
+ version: 5.0.0
77
77
  type: :runtime
78
78
  prerelease: false
79
79
  version_requirements: !ruby/object:Gem::Requirement
80
80
  requirements:
81
81
  - - '>='
82
82
  - !ruby/object:Gem::Version
83
- version: 4.0.0
83
+ version: 5.0.0
84
84
  - !ruby/object:Gem::Dependency
85
85
  name: crate_ruby
86
86
  requirement: !ruby/object:Gem::Requirement
87
87
  requirements:
88
88
  - - ~>
89
89
  - !ruby/object:Gem::Version
90
- version: 0.0.6
90
+ version: 0.0.7
91
91
  type: :runtime
92
92
  prerelease: false
93
93
  version_requirements: !ruby/object:Gem::Requirement
94
94
  requirements:
95
95
  - - ~>
96
96
  - !ruby/object:Gem::Version
97
- version: 0.0.6
98
- description: ActiveRecord adapter for Crate Data, a shared-nothing, fully searchable,
99
- document-oriented cluster data store.
97
+ version: 0.0.7
98
+ description: ActiveRecord adapter for Crate, the distributed database for Docker.
100
99
  email:
101
100
  - office@crate.io
102
101
  executables: []
@@ -132,7 +131,6 @@ files:
132
131
  - spec/models/post_spec.rb
133
132
  - spec/spec_helper.rb
134
133
  - spec/test_server.rb
135
- - spec/travis_test_server.rb
136
134
  homepage: https://crate.io
137
135
  licenses:
138
136
  - Apache License, v2.0
@@ -153,10 +151,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
153
151
  version: '0'
154
152
  requirements: []
155
153
  rubyforge_project:
156
- rubygems_version: 2.0.3
154
+ rubygems_version: 2.4.6
157
155
  signing_key:
158
156
  specification_version: 4
159
- summary: ActiveRecord Crate Data Adapter
157
+ summary: ActiveRecord adapter for Crate
160
158
  test_files:
161
159
  - spec/activerecord/connection_adapters/crate/crate_adapter_spec.rb
162
160
  - spec/activerecord/connection_adapters/crate/table_definition_spec.rb
@@ -168,4 +166,3 @@ test_files:
168
166
  - spec/models/post_spec.rb
169
167
  - spec/spec_helper.rb
170
168
  - spec/test_server.rb
171
- - spec/travis_test_server.rb
@@ -1,75 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # -*- coding: utf-8; -*-
3
- #
4
- # Licensed to CRATE Technology GmbH ("Crate") under one or more contributor
5
- # license agreements. See the NOTICE file distributed with this work for
6
- # additional information regarding copyright ownership. Crate licenses
7
- # this file to you under the Apache License, Version 2.0 (the "License");
8
- # you may not use this file except in compliance with the License. You may
9
- # obtain a copy of the License at
10
- #
11
- # http://www.apache.org/licenses/LICENSE-2.0
12
- #
13
- # Unless required by applicable law or agreed to in writing, software
14
- # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
15
- # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
16
- # License for the specific language governing permissions and limitations
17
- # under the License.
18
- #
19
- # However, if you have executed another commercial license agreement
20
- # with Crate these terms will supersede the license and you may use the
21
- # software solely pursuant to the terms of the relevant commercial agreement.
22
-
23
- require 'net/http'
24
- class TestServer
25
- CRATE_PATH = "~/crate"
26
- TEST_PORT = 4209
27
- NAME = "TestCluster"
28
-
29
-
30
- def initialize(crate_home = nil, port = nil)
31
- @crate_home = crate_home
32
- @port = port
33
- @host = "127.0.0.1"
34
- end
35
-
36
- def start
37
- cmd = "sh #{File.join(@crate_home, 'bin/crate')} #{start_params}"
38
- @pid = spawn(cmd, :out => "/tmp/crate_test_server.out", :err => "/tmp/crate_test_server.err")
39
- Process.detach(@pid)
40
- puts 'starting'
41
- time_slept = 0
42
- while !alive?
43
- puts "Crate not yet fully available. Waiting since #{time_slept} seconds..."
44
- sleep(2)
45
- time_slept += 2
46
- end
47
- end
48
-
49
- private
50
-
51
- def start_params
52
- "-Des.index.storage.type=memory " +
53
- "-Des.node.name=#{NAME} " +
54
- "-Des.cluster.name=Testing#{@port} " +
55
- "-Des.http.port=#{@port}-#{@port} " +
56
- "-Des.network.host=localhost " +
57
- "-Des.discovery.type=zen " +
58
- "-Des.discovery.zen.ping.multicast.enabled=false"
59
- end
60
-
61
- def alive?
62
- req = Net::HTTP::Get.new('/')
63
- resp = Net::HTTP.new(@host, @port)
64
- begin
65
- response = resp.start { |http| http.request(req) }
66
- response.code == "200" ? true : false
67
- rescue Errno::ECONNREFUSED
68
- false
69
- end
70
- end
71
-
72
- end
73
-
74
- server = TestServer.new *ARGV
75
- server.start