cequel 1.2.6 → 1.3.0
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 +4 -4
- data/CHANGELOG.md +6 -0
- data/Gemfile.lock +7 -5
- data/README.md +22 -0
- data/lib/cequel/record.rb +2 -0
- data/lib/cequel/record/schema.rb +4 -1
- data/lib/cequel/record/tasks.rb +1 -1
- data/lib/cequel/record/timestamps.rb +72 -0
- data/lib/cequel/schema/table.rb +6 -0
- data/lib/cequel/version.rb +1 -1
- data/spec/examples/record/timestamps_spec.rb +60 -0
- data/spec/examples/spec_helper.rb +2 -0
- metadata +28 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bcbe817545ecdf0979da9b91e5e790965efdf8c4
|
4
|
+
data.tar.gz: acaede9ff87f4f1c379ab0f47dcba0f110905b45
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 17b5623a4df15734d13f9c8d6bcef023d3b5a814582827260448a989c25832d4f95f8eda338a7bb322a5aeecc5e9ec04b6714b510719ec43d0e4531eaa84cca9
|
7
|
+
data.tar.gz: f75aac91c4ea18db149196aeaf3024a014bf5decc6a258b232c8c4c98fe2f41334d75d04b707d0ac459f990d104c606f68cd8717d2b3ab1954cd92cd098ca7d4
|
data/CHANGELOG.md
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
cequel (1.
|
4
|
+
cequel (1.3.0)
|
5
5
|
activemodel (>= 3.1, < 5.0)
|
6
6
|
cql-rb (~> 1.2)
|
7
7
|
|
@@ -27,7 +27,7 @@ GEM
|
|
27
27
|
debugger-linecache (~> 1.2)
|
28
28
|
coderay (1.1.0)
|
29
29
|
columnize (0.8.9)
|
30
|
-
cql-rb (1.2.
|
30
|
+
cql-rb (1.2.2)
|
31
31
|
debugger (1.6.6)
|
32
32
|
columnize (>= 0.3.1)
|
33
33
|
debugger-linecache (~> 1.2.0)
|
@@ -279,9 +279,10 @@ GEM
|
|
279
279
|
slop (3.5.0)
|
280
280
|
spoon (0.0.4)
|
281
281
|
ffi
|
282
|
-
thread_safe (0.3.
|
283
|
-
thread_safe (0.3.
|
284
|
-
|
282
|
+
thread_safe (0.3.4)
|
283
|
+
thread_safe (0.3.4-java)
|
284
|
+
timecop (0.7.1)
|
285
|
+
tzinfo (1.2.0)
|
285
286
|
thread_safe (~> 0.1)
|
286
287
|
yard (0.8.7.4)
|
287
288
|
|
@@ -301,4 +302,5 @@ DEPENDENCIES
|
|
301
302
|
rspec (~> 2.0)
|
302
303
|
rubocop (~> 0.19.0)
|
303
304
|
rubysl (~> 2.0)
|
305
|
+
timecop (~> 0.7)
|
304
306
|
yard (~> 0.6)
|
data/README.md
CHANGED
@@ -115,6 +115,27 @@ class PostsController < ActionController::Base
|
|
115
115
|
end
|
116
116
|
```
|
117
117
|
|
118
|
+
### Timestamps ###
|
119
|
+
|
120
|
+
If your final primary key column is a `timeuuid` with the `:auto` option set,
|
121
|
+
the `created_at` method will return the time that the UUID key was generated.
|
122
|
+
|
123
|
+
To add timestamp columns, simply use the `timestamps` class macro:
|
124
|
+
|
125
|
+
```ruby
|
126
|
+
class Blog
|
127
|
+
key :subdomain, :text
|
128
|
+
column :name, :text
|
129
|
+
timestamps
|
130
|
+
end
|
131
|
+
```
|
132
|
+
|
133
|
+
This will automatically define `created_at` and `updated_at` columns, and
|
134
|
+
populate them appropriately on save.
|
135
|
+
|
136
|
+
If the creation time can be extracted from the primary key as outlined above,
|
137
|
+
this method will be preferred and no `created_at` column will be defined.
|
138
|
+
|
118
139
|
### Schema synchronization ###
|
119
140
|
|
120
141
|
Cequel will automatically synchronize the schema stored in Cassandra to match
|
@@ -541,6 +562,7 @@ Cequel was written by:
|
|
541
562
|
* Ilya Bazylchuk
|
542
563
|
* Dan Cardamore
|
543
564
|
* Kei Kusakari
|
565
|
+
* Oleh Novosad
|
544
566
|
|
545
567
|
Special thanks to [Brewster](https://www.brewster.com), which supported the 0.x
|
546
568
|
releases of Cequel.
|
data/lib/cequel/record.rb
CHANGED
@@ -23,6 +23,7 @@ require 'cequel/record/callbacks'
|
|
23
23
|
require 'cequel/record/validations'
|
24
24
|
require 'cequel/record/dirty'
|
25
25
|
require 'cequel/record/conversion'
|
26
|
+
require 'cequel/record/timestamps'
|
26
27
|
|
27
28
|
require 'cequel/record'
|
28
29
|
|
@@ -93,6 +94,7 @@ module Cequel
|
|
93
94
|
include Conversion
|
94
95
|
include ActiveModel::Serializers::JSON
|
95
96
|
include ActiveModel::Serializers::Xml
|
97
|
+
include Timestamps
|
96
98
|
end
|
97
99
|
|
98
100
|
#
|
data/lib/cequel/record/schema.rb
CHANGED
@@ -39,6 +39,9 @@ module Cequel
|
|
39
39
|
# @!attribute [r] columns
|
40
40
|
# (see Cequel::Schema::Table#columns)
|
41
41
|
#
|
42
|
+
# @!attribute [r] column_names
|
43
|
+
# (see Cequel::Schema::Table#column_names)
|
44
|
+
#
|
42
45
|
# @!attribute [r] key_columns
|
43
46
|
# (see Cequel::Schema::Table#key_columns)
|
44
47
|
#
|
@@ -57,7 +60,7 @@ module Cequel
|
|
57
60
|
# @!method compact_storage?
|
58
61
|
# (see Cequel::Schema::Table#compact_storage?)
|
59
62
|
#
|
60
|
-
def_delegators :table_schema, :columns, :key_columns,
|
63
|
+
def_delegators :table_schema, :columns, :column_names, :key_columns,
|
61
64
|
:key_column_names, :partition_key_columns,
|
62
65
|
:partition_key_column_names, :clustering_columns,
|
63
66
|
:compact_storage?
|
data/lib/cequel/record/tasks.rb
CHANGED
@@ -38,7 +38,7 @@ namespace :cequel do
|
|
38
38
|
new_constants.each do |class_name|
|
39
39
|
begin
|
40
40
|
clazz = class_name.constantize
|
41
|
-
rescue NameError # rubocop:disable HandleExceptions
|
41
|
+
rescue NameError, RuntimeError # rubocop:disable HandleExceptions
|
42
42
|
else
|
43
43
|
if clazz.ancestors.include?(Cequel::Record) &&
|
44
44
|
!migration_table_names.include?(clazz.table_name.to_sym)
|
@@ -0,0 +1,72 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
module Cequel
|
3
|
+
module Record
|
4
|
+
#
|
5
|
+
# This module provides `created_at` and `updated_at` functionality for
|
6
|
+
# records. It does this in two ways:
|
7
|
+
#
|
8
|
+
# * If a record's primary key is a `timeuuid` with the `:auto` option set,
|
9
|
+
# the `created_at` method will return the time extracted from the primary
|
10
|
+
# key.
|
11
|
+
# * Calling the `timestamps` macro in the class definition will define the
|
12
|
+
# `updated_at` and (if necessary) `created_at` columns, and set up
|
13
|
+
# lifecycle hooks to populate them appropriately.
|
14
|
+
#
|
15
|
+
# @example Record class with timestamps
|
16
|
+
# class Blog
|
17
|
+
# key :subdomain, :text
|
18
|
+
# column :name, :text
|
19
|
+
#
|
20
|
+
# timestamps
|
21
|
+
# end
|
22
|
+
#
|
23
|
+
# @since 1.3.0
|
24
|
+
#
|
25
|
+
module Timestamps
|
26
|
+
extend ActiveSupport::Concern
|
27
|
+
|
28
|
+
#
|
29
|
+
# Provides class methods for the Timestamps module
|
30
|
+
#
|
31
|
+
module ClassMethods
|
32
|
+
protected
|
33
|
+
|
34
|
+
def key(name, type, options = {})
|
35
|
+
super
|
36
|
+
if type == :timeuuid && options[:auto]
|
37
|
+
module_eval(<<-RUBY, __FILE__, __LINE__+1)
|
38
|
+
def created_at
|
39
|
+
read_attribute(#{name.inspect}).try(:to_time)
|
40
|
+
end
|
41
|
+
RUBY
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def timestamps
|
46
|
+
column :updated_at, :timestamp
|
47
|
+
|
48
|
+
if method_defined?(:created_at)
|
49
|
+
before_save :set_updated_at
|
50
|
+
else
|
51
|
+
column :created_at, :timestamp
|
52
|
+
|
53
|
+
before_create :set_created_and_updated_at
|
54
|
+
before_update :set_updated_at
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
private
|
60
|
+
|
61
|
+
def set_created_and_updated_at
|
62
|
+
now = Time.now
|
63
|
+
self.created_at = now
|
64
|
+
self.updated_at = now
|
65
|
+
end
|
66
|
+
|
67
|
+
def set_updated_at
|
68
|
+
self.updated_at = Time.now
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
data/lib/cequel/schema/table.rb
CHANGED
@@ -184,6 +184,12 @@ module Cequel
|
|
184
184
|
columns_by_name[name.to_sym]
|
185
185
|
end
|
186
186
|
|
187
|
+
#
|
188
|
+
# @return [Array<Symbol>] the names of all columns
|
189
|
+
def column_names
|
190
|
+
columns.map { |column| column.name }
|
191
|
+
end
|
192
|
+
|
187
193
|
#
|
188
194
|
# @return [Array<Column>] all key columns (partition + clustering)
|
189
195
|
#
|
data/lib/cequel/version.rb
CHANGED
@@ -0,0 +1,60 @@
|
|
1
|
+
require File.expand_path('../spec_helper', __FILE__)
|
2
|
+
|
3
|
+
describe Cequel::Record::Timestamps do
|
4
|
+
model :Blog do
|
5
|
+
key :subdomain, :text
|
6
|
+
column :name, :text
|
7
|
+
timestamps
|
8
|
+
end
|
9
|
+
|
10
|
+
model :Post do
|
11
|
+
key :blog_subdomain, :text
|
12
|
+
key :id, :timeuuid, auto: true
|
13
|
+
column :name, :text
|
14
|
+
timestamps
|
15
|
+
end
|
16
|
+
|
17
|
+
let!(:now) { Timecop.freeze }
|
18
|
+
|
19
|
+
context 'with simple primary key' do
|
20
|
+
let(:blog) { Blog.create!(subdomain: 'bigdata') }
|
21
|
+
|
22
|
+
it 'should populate created_at after create new record' do
|
23
|
+
expect(blog.created_at).to eq(now)
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'should populate updated_at after create new record' do
|
27
|
+
expect(blog.updated_at).to eq(now)
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'should update updated_at after record update but not created_at' do
|
31
|
+
future = Timecop.freeze(now + 2.minutes)
|
32
|
+
blog.name = 'name'
|
33
|
+
blog.save!
|
34
|
+
expect(blog.updated_at).to eq(future)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
context 'with auto-generated timeuuid primary key' do
|
39
|
+
let(:post) { Post['bigdata'].create! }
|
40
|
+
|
41
|
+
it 'should not have created_at column' do
|
42
|
+
expect(Post.column_names).not_to include(:created_at)
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'should expose created_at' do
|
46
|
+
expect(post.created_at.to_i).to eq(now.to_i)
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'should populate updated_at after create new record' do
|
50
|
+
expect(post.updated_at).to eq(now)
|
51
|
+
end
|
52
|
+
|
53
|
+
it 'should update updated_at after record update but not created_at' do
|
54
|
+
future = Timecop.freeze(now + 2.minutes)
|
55
|
+
post.name = 'name'
|
56
|
+
post.save!
|
57
|
+
expect(post.updated_at).to eq(future)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
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.
|
4
|
+
version: 1.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mat Brown
|
@@ -15,6 +15,7 @@ authors:
|
|
15
15
|
- Ilya Bazylchuk
|
16
16
|
- Dan Cardamore
|
17
17
|
- Kei Kusakari
|
18
|
+
- Oleh Novosad
|
18
19
|
autorequire:
|
19
20
|
bindir: bin
|
20
21
|
cert_chain: []
|
@@ -68,6 +69,20 @@ dependencies:
|
|
68
69
|
- - "~>"
|
69
70
|
- !ruby/object:Gem::Version
|
70
71
|
version: '0.5'
|
72
|
+
- !ruby/object:Gem::Dependency
|
73
|
+
name: rake
|
74
|
+
requirement: !ruby/object:Gem::Requirement
|
75
|
+
requirements:
|
76
|
+
- - "~>"
|
77
|
+
- !ruby/object:Gem::Version
|
78
|
+
version: '10.1'
|
79
|
+
type: :development
|
80
|
+
prerelease: false
|
81
|
+
version_requirements: !ruby/object:Gem::Requirement
|
82
|
+
requirements:
|
83
|
+
- - "~>"
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: '10.1'
|
71
86
|
- !ruby/object:Gem::Dependency
|
72
87
|
name: rspec
|
73
88
|
requirement: !ruby/object:Gem::Requirement
|
@@ -83,47 +98,47 @@ dependencies:
|
|
83
98
|
- !ruby/object:Gem::Version
|
84
99
|
version: '2.0'
|
85
100
|
- !ruby/object:Gem::Dependency
|
86
|
-
name:
|
101
|
+
name: rubocop
|
87
102
|
requirement: !ruby/object:Gem::Requirement
|
88
103
|
requirements:
|
89
104
|
- - "~>"
|
90
105
|
- !ruby/object:Gem::Version
|
91
|
-
version:
|
106
|
+
version: 0.19.0
|
92
107
|
type: :development
|
93
108
|
prerelease: false
|
94
109
|
version_requirements: !ruby/object:Gem::Requirement
|
95
110
|
requirements:
|
96
111
|
- - "~>"
|
97
112
|
- !ruby/object:Gem::Version
|
98
|
-
version:
|
113
|
+
version: 0.19.0
|
99
114
|
- !ruby/object:Gem::Dependency
|
100
|
-
name:
|
115
|
+
name: timecop
|
101
116
|
requirement: !ruby/object:Gem::Requirement
|
102
117
|
requirements:
|
103
118
|
- - "~>"
|
104
119
|
- !ruby/object:Gem::Version
|
105
|
-
version: '
|
120
|
+
version: '0.7'
|
106
121
|
type: :development
|
107
122
|
prerelease: false
|
108
123
|
version_requirements: !ruby/object:Gem::Requirement
|
109
124
|
requirements:
|
110
125
|
- - "~>"
|
111
126
|
- !ruby/object:Gem::Version
|
112
|
-
version: '
|
127
|
+
version: '0.7'
|
113
128
|
- !ruby/object:Gem::Dependency
|
114
|
-
name:
|
129
|
+
name: yard
|
115
130
|
requirement: !ruby/object:Gem::Requirement
|
116
131
|
requirements:
|
117
132
|
- - "~>"
|
118
133
|
- !ruby/object:Gem::Version
|
119
|
-
version: 0.
|
134
|
+
version: '0.6'
|
120
135
|
type: :development
|
121
136
|
prerelease: false
|
122
137
|
version_requirements: !ruby/object:Gem::Requirement
|
123
138
|
requirements:
|
124
139
|
- - "~>"
|
125
140
|
- !ruby/object:Gem::Version
|
126
|
-
version: 0.
|
141
|
+
version: '0.6'
|
127
142
|
description: |
|
128
143
|
Cequel is an ActiveRecord-like domain model layer for Cassandra that exposes
|
129
144
|
the robust data modeling capabilities of CQL3, including parent-child
|
@@ -188,6 +203,7 @@ files:
|
|
188
203
|
- lib/cequel/record/schema.rb
|
189
204
|
- lib/cequel/record/scoped.rb
|
190
205
|
- lib/cequel/record/tasks.rb
|
206
|
+
- lib/cequel/record/timestamps.rb
|
191
207
|
- lib/cequel/record/validations.rb
|
192
208
|
- lib/cequel/schema.rb
|
193
209
|
- lib/cequel/schema/column.rb
|
@@ -224,6 +240,7 @@ files:
|
|
224
240
|
- spec/examples/record/serialization_spec.rb
|
225
241
|
- spec/examples/record/set_spec.rb
|
226
242
|
- spec/examples/record/spec_helper.rb
|
243
|
+
- spec/examples/record/timestamps_spec.rb
|
227
244
|
- spec/examples/record/validations_spec.rb
|
228
245
|
- spec/examples/schema/table_reader_spec.rb
|
229
246
|
- spec/examples/schema/table_synchronizer_spec.rb
|
@@ -281,6 +298,7 @@ test_files:
|
|
281
298
|
- spec/examples/record/serialization_spec.rb
|
282
299
|
- spec/examples/record/set_spec.rb
|
283
300
|
- spec/examples/record/spec_helper.rb
|
301
|
+
- spec/examples/record/timestamps_spec.rb
|
284
302
|
- spec/examples/record/validations_spec.rb
|
285
303
|
- spec/examples/schema/table_reader_spec.rb
|
286
304
|
- spec/examples/schema/table_synchronizer_spec.rb
|