gotime-cassandra_object 2.10.11 → 2.11.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.
- data/Gemfile +0 -1
- data/gotime-cassandra_object.gemspec +2 -1
- data/lib/cassandra_object/schema/migration.rb +76 -76
- data/lib/cassandra_object/schema/migrator.rb +99 -102
- data/lib/cassandra_object/tasks/column_family.rb +13 -36
- data/lib/cassandra_object/tasks/keyspace.rb +0 -6
- data/test/unit/tasks/column_family_test.rb +29 -0
- metadata +21 -9
data/Gemfile
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = 'gotime-cassandra_object'
|
5
|
-
s.version = '2.
|
5
|
+
s.version = '2.11.0'
|
6
6
|
s.description = 'Cassandra ActiveModel'
|
7
7
|
s.summary = 'Cassandra ActiveModel'
|
8
8
|
|
@@ -20,6 +20,7 @@ Gem::Specification.new do |s|
|
|
20
20
|
|
21
21
|
s.add_runtime_dependency('activemodel', ">= 3.0")
|
22
22
|
s.add_runtime_dependency('cassandra', ">= 0.12.0")
|
23
|
+
s.add_runtime_dependency('thrift_client', "~> 0.7.0")
|
23
24
|
|
24
25
|
s.add_development_dependency('bundler')
|
25
26
|
end
|
@@ -1,104 +1,104 @@
|
|
1
1
|
module CassandraObject
|
2
2
|
module Schema
|
3
|
-
|
4
3
|
class Migration
|
5
4
|
|
6
5
|
@@verbose = true
|
7
6
|
cattr_accessor :verbose
|
8
7
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
8
|
+
class << self
|
9
|
+
def connection
|
10
|
+
CassandraObject::Base.connection
|
11
|
+
end
|
13
12
|
|
14
|
-
|
15
|
-
|
13
|
+
def migrate(direction)
|
14
|
+
return unless respond_to?(direction)
|
16
15
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
16
|
+
case direction
|
17
|
+
when :up then announce "migrating"
|
18
|
+
when :down then announce "reverting"
|
19
|
+
end
|
20
|
+
|
21
|
+
result = nil
|
22
|
+
time = Benchmark.measure { result = send("#{direction}") }
|
21
23
|
|
22
|
-
|
23
|
-
|
24
|
+
case direction
|
25
|
+
when :up then announce "migrated (%.4fs)" % time.real; write
|
26
|
+
when :down then announce "reverted (%.4fs)" % time.real; write
|
27
|
+
end
|
24
28
|
|
25
|
-
|
26
|
-
when :up then announce "migrated (%.4fs)" % time.real; write
|
27
|
-
when :down then announce "reverted (%.4fs)" % time.real; write
|
29
|
+
result
|
28
30
|
end
|
29
31
|
|
30
|
-
|
31
|
-
|
32
|
+
# Creates a new column family with the given name. Column family configurations can be set within
|
33
|
+
# a block like this:
|
34
|
+
#
|
35
|
+
# create_column_family(:users) do |cf|
|
36
|
+
# cf.comment = 'Users column family'
|
37
|
+
# cf.comparator_type = 'TimeUUIDType'
|
38
|
+
# end
|
39
|
+
#
|
40
|
+
# A complete list of available configuration settings is here:
|
41
|
+
#
|
42
|
+
# http://github.com/fauna/cassandra/blob/master/vendor/0.7/gen-rb/cassandra_types.rb
|
43
|
+
#
|
44
|
+
# Scroll down to the CfDef definition.
|
45
|
+
def create_column_family(name, &block)
|
46
|
+
say_with_time("create_column_family #{name}") do
|
47
|
+
column_family_tasks.create(name, &block)
|
48
|
+
end
|
49
|
+
end
|
32
50
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
# cf.comparator_type = 'TimeUUIDType'
|
39
|
-
# end
|
40
|
-
#
|
41
|
-
# A complete list of available configuration settings is here:
|
42
|
-
#
|
43
|
-
# http://github.com/fauna/cassandra/blob/master/vendor/0.7/gen-rb/cassandra_types.rb
|
44
|
-
#
|
45
|
-
# Scroll down to the CfDef definition.
|
46
|
-
def self.create_column_family(name, &block)
|
47
|
-
say_with_time("create_column_family #{name}") do
|
48
|
-
column_family_tasks.create(name, &block)
|
51
|
+
# Drops the given column family
|
52
|
+
def drop_column_family(name)
|
53
|
+
say_with_time("drop_column_family #{name}") do
|
54
|
+
column_family_tasks.drop(name)
|
55
|
+
end
|
49
56
|
end
|
50
|
-
end
|
51
57
|
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
58
|
+
# Renames the column family from the old name to the new name
|
59
|
+
def rename_column_family(old_name, new_name)
|
60
|
+
say_with_time("rename_column_family #{name}") do
|
61
|
+
column_family_tasks.rename(old_name, new_name)
|
62
|
+
end
|
56
63
|
end
|
57
|
-
end
|
58
64
|
|
59
|
-
|
60
|
-
|
61
|
-
say_with_time("rename_column_family #{name}") do
|
62
|
-
column_family_tasks.rename(old_name, new_name)
|
65
|
+
def write(text="")
|
66
|
+
puts(text) if verbose
|
63
67
|
end
|
64
|
-
end
|
65
68
|
|
66
|
-
|
67
|
-
|
68
|
-
end
|
69
|
+
def announce(message)
|
70
|
+
version = defined?(@version) ? @version : nil
|
69
71
|
|
70
|
-
|
71
|
-
|
72
|
+
text = "#{version} #{name}: #{message}"
|
73
|
+
length = [0, 75 - text.length].max
|
74
|
+
write "== %s %s" % [text, "=" * length]
|
75
|
+
end
|
72
76
|
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
end
|
77
|
+
def say(message, subitem=false)
|
78
|
+
write "#{subitem ? " ->" : "--"} #{message}"
|
79
|
+
end
|
77
80
|
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
+
def say_with_time(message)
|
82
|
+
say(message)
|
83
|
+
result = nil
|
84
|
+
time = Benchmark.measure { result = yield }
|
85
|
+
say "%.4fs" % time.real, :subitem
|
86
|
+
say("#{result} rows", :subitem) if result.is_a?(Integer)
|
87
|
+
result
|
88
|
+
end
|
81
89
|
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
result
|
89
|
-
end
|
90
|
+
def suppress_messages
|
91
|
+
save, self.verbose = verbose, false
|
92
|
+
yield
|
93
|
+
ensure
|
94
|
+
self.verbose = save
|
95
|
+
end
|
90
96
|
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
self.verbose = save
|
97
|
+
private
|
98
|
+
def column_family_tasks
|
99
|
+
Tasks::ColumnFamily.new(CassandraObject::Base.connection.keyspace)
|
100
|
+
end
|
96
101
|
end
|
97
|
-
|
98
|
-
private
|
99
|
-
def self.column_family_tasks
|
100
|
-
Tasks::ColumnFamily.new(CassandraObject::Base.connection.keyspace)
|
101
|
-
end
|
102
102
|
end
|
103
103
|
end
|
104
|
-
end
|
104
|
+
end
|
@@ -1,82 +1,80 @@
|
|
1
1
|
module CassandraObject
|
2
2
|
module Schema
|
3
|
-
|
4
3
|
class Migrator
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
4
|
+
class << self
|
5
|
+
def migrate(migrations_path, target_version = nil)
|
6
|
+
case
|
7
|
+
when target_version.nil?
|
8
|
+
up(migrations_path, target_version)
|
9
|
+
when current_version == 0 && target_version == 0
|
10
|
+
when current_version > target_version
|
11
|
+
down(migrations_path, target_version)
|
12
|
+
else
|
13
|
+
up(migrations_path, target_version)
|
14
|
+
end
|
15
15
|
end
|
16
|
-
end
|
17
16
|
|
18
|
-
|
19
|
-
|
20
|
-
|
17
|
+
def rollback(migrations_path, steps = 1)
|
18
|
+
move(:down, migrations_path, steps)
|
19
|
+
end
|
21
20
|
|
22
|
-
|
23
|
-
|
24
|
-
|
21
|
+
def forward(migrations_path, steps = 1)
|
22
|
+
move(:up, migrations_path, steps)
|
23
|
+
end
|
25
24
|
|
26
|
-
|
27
|
-
|
28
|
-
|
25
|
+
def up(migrations_path, target_version = nil)
|
26
|
+
new(:up, migrations_path, target_version).migrate
|
27
|
+
end
|
29
28
|
|
30
|
-
|
31
|
-
|
32
|
-
|
29
|
+
def down(migrations_path, target_version = nil)
|
30
|
+
new(:down, migrations_path, target_version).migrate
|
31
|
+
end
|
33
32
|
|
34
|
-
|
35
|
-
|
36
|
-
|
33
|
+
def run(direction, migrations_path, target_version)
|
34
|
+
new(direction, migrations_path, target_version).run
|
35
|
+
end
|
37
36
|
|
38
|
-
|
39
|
-
|
40
|
-
|
37
|
+
def migrations_path
|
38
|
+
'ks/migrate'
|
39
|
+
end
|
41
40
|
|
42
|
-
|
43
|
-
|
44
|
-
|
41
|
+
def schema_migrations_column_family
|
42
|
+
:schema_migrations
|
43
|
+
end
|
45
44
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
45
|
+
def column_family_tasks
|
46
|
+
cas = CassandraObject::Base.connection
|
47
|
+
Tasks::ColumnFamily.new(cas.keyspace)
|
48
|
+
end
|
50
49
|
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
50
|
+
def get_all_versions
|
51
|
+
cas = CassandraObject::Base.connection
|
52
|
+
cas.get(schema_migrations_column_family, 'all').map {|(name, _value)| name.to_i}.sort
|
53
|
+
end
|
55
54
|
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
55
|
+
def current_version
|
56
|
+
sm_cf = schema_migrations_column_family
|
57
|
+
if column_family_tasks.exists?(sm_cf)
|
58
|
+
get_all_versions.max || 0
|
59
|
+
else
|
60
|
+
0
|
61
|
+
end
|
62
62
|
end
|
63
|
-
end
|
64
63
|
|
65
|
-
|
64
|
+
private
|
66
65
|
|
67
|
-
|
68
|
-
|
69
|
-
|
66
|
+
def move(direction, migrations_path, steps)
|
67
|
+
migrator = self.new(direction, migrations_path)
|
68
|
+
start_index = migrator.migrations.index(migrator.current_migration)
|
70
69
|
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
70
|
+
if start_index
|
71
|
+
finish = migrator.migrations[start_index + steps]
|
72
|
+
version = finish ? finish.version : 0
|
73
|
+
send(direction, migrations_path, version)
|
74
|
+
end
|
75
|
+
end
|
76
76
|
end
|
77
77
|
|
78
|
-
public
|
79
|
-
|
80
78
|
def initialize(direction, migrations_path, target_version = nil)
|
81
79
|
sm_cf = self.class.schema_migrations_column_family
|
82
80
|
|
@@ -140,32 +138,32 @@ module CassandraObject
|
|
140
138
|
|
141
139
|
def migrations
|
142
140
|
@migrations ||= begin
|
143
|
-
|
141
|
+
files = Dir["#{@migrations_path}/[0-9]*_*.rb"]
|
144
142
|
|
145
|
-
|
146
|
-
|
143
|
+
migrations = files.inject([]) do |klasses, file|
|
144
|
+
version, name = file.scan(/([0-9]+)_([_a-z0-9]*).rb/).first
|
147
145
|
|
148
|
-
|
149
|
-
|
146
|
+
raise IllegalMigrationNameError.new(file) unless version
|
147
|
+
version = version.to_i
|
150
148
|
|
151
|
-
|
152
|
-
|
153
|
-
|
149
|
+
if klasses.detect { |m| m.version == version }
|
150
|
+
raise DuplicateMigrationVersionError.new(version)
|
151
|
+
end
|
154
152
|
|
155
|
-
|
156
|
-
|
157
|
-
|
153
|
+
if klasses.detect { |m| m.name == name.camelize }
|
154
|
+
raise DuplicateMigrationNameError.new(name.camelize)
|
155
|
+
end
|
158
156
|
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
157
|
+
migration = MigrationProxy.new
|
158
|
+
migration.name = name.camelize
|
159
|
+
migration.version = version
|
160
|
+
migration.filename = file
|
161
|
+
klasses << migration
|
162
|
+
end
|
165
163
|
|
166
|
-
|
167
|
-
|
168
|
-
|
164
|
+
migrations = migrations.sort_by { |m| m.version }
|
165
|
+
down? ? migrations.reverse : migrations
|
166
|
+
end
|
169
167
|
end
|
170
168
|
|
171
169
|
def pending_migrations
|
@@ -179,35 +177,34 @@ module CassandraObject
|
|
179
177
|
|
180
178
|
private
|
181
179
|
|
182
|
-
|
183
|
-
|
184
|
-
|
180
|
+
def column_family_tasks
|
181
|
+
Tasks::ColumnFamily.new(connection.keyspace)
|
182
|
+
end
|
185
183
|
|
186
|
-
|
187
|
-
|
188
|
-
|
184
|
+
def connection
|
185
|
+
CassandraObject::Base.connection
|
186
|
+
end
|
189
187
|
|
190
|
-
|
191
|
-
|
188
|
+
def record_version_state_after_migrating(migration)
|
189
|
+
sm_cf = self.class.schema_migrations_column_family
|
192
190
|
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
191
|
+
@migrated_versions ||= []
|
192
|
+
if down?
|
193
|
+
@migrated_versions.delete(migration.version)
|
194
|
+
connection.remove sm_cf, 'all', migration.version
|
195
|
+
else
|
196
|
+
@migrated_versions.push(migration.version).sort!
|
197
|
+
connection.insert sm_cf, 'all', { migration.version => migration.name }
|
198
|
+
end
|
200
199
|
end
|
201
|
-
end
|
202
200
|
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
def down?
|
208
|
-
@direction == :down
|
209
|
-
end
|
201
|
+
def up?
|
202
|
+
@direction == :up
|
203
|
+
end
|
210
204
|
|
205
|
+
def down?
|
206
|
+
@direction == :down
|
207
|
+
end
|
211
208
|
end
|
212
209
|
end
|
213
210
|
end
|
@@ -1,15 +1,10 @@
|
|
1
1
|
module CassandraObject
|
2
2
|
module Tasks
|
3
3
|
class ColumnFamily
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
:string => 'BytesType',
|
9
|
-
:utf8 => 'UTF8Type' }
|
10
|
-
|
11
|
-
COLUMN_TYPES = { :standard => 'Standard',
|
12
|
-
:super => 'Super' }
|
4
|
+
COLUMN_TYPES = {
|
5
|
+
standard: 'Standard',
|
6
|
+
super: 'Super'
|
7
|
+
}
|
13
8
|
|
14
9
|
def initialize(keyspace)
|
15
10
|
@keyspace = keyspace
|
@@ -23,7 +18,7 @@ module CassandraObject
|
|
23
18
|
cf = Cassandra::ColumnFamily.new
|
24
19
|
cf.name = name.to_s
|
25
20
|
cf.keyspace = @keyspace.to_s
|
26
|
-
cf.comparator_type = '
|
21
|
+
cf.comparator_type = 'UTF8Type'
|
27
22
|
cf.column_type = 'Standard'
|
28
23
|
|
29
24
|
yield(cf) if block_given?
|
@@ -40,39 +35,21 @@ module CassandraObject
|
|
40
35
|
connection.rename_column_family(old_name.to_s, new_name.to_s)
|
41
36
|
end
|
42
37
|
|
43
|
-
def clear(name)
|
44
|
-
connection.truncate!(name.to_s)
|
45
|
-
end
|
46
|
-
|
47
38
|
private
|
48
|
-
|
49
|
-
|
50
|
-
CassandraObject::Base.connection
|
51
|
-
end
|
52
|
-
|
53
|
-
def post_process_column_family(cf)
|
54
|
-
comp_type = cf.comparator_type
|
55
|
-
if comp_type && COMPARATOR_TYPES.has_key?(comp_type)
|
56
|
-
cf.comparator_type = COMPARATOR_TYPES[comp_type]
|
39
|
+
def connection
|
40
|
+
CassandraObject::Base.connection
|
57
41
|
end
|
58
42
|
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
43
|
+
def post_process_column_family(cf)
|
44
|
+
col_type = cf.column_type
|
45
|
+
if col_type && COLUMN_TYPES.has_key?(col_type)
|
46
|
+
cf.column_type = COLUMN_TYPES[col_type]
|
47
|
+
end
|
63
48
|
|
64
|
-
|
65
|
-
if col_type && COLUMN_TYPES.has_key?(col_type)
|
66
|
-
cf.column_type = COLUMN_TYPES[col_type]
|
49
|
+
cf
|
67
50
|
end
|
68
|
-
|
69
|
-
cf
|
70
|
-
end
|
71
|
-
|
72
51
|
end
|
73
|
-
|
74
52
|
end
|
75
|
-
|
76
53
|
end
|
77
54
|
|
78
55
|
class Cassandra
|
@@ -1,9 +1,6 @@
|
|
1
1
|
module CassandraObject
|
2
|
-
|
3
2
|
module Tasks
|
4
|
-
|
5
3
|
class Keyspace
|
6
|
-
|
7
4
|
def self.parse(hash)
|
8
5
|
ks = Cassandra::Keyspace.new.with_fields hash
|
9
6
|
ks.cf_defs = []
|
@@ -69,11 +66,8 @@ module CassandraObject
|
|
69
66
|
end
|
70
67
|
@connection
|
71
68
|
end
|
72
|
-
|
73
69
|
end
|
74
|
-
|
75
70
|
end
|
76
|
-
|
77
71
|
end
|
78
72
|
|
79
73
|
class Cassandra
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class CassandraObject::Tasks::ColumnFamilyTest < CassandraObject::TestCase
|
4
|
+
setup do
|
5
|
+
column_family_task.drop('Gadgets') if column_family_task.exists?('Gadgets')
|
6
|
+
column_family_task.drop('Widgets') if column_family_task.exists?('Widgets')
|
7
|
+
end
|
8
|
+
|
9
|
+
test 'create' do
|
10
|
+
assert !column_family_task.exists?('Widgets')
|
11
|
+
column_family_task.create 'Widgets'
|
12
|
+
assert column_family_task.exists?('Widgets')
|
13
|
+
end
|
14
|
+
|
15
|
+
# test 'rename' do
|
16
|
+
# column_family_task.create 'Widgets'
|
17
|
+
# column_family_task.rename 'Widgets', 'Gadgets'
|
18
|
+
#
|
19
|
+
# sleep 2
|
20
|
+
#
|
21
|
+
# assert !column_family_task.exists?('Widgets')
|
22
|
+
# assert column_family_task.exists?('Gadgets')
|
23
|
+
# end
|
24
|
+
|
25
|
+
private
|
26
|
+
def column_family_task
|
27
|
+
@column_family_task ||= CassandraObject::Tasks::ColumnFamily.new(CassandraObject::Base.connection.keyspace)
|
28
|
+
end
|
29
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gotime-cassandra_object
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.11.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -10,11 +10,11 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2012-
|
13
|
+
date: 2012-03-22 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: activemodel
|
17
|
-
requirement: &
|
17
|
+
requirement: &70366970329520 !ruby/object:Gem::Requirement
|
18
18
|
none: false
|
19
19
|
requirements:
|
20
20
|
- - ! '>='
|
@@ -22,10 +22,10 @@ dependencies:
|
|
22
22
|
version: '3.0'
|
23
23
|
type: :runtime
|
24
24
|
prerelease: false
|
25
|
-
version_requirements: *
|
25
|
+
version_requirements: *70366970329520
|
26
26
|
- !ruby/object:Gem::Dependency
|
27
27
|
name: cassandra
|
28
|
-
requirement: &
|
28
|
+
requirement: &70366970329000 !ruby/object:Gem::Requirement
|
29
29
|
none: false
|
30
30
|
requirements:
|
31
31
|
- - ! '>='
|
@@ -33,10 +33,21 @@ dependencies:
|
|
33
33
|
version: 0.12.0
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
|
-
version_requirements: *
|
36
|
+
version_requirements: *70366970329000
|
37
|
+
- !ruby/object:Gem::Dependency
|
38
|
+
name: thrift_client
|
39
|
+
requirement: &70366970326120 !ruby/object:Gem::Requirement
|
40
|
+
none: false
|
41
|
+
requirements:
|
42
|
+
- - ~>
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
version: 0.7.0
|
45
|
+
type: :runtime
|
46
|
+
prerelease: false
|
47
|
+
version_requirements: *70366970326120
|
37
48
|
- !ruby/object:Gem::Dependency
|
38
49
|
name: bundler
|
39
|
-
requirement: &
|
50
|
+
requirement: &70366970325440 !ruby/object:Gem::Requirement
|
40
51
|
none: false
|
41
52
|
requirements:
|
42
53
|
- - ! '>='
|
@@ -44,7 +55,7 @@ dependencies:
|
|
44
55
|
version: '0'
|
45
56
|
type: :development
|
46
57
|
prerelease: false
|
47
|
-
version_requirements: *
|
58
|
+
version_requirements: *70366970325440
|
48
59
|
description: Cassandra ActiveModel
|
49
60
|
email: gems@gotime.com
|
50
61
|
executables: []
|
@@ -131,6 +142,7 @@ files:
|
|
131
142
|
- test/unit/identity_test.rb
|
132
143
|
- test/unit/inspect_test.rb
|
133
144
|
- test/unit/persistence_test.rb
|
145
|
+
- test/unit/tasks/column_family_test.rb
|
134
146
|
- test/unit/timestamps_test.rb
|
135
147
|
- test/unit/types/array_type_test.rb
|
136
148
|
- test/unit/types/base_type_test.rb
|
@@ -162,7 +174,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
162
174
|
version: 1.3.5
|
163
175
|
requirements: []
|
164
176
|
rubyforge_project:
|
165
|
-
rubygems_version: 1.8.
|
177
|
+
rubygems_version: 1.8.15
|
166
178
|
signing_key:
|
167
179
|
specification_version: 3
|
168
180
|
summary: Cassandra ActiveModel
|