cequel 1.9.0 → 1.9.1

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: 769586127721ed091afdca815dd777b0c2f1c45b
4
- data.tar.gz: 32ae7dab6f20e1e545e5d1c9ca82ec6a8f49a619
3
+ metadata.gz: c8ca34779c245ed3e27bb1e4a848d6339e24fb3b
4
+ data.tar.gz: 0a05736a716c5cd814cdf2023bd839638cda5295
5
5
  SHA512:
6
- metadata.gz: b83ace65af35841571cb4420e52c2664680d40f64d04e411ab93aca11b9de7ffc0305d921d4c2e6036c09d4958349090e5ced9ff402ffebf6cf5afc2b4130286
7
- data.tar.gz: fecc7319b72e30ded2ddf98d5760e5da6bb3c289381a682c0f3a7cb1ef7e60f36640acb621d95b1992ae16e53a170e2045dd7180b60550cbdc1d9336d477b0be
6
+ metadata.gz: d57a0397a6b72febadce5c620605d65f55e63b37825564fd55e5fc1131178ee59a65112fcc0ea3957da877116b47afb7db431b27180978c3edf1dc40165c4ed9
7
+ data.tar.gz: ab9cc098f8b0ed157f513ded783d523975703f779296f5b68ce3dd3e62715292f602c5da9e9c6ca60a8adada1432eadfa7eed29ca1b30837eedae18155ccd914
data/CHANGELOG.md CHANGED
@@ -1,9 +1,13 @@
1
+ ## 1.9.1
2
+
3
+ * fix dirty checking for timestamps more precise than Cassandra can store
4
+ * fix bug with new relic instrumentation
5
+
1
6
  ## 1.9.0
2
7
 
3
8
  * NewRelic instrumentation
4
9
  * fix querying tables whose first partition key is a timestamp
5
10
 
6
-
7
11
  ## 1.8.0
8
12
 
9
13
  * remove false claims of Rubinius support from readme (we would gratefully accept a PR to fix compatibility)
data/CONTRIBUTING.md CHANGED
@@ -37,7 +37,7 @@ $ git remote add upstream git@github.com:cequel/cequel.git
37
37
  $ brew tap phinze/cask
38
38
  $ brew install brew-cask
39
39
  $ brew cask install virtualbox vagrant
40
- $ vagrant up 2.0.4
40
+ $ vagrant up 2.2.5
41
41
  $ rake test
