activerecord-crate-adapter 0.0.3 → 0.0.4

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 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