42
42
  ```
43
43
 
@@ -50,15 +50,15 @@ install [VirtualBox](https://www.virtualbox.org/) and
50
50
  [Homebrew-cask](https://github.com/phinze/homebrew-cask) if you're on OS X.
51
51
 
52
52
  Cequel's Vagrantfile can generate a virtual machine for any Cassandra version
53
- that Cequel supports (i.e., 1.2.x and 2.0.x). You can run multiple VMs at the
53
+ that Cequel supports (i.e., 2.1.x & 2.2.x). You can run multiple VMs at the
54
54
  same time; the first machine you boot will expose its Cassandra instance on
55
55
  port `9042`, which is the default port that Cequel will look for.
56
56
 
57
57
  Cequel is tested against a large range of Ruby, Rails, and Cassandra versions;
58
58
  for most patches, you can just run the tests using the latest version of all of
59
59
  them. If you're messing with the `Cequel::Schema` or `Cequel::Type` modules,
60
- you'll want to test at least against an early 1.2 release (1.2.4 is good), a
61
- later 1.2 release (1.2.13), and the latest 2.0 release.
60
+ you'll want to test at least against an early 2.1 release, a
61
+ later 2.1 release (2.1.13), and the latest 2.2 release.
62
62
 
63
63
  ## And finally
64
64
 
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- cequel (1.9.0)
4
+ cequel (1.9.1)
5
5
  activemodel (~> 4.0)
6
6
  cassandra-driver (~> 2.0)
7
7
 
@@ -22,7 +22,7 @@ GEM
22
22
  bundler
23
23
  rake
24
24
  thor (>= 0.14.0)
25
- ast (2.0.0)
25
+ ast (2.2.0)
26
26
  backports (3.6.8)
27
27
  builder (3.2.2)
28
28
  byebug (2.7.0)
@@ -66,10 +66,9 @@ GEM
66
66
  multipart-post (2.0.0)
67
67
  net-http-persistent (2.9.4)
68
68
  net-http-pipeline (1.0.1)
69
- parser (2.1.9)
70
- ast (>= 1.1, < 3.0)
71
- slop (~> 3.4, >= 3.4.5)
72
- powerpack (0.0.9)
69
+ parser (2.3.0.7)
70
+ ast (~> 2.2)
71
+ powerpack (0.1.1)
73
72
  pry (0.10.1)
74
73
  coderay (~> 1.1.0)
75
74
  method_source (~> 0.8.1)
@@ -79,7 +78,7 @@ GEM
79
78
  json
80
79
  websocket (~> 1.0)
81
80
  racc (1.4.12)
82
- rainbow (2.0.0)
81
+ rainbow (2.1.0)
83
82
  rake (10.3.2)
84
83
  rb-readline (0.5.1)
85
84
  rspec (3.4.0)
@@ -98,13 +97,13 @@ GEM
98
97
  diff-lcs (>= 1.2.0, < 2.0)
99
98
  rspec-support (~> 3.4.0)
100
99
  rspec-support (3.4.1)
101
- rubocop (0.19.1)
102
- json (>= 1.7.7, < 2)
103
- parser (~> 2.1.7)
104
- powerpack (~> 0.0.6)
100
+ rubocop (0.39.0)
101
+ parser (>= 2.3.0.7, < 3.0)
102
+ powerpack (~> 0.1)
105
103
  rainbow (>= 1.99.1, < 3.0)
106
- ruby-progressbar (~> 1.4)
107
- ruby-progressbar (1.6.0)
104
+ ruby-progressbar (~> 1.7)
105
+ unicode-display_width (~> 1.0, >= 1.0.1)
106
+ ruby-progressbar (1.7.5)
108
107
  rubysl (2.1.0)
109
108
  rubysl-abbrev (~> 2.0)
110
109
  rubysl-base64 (~> 2.0)
@@ -322,6 +321,7 @@ GEM
322
321
  ethon (>= 0.8.0)
323
322
  tzinfo (1.2.2)
324
323
  thread_safe (~> 0.1)
324
+ unicode-display_width (1.0.3)
325
325
  websocket (1.2.2)
326
326
  wwtd (0.9.1)
327
327
  yard (0.8.7.6)
data/README.md CHANGED
@@ -551,11 +551,9 @@ the columns that are given.
551
551
 
552
552
  ### Cassandra ###
553
553
 
554
- * 2.x
554
+ * 2.1.x
555
+ * 2.2.x
555
556
 
556
- Though Cequel is tested against Cassandra 2, it does not at this time support
557
- any of the CQL3.1 features introduced in Cassandra 2. This will change in the
558
- future.
559
557
 
560
558
  ## Support & Bugs ##
561
559
 
@@ -598,6 +596,9 @@ Cequel was written by:
598
596
  * Tamara Temple
599
597
  * Long On
600
598
  * Lucas Mundim
599
+ * Luke Duncalfe
600
+ * Eric Betts
601
+ * Maxim Dobryakov
601
602
 
602
603
  Special thanks to [Brewster](https://www.brewster.com), which supported the 0.x
603
604
  releases of Cequel.
@@ -607,7 +608,7 @@ releases of Cequel.
607
608
  If you're new to Cassandra, check out [Learning Apache
608
609
  Cassandra](http://www.amazon.com/gp/product/1783989203/ref=s9_simh_co_p14_d4_i1?pf_rd_m=ATVPDKIKX0DER&pf_rd_s=left-1&pf_rd_r=1TX356WHGF06W32ZHD8S&pf_rd_t=3201&pf_rd_p=1953562742&pf_rd_i=typ01),
609
610
  a hands-on guide to Cassandra application development by example, written by
610
- the maintainer of Cequel.
611
+ the creator of Cequel.
611
612
 
612
613
  ## License ##
613
614
 
data/Rakefile CHANGED
@@ -1,8 +1,7 @@
1
- require 'rubocop'
2
- require 'rubocop/rake_task'
3
1
  require 'yaml'
4
2
  require 'bundler/setup'
5
3
  require 'rspec/core/rake_task'
4
+ require 'rubocop/rake_task'
6
5
  require 'wwtd/tasks'
7
6
  require 'travis'
8
7
  require File.expand_path('../lib/cequel/version', __FILE__)
@@ -63,12 +62,12 @@ RSpec::Core::RakeTask.new(:test) do |t|
63
62
  t.rspec_opts = rspec_opts
64
63
  end
65
64
 
66
- # desc 'Check style with Rubocop'
67
- # RuboCop::RakeTask.new(:rubocop) do |task|
68
- # task.patterns = ['lib/**/*.rb']
69
- # task.formatters = ['files']
70
- # task.fail_on_error = true
71
- # end
65
+ desc 'Check style with Rubocop'
66
+ RuboCop::RakeTask.new(:rubocop) do |task|
67
+ task.patterns = ['lib/**/*.rb']
68
+ task.formatters = ['files']
69
+ task.fail_on_error = true
70
+ end
72
71
 
73
72
  namespace :test do
74
73
  desc 'Run the specs with progress formatter'
@@ -126,6 +125,8 @@ namespace :cassandra do
126
125
  listing = Net::HTTP.get(URI.parse("http://archive.apache.org/dist/cassandra/"))
127
126
  versions = listing.scan(%r(href="(\d+\.\d+\.\d+)/")).map(&:first)
128
127
  File.open(File.expand_path('../.cassandra-versions', __FILE__), 'w') do |f|
128
+ f.puts "# This file is automatically generated by `rake cassandra:versions:update`"
129
+ f.puts "# do not edit by hand."
129
130
  f.puts(versions.sort_by(&Gem::Version.method(:new)).join("\n"))
130
131
  end
131
132
  end
data/Vagrantfile CHANGED
@@ -135,7 +135,7 @@ exec /opt/apache-cassandra-$1/bin/cassandra" > /etc/init/cassandra.conf
135
135
  SH
136
136
 
137
137
  versions = File.read(File.expand_path('../.cassandra-versions', __FILE__)).each_line
138
- .map(&:strip).grep(/^2\./)
138
+ .map(&:strip).grep(/^2\.[12]\./)
139
139
  versions.each do |version|
140
140
  java_version = version =~ /^1/ ? '6' : '7'
141
141
  config.vm.define version do |machine|
@@ -1,7 +1,7 @@
1
1
  # -*- encoding : utf-8 -*-
2
2
  begin
3
3
  require 'new_relic/agent/datastores'
4
- rescue LoadError => e
4
+ rescue LoadError
5
5
  fail LoadError, "Can't use NewRelic instrumentation without NewRelic gem"
6
6
  end
7
7
 
@@ -13,7 +13,7 @@ module Cequel
13
13
  module NewRelicInstrumentation
14
14
  extend ActiveSupport::Concern
15
15
 
16
- define_method :execute_with_consistency_with_newrelic do |statement, bind_vars, consistency|
16
+ define_method :execute_with_options_with_newrelic do |statement, bind_vars, options|
17
17
  callback = Proc.new do |result, scoped_metric, elapsed|
18
18
  NewRelic::Agent::Datastores.notice_statement(statement, elapsed)
19
19
  end
@@ -33,12 +33,13 @@ module Cequel
33
33
  end
34
34
 
35
35
  NewRelic::Agent::Datastores.wrap("Cassandra", operation, table, callback) do
36
- execute_with_consistency_without_newrelic(statement, bind_vars, consistency)
36
+ execute_with_options_without_newrelic(statement, bind_vars, options)
37
37
  end
38
38
  end
39
39
 
40
+
40
41
  included do
41
- alias_method_chain :execute_with_consistency, :newrelic
42
+ alias_method_chain :execute_with_options, :newrelic
42
43
  end
43
44
  end
44
45
  end
@@ -56,6 +56,10 @@ module Cequel
56
56
  private
57
57
 
58
58
  def write_attribute(name, value)
59
+ column = self.class.reflect_on_column(name)
60
+ fail UnknownAttributeError, "unknown attribute: #{name}" unless column
61
+ value = column.cast(value) unless value.nil?
62
+
59
63
  if loaded? && value != read_attribute(name)
60
64
  __send__("#{name}_will_change!")
61
65
  end
@@ -9,10 +9,28 @@ namespace :cequel do
9
9
  create!
10
10
  end
11
11
 
12
+ desc 'Initialize Cassandra keyspace if not exist'
13
+ task :create_if_not_exist => :environment do
14
+ if Cequel::Record.connection.schema.exists?
15
+ puts "Keyspace #{Cequel::Record.connection.name} already exists. Nothing to do."
16
+ next
17
+ end
18
+ create!
19
+ end
20
+
12
21
  desc 'Drop Cassandra keyspace'
13
22
  task :drop => :environment do
14
23
  drop!
15
24
  end
25
+
26
+ desc 'Drop Cassandra keyspace if exist'
27
+ task :drop_if_exist => :environment do
28
+ unless Cequel::Record.connection.schema.exists?
29
+ puts "Keyspace #{Cequel::Record.connection.name} doesn't exist. Nothing to do."
30
+ next
31
+ end
32
+ drop!
33
+ end
16
34
  end
17
35
 
18
36
  desc "Synchronize all models defined in `app/models' with Cassandra " \
data/lib/cequel/type.rb CHANGED
@@ -379,7 +379,8 @@ module Cequel
379
379
 
380
380
  #
381
381
  # `timestamp` columns store timestamps. Timestamps do not include time zone
382
- # data, and all input times are cast to UTC before being stored.
382
+ # data, and all input times are cast to UTC and rounded to the nearest
383
+ # millisecond before being stored.
383
384
  #
384
385
  # @see http://cassandra.apache.org/doc/cql3/CQL.html#usingdates
385
386
  # CQL3 documentation for date columns
@@ -395,7 +396,7 @@ module Cequel
395
396
  elsif value.respond_to?(:to_time) then value.to_time
396
397
  elsif value.is_a?(Numeric) then Time.at(value)
397
398
  else Time.parse(value.to_s)
398
- end.utc
399
+ end.utc.round(3)
399
400
  end
400
401
  end
401
402
  register Timestamp.instance
@@ -1,5 +1,5 @@
1
1
  # -*- encoding : utf-8 -*-
2
2
  module Cequel
3
3
  # The current version of the library
4
- VERSION = '1.9.0'
4
+ VERSION = '1.9.1'
5
5
  end
@@ -6,14 +6,17 @@ describe Cequel::Record::Dirty do
6
6
  key :permalink, :text
7
7
  column :title, :text
8
8
  set :categories, :text
9
+ column :created_at, :timestamp
9
10
  end
10
11
 
11
12
  context 'loaded model' do
13
+ let(:created_at_float) { 1455754622.8502421 }
12
14
  let(:post) do
13
15
  Post.create!(
14
16
  permalink: 'cequel',
15
17
  title: 'Cequel',
16
- categories: Set['Libraries']
18
+ categories: Set['Libraries'],
19
+ created_at: created_at_float
17
20
  )
18
21
  end
19
22
 
@@ -57,6 +60,11 @@ describe Cequel::Record::Dirty do
57
60
  with_indifferent_access
58
61
  )
59
62
  end
63
+
64
+ it 'should check dirty state against correctly cast timestamp values' do
65
+ post.created_at = created_at_float
66
+ expect(post.changed_attributes).to be_empty
67
+ end
60
68
  end
61
69
 
62
70
  end
@@ -11,6 +11,6 @@ describe Cequel::Record::LazyRecordCollection do
11
11
  let(:now) { Time.now }
12
12
  let(:event) { Event[now] }
13
13
 
14
- it { expect(event.attributes).to include(timestamp: now) }
14
+ it { expect(event.timestamp).to be_within(one_millisecond).of(now) }
15
15
  end
16
16
  end
@@ -17,44 +17,49 @@ describe Cequel::Record::Timestamps do
17
17
  let!(:now) { Timecop.freeze }
18
18
 
19
19
  context 'with simple primary key' do
20
- let(:blog) { Blog.create!(subdomain: 'bigdata') }
20
+ let!(:blog) { Blog.create!(subdomain: 'bigdata') }
21
21
 
22
22
  it 'should populate created_at after create new record' do
23
- expect(blog.created_at).to eq(now)
23
+ expect(blog.created_at).to be_within(one_millisecond).of(now)
24
24
  end
25
25
 
26
26
  it 'should populate updated_at after create new record' do
27
- expect(blog.updated_at).to eq(now)
27
+ expect(blog.updated_at).to be_within(one_millisecond).of(now)
28
28
  end
29
29
 
30
30
  it 'should update updated_at after record update but not created_at' do
31
31
  future = Timecop.freeze(now + 2.minutes)
32
32
  blog.name = 'name'
33
33
  blog.save!
34
- expect(blog.updated_at).to eq(future)
34
+ expect(blog.updated_at).to be_within(one_millisecond).of(future)
35
+ end
36
+
37
+ it 'should cast the timestamp in the same way that Cassandra records it' do
38
+ expect(Blog.first.updated_at).to eq(blog.updated_at)
35
39
  end
36
40
  end
37
41
 
38
42
  context 'with auto-generated timeuuid primary key' do
39
- let(:post) { Post['bigdata'].create! }
43
+ let!(:post) { Post['bigdata'].create! }
40
44
 
41
45
  it 'should not have created_at column' do
42
46
  expect(Post.column_names).not_to include(:created_at)
43
47
  end
44
48
 
45
49
  it 'should expose created_at' do
46
- expect(post.created_at.to_i).to eq(now.to_i)
50
+ expect(post.created_at).to be_within(one_millisecond).of(now)
47
51
  end
48
52
 
49
53
  it 'should populate updated_at after create new record' do
50
- expect(post.updated_at).to eq(now)
54
+ expect(post.updated_at).to be_within(one_millisecond).of(now)
51
55
  end
52
56
 
53
57
  it 'should update updated_at after record update but not created_at' do
54
58
  future = Timecop.freeze(now + 2.minutes)
55
59
  post.name = 'name'
56
60
  post.save!
57
- expect(post.updated_at).to eq(future)
61
+ expect(post.created_at).to be_within(one_millisecond).of(now)
62
+ expect(post.updated_at).to be_within(one_millisecond).of(future)
58
63
  end
59
64
  end
60
65
  end
@@ -147,6 +147,10 @@ module Cequel
147
147
  with(matcher, hash_including(options))
148
148
  end
149
149
 
150
+ def one_millisecond
151
+ 0.001
152
+ end
153
+
150
154
  end
151
155
  end
152
156
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cequel
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.9.0
4
+ version: 1.9.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mat Brown
@@ -29,7 +29,7 @@ authors:
29
29
  autorequire:
30
30
  bindir: bin
31
31
  cert_chain: []
32
- date: 2016-04-02 00:00:00.000000000 Z
32
+ date: 2016-05-15 00:00:00.000000000 Z
33
33
  dependencies:
34
34
  - !ruby/object:Gem::Dependency
35
35
  name: activemodel