gotime-cassandra_object 2.5.0 → 2.6.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +1 -0
- data/gotime-cassandra_object.gemspec +1 -1
- data/lib/cassandra_object/attributes.rb +34 -23
- data/lib/cassandra_object/finder_methods.rb +4 -4
- data/lib/cassandra_object/persistence.rb +3 -3
- data/lib/cassandra_object/type.rb +1 -1
- data/lib/cassandra_object/types.rb +0 -1
- data/lib/cassandra_object/types/array_type.rb +34 -3
- data/lib/cassandra_object/types/base_type.rb +26 -0
- data/lib/cassandra_object/types/boolean_type.rb +1 -1
- data/lib/cassandra_object/types/date_type.rb +7 -7
- data/lib/cassandra_object/types/float_type.rb +1 -1
- data/lib/cassandra_object/types/hash_type.rb +1 -1
- data/lib/cassandra_object/types/integer_type.rb +1 -1
- data/lib/cassandra_object/types/string_type.rb +1 -1
- data/lib/cassandra_object/types/time_type.rb +1 -1
- data/lib/cassandra_object/types/time_with_zone_type.rb +1 -1
- data/lib/gotime-cassandra_object.rb +1 -1
- data/test/attributes_test.rb +25 -1
- data/test/dirty_test.rb +18 -0
- data/test/finder_methods_test.rb +1 -1
- data/test/types/array_type_test.rb +22 -1
- data/test/types/base_type_test.rb +22 -0
- data/test/types/date_type_test.rb +9 -2
- data/test/types/float_type_test.rb +1 -0
- metadata +13 -11
- data/lib/cassandra_object/types/set_type.rb +0 -20
- data/test/types/set_type_test.rb +0 -17
data/README.rdoc
CHANGED
@@ -1,15 +1,17 @@
|
|
1
1
|
module CassandraObject
|
2
2
|
class Attribute
|
3
3
|
attr_reader :name, :coder, :expected_type
|
4
|
-
def initialize(name,
|
4
|
+
def initialize(name, type_mapping, options)
|
5
5
|
@name = name.to_s
|
6
|
-
@coder = coder
|
7
|
-
@expected_type = expected_type
|
6
|
+
@coder = type_mapping.coder.new(options)
|
7
|
+
@expected_type = type_mapping.expected_type
|
8
8
|
end
|
9
9
|
|
10
|
-
def
|
11
|
-
return
|
12
|
-
|
10
|
+
def instantiate(record, value)
|
11
|
+
return if value.nil? && coder.ignore_nil?
|
12
|
+
|
13
|
+
value = value.kind_of?(expected_type) ? value : coder.decode(value)
|
14
|
+
coder.wrap(record, name, value)
|
13
15
|
end
|
14
16
|
end
|
15
17
|
|
@@ -23,11 +25,11 @@ module CassandraObject
|
|
23
25
|
|
24
26
|
attribute_method_suffix("", "=")
|
25
27
|
|
26
|
-
%w(array boolean date float integer time time_with_zone
|
28
|
+
%w(array boolean date float integer time time_with_zone string).each do |type|
|
27
29
|
instance_eval <<-EOV, __FILE__, __LINE__ + 1
|
28
|
-
def #{type}(name, options = {})
|
29
|
-
attribute(name, options.update(type: :#{type}))
|
30
|
-
end
|
30
|
+
def #{type}(name, options = {}) # def string(name, options = {})
|
31
|
+
attribute(name, options.update(type: :#{type})) # attribute(name, options.update(type: :string))
|
32
|
+
end # end
|
31
33
|
EOV
|
32
34
|
end
|
33
35
|
end
|
@@ -38,18 +40,31 @@ module CassandraObject
|
|
38
40
|
child.model_attributes = model_attributes.dup
|
39
41
|
end
|
40
42
|
|
43
|
+
#
|
44
|
+
# attribute :name, type: :string
|
45
|
+
# attribute :ammo, type: Ammo, coder: AmmoCodec
|
46
|
+
#
|
41
47
|
def attribute(name, options)
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
+
expected_type = options.delete :type
|
49
|
+
coder = options.delete :coder
|
50
|
+
|
51
|
+
if expected_type.is_a?(Symbol)
|
52
|
+
type_mapping = CassandraObject::Type.get_mapping(expected_type) || (raise "Unknown type #{type}")
|
53
|
+
elsif coder.nil?
|
54
|
+
raise "Must supply a :coder for #{name}"
|
48
55
|
else
|
49
|
-
|
56
|
+
type_mapping = CassandraObject::Type::TypeMapping.new(expected_type, coder)
|
50
57
|
end
|
51
58
|
|
52
|
-
model_attributes[name] = Attribute.new(name,
|
59
|
+
model_attributes[name] = Attribute.new(name, type_mapping, options)
|
60
|
+
end
|
61
|
+
|
62
|
+
def instantiate_attribute(record, name, value)
|
63
|
+
if model_attribute = model_attributes[name]
|
64
|
+
model_attribute.instantiate(record, value)
|
65
|
+
else
|
66
|
+
raise NoMethodError, "Unknown attribute #{name.inspect}"
|
67
|
+
end
|
53
68
|
end
|
54
69
|
|
55
70
|
def define_attribute_methods
|
@@ -58,11 +73,7 @@ module CassandraObject
|
|
58
73
|
end
|
59
74
|
|
60
75
|
def write_attribute(name, value)
|
61
|
-
|
62
|
-
@attributes[name.to_s] = ma.check_value!(value)
|
63
|
-
else
|
64
|
-
raise NoMethodError, "Unknown attribute #{name.inspect}"
|
65
|
-
end
|
76
|
+
@attributes[name.to_s] = self.class.instantiate_attribute(self, name, value)
|
66
77
|
end
|
67
78
|
|
68
79
|
def read_attribute(name)
|
@@ -4,12 +4,12 @@ module CassandraObject
|
|
4
4
|
|
5
5
|
module ClassMethods
|
6
6
|
def find(key)
|
7
|
-
|
7
|
+
key_string = key.try :to_s
|
8
8
|
|
9
|
-
if
|
9
|
+
if key_string.blank?
|
10
10
|
raise CassandraObject::RecordNotFound, "Couldn't find #{self.name} with key #{key.inspect}"
|
11
|
-
elsif attributes = connection.get(column_family,
|
12
|
-
instantiate(
|
11
|
+
elsif attributes = connection.get(column_family, key_string).presence
|
12
|
+
instantiate(key_string, attributes)
|
13
13
|
else
|
14
14
|
raise CassandraObject::RecordNotFound
|
15
15
|
end
|
@@ -40,7 +40,7 @@ module CassandraObject
|
|
40
40
|
object.instance_variable_set("@key", parse_key(key))
|
41
41
|
object.instance_variable_set("@new_record", false)
|
42
42
|
object.instance_variable_set("@destroyed", false)
|
43
|
-
object.instance_variable_set("@attributes", decode_columns_hash(attributes))
|
43
|
+
object.instance_variable_set("@attributes", decode_columns_hash(object, attributes))
|
44
44
|
end
|
45
45
|
end
|
46
46
|
|
@@ -54,8 +54,8 @@ module CassandraObject
|
|
54
54
|
end.merge({"schema_version" => schema_version.to_s})
|
55
55
|
end
|
56
56
|
|
57
|
-
def decode_columns_hash(attributes)
|
58
|
-
Hash[attributes.map { |k, v| [k.to_s,
|
57
|
+
def decode_columns_hash(object, attributes)
|
58
|
+
Hash[attributes.map { |k, v| [k.to_s, instantiate_attribute(object, k, v)] }]
|
59
59
|
end
|
60
60
|
|
61
61
|
def column_family_configuration
|
@@ -4,7 +4,6 @@ CassandraObject::Type.register(:date, Date, CassandraObject::Types::DateType)
|
|
4
4
|
CassandraObject::Type.register(:float, Float, CassandraObject::Types::FloatType)
|
5
5
|
CassandraObject::Type.register(:hash, Hash, CassandraObject::Types::HashType)
|
6
6
|
CassandraObject::Type.register(:integer, Integer, CassandraObject::Types::IntegerType)
|
7
|
-
CassandraObject::Type.register(:set, Array, CassandraObject::Types::SetType)
|
8
7
|
CassandraObject::Type.register(:time, Time, CassandraObject::Types::TimeType)
|
9
8
|
CassandraObject::Type.register(:time_with_zone, ActiveSupport::TimeWithZone, CassandraObject::Types::TimeWithZoneType)
|
10
9
|
CassandraObject::Type.register(:string, String, CassandraObject::Types::StringType)
|
@@ -1,13 +1,44 @@
|
|
1
1
|
module CassandraObject
|
2
2
|
module Types
|
3
|
-
class ArrayType
|
3
|
+
class ArrayType < BaseType
|
4
|
+
class Proxy < BasicObject
|
5
|
+
attr_accessor :record, :name, :array, :options
|
6
|
+
def initialize(record, name, array, options)
|
7
|
+
@record = record
|
8
|
+
@name = name
|
9
|
+
@array = array.presence || []
|
10
|
+
@options = options
|
11
|
+
end
|
12
|
+
|
13
|
+
def <<(obj)
|
14
|
+
array << obj
|
15
|
+
array.sort!
|
16
|
+
array.uniq! if options[:unique]
|
17
|
+
record.send("#{name}=", array)
|
18
|
+
end
|
19
|
+
|
20
|
+
def method_missing(method, *args, &block)
|
21
|
+
array.send(method, *args, &block)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def ignore_nil?
|
26
|
+
false
|
27
|
+
end
|
28
|
+
|
4
29
|
def encode(array)
|
5
30
|
raise ArgumentError.new("#{self} requires an Array") unless array.kind_of?(Array)
|
6
|
-
array.to_json
|
31
|
+
array.to_a.to_json
|
7
32
|
end
|
8
33
|
|
9
34
|
def decode(str)
|
10
|
-
ActiveSupport::JSON.decode(str)
|
35
|
+
array = ActiveSupport::JSON.decode(str)
|
36
|
+
array.uniq! if options[:unique]
|
37
|
+
array
|
38
|
+
end
|
39
|
+
|
40
|
+
def wrap(record, name, value)
|
41
|
+
Proxy.new(record, name, value, options)
|
11
42
|
end
|
12
43
|
end
|
13
44
|
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module CassandraObject
|
2
|
+
module Types
|
3
|
+
class BaseType
|
4
|
+
attr_accessor :options
|
5
|
+
def initialize(options = {})
|
6
|
+
@options = options
|
7
|
+
end
|
8
|
+
|
9
|
+
def ignore_nil?
|
10
|
+
true
|
11
|
+
end
|
12
|
+
|
13
|
+
def encode(value)
|
14
|
+
value.to_s
|
15
|
+
end
|
16
|
+
|
17
|
+
def decode(str)
|
18
|
+
str
|
19
|
+
end
|
20
|
+
|
21
|
+
def wrap(record, name, value)
|
22
|
+
value
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -1,18 +1,18 @@
|
|
1
1
|
module CassandraObject
|
2
2
|
module Types
|
3
|
-
class DateType
|
3
|
+
class DateType < BaseType
|
4
4
|
FORMAT = '%Y-%m-%d'
|
5
5
|
REGEX = /\A\d{4}-\d{2}-\d{2}\Z/
|
6
|
-
|
7
|
-
|
8
|
-
|
6
|
+
|
7
|
+
def encode(value)
|
8
|
+
raise ArgumentError.new("#{self} requires a Date") unless value.kind_of?(Date)
|
9
|
+
value.strftime(FORMAT)
|
9
10
|
end
|
10
11
|
|
11
12
|
def decode(str)
|
12
13
|
return nil if str.empty?
|
13
|
-
|
14
|
-
Date.strptime(str, FORMAT)
|
14
|
+
Date.parse(str)
|
15
15
|
end
|
16
16
|
end
|
17
17
|
end
|
18
|
-
end
|
18
|
+
end
|
@@ -34,13 +34,13 @@ module CassandraObject
|
|
34
34
|
module Types
|
35
35
|
extend ActiveSupport::Autoload
|
36
36
|
|
37
|
+
autoload :BaseType
|
37
38
|
autoload :ArrayType
|
38
39
|
autoload :BooleanType
|
39
40
|
autoload :DateType
|
40
41
|
autoload :FloatType
|
41
42
|
autoload :HashType
|
42
43
|
autoload :IntegerType
|
43
|
-
autoload :SetType
|
44
44
|
autoload :StringType
|
45
45
|
autoload :TimeType
|
46
46
|
autoload :TimeWithZoneType
|
data/test/attributes_test.rb
CHANGED
@@ -1,14 +1,38 @@
|
|
1
1
|
require 'test_helper'
|
2
2
|
|
3
3
|
class CassandraObject::AttributesTest < CassandraObject::TestCase
|
4
|
+
class CustomType
|
5
|
+
end
|
6
|
+
|
7
|
+
class CustomCoder < CassandraObject::Types::BaseType
|
8
|
+
end
|
9
|
+
|
4
10
|
class TestIssue < CassandraObject::Base
|
5
11
|
self.column_family = 'Issue'
|
12
|
+
attribute :custom_column, type: CustomType, coder: CustomCoder
|
13
|
+
integer :price
|
6
14
|
end
|
7
15
|
|
8
16
|
class TestChildIssue < TestIssue
|
9
17
|
string :description
|
10
18
|
end
|
11
19
|
|
20
|
+
test 'custom attribute definer' do
|
21
|
+
model_attribute = TestIssue.model_attributes[:custom_column]
|
22
|
+
|
23
|
+
assert_kind_of CustomCoder, model_attribute.coder
|
24
|
+
assert_equal CustomType, model_attribute.expected_type
|
25
|
+
end
|
26
|
+
|
27
|
+
test 'instantiate_attribute' do
|
28
|
+
assert_equal 1, TestIssue.instantiate_attribute(TestIssue.new, 'price', 1)
|
29
|
+
assert_equal 1, TestIssue.instantiate_attribute(TestIssue.new, :price, 1)
|
30
|
+
|
31
|
+
assert_raise NoMethodError do
|
32
|
+
TestIssue.instantiate_attribute(TestIssue.new, 'wtf', 1)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
12
36
|
test 'attributes not shared' do
|
13
37
|
assert_nothing_raised { Issue.new.description }
|
14
38
|
assert_raise(NoMethodError) { TestIssue.new.description }
|
@@ -24,4 +48,4 @@ class CassandraObject::AttributesTest < CassandraObject::TestCase
|
|
24
48
|
|
25
49
|
assert_equal 'foo', issue.description
|
26
50
|
end
|
27
|
-
end
|
51
|
+
end
|
data/test/dirty_test.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class CassandraObject::DirtyTest < CassandraObject::TestCase
|
4
|
+
class TestRecord < CassandraObject::Base
|
5
|
+
key :uuid
|
6
|
+
self.column_family = 'Issues'
|
7
|
+
string :name
|
8
|
+
end
|
9
|
+
|
10
|
+
test 'save clears dirty' do
|
11
|
+
record = TestRecord.new(name: 'foo')
|
12
|
+
assert record.changed?
|
13
|
+
|
14
|
+
record.save
|
15
|
+
|
16
|
+
assert !record.changed?
|
17
|
+
end
|
18
|
+
end
|
data/test/finder_methods_test.rb
CHANGED
@@ -1,6 +1,10 @@
|
|
1
1
|
require 'test_helper'
|
2
2
|
|
3
3
|
class CassandraObject::Types::ArrayTypeTest < CassandraObject::Types::TestCase
|
4
|
+
test 'ignore_nil' do
|
5
|
+
assert_equal false, coder.ignore_nil?
|
6
|
+
end
|
7
|
+
|
4
8
|
test 'encode' do
|
5
9
|
assert_equal ['1', '2'].to_json, coder.encode(['1', '2'])
|
6
10
|
|
@@ -12,4 +16,21 @@ class CassandraObject::Types::ArrayTypeTest < CassandraObject::Types::TestCase
|
|
12
16
|
test 'decode' do
|
13
17
|
assert_equal ['1', '2'], coder.decode(['1', '2'].to_json)
|
14
18
|
end
|
15
|
-
|
19
|
+
|
20
|
+
class TestIssue < CassandraObject::Base
|
21
|
+
self.column_family = 'Issue'
|
22
|
+
array :favorite_colors
|
23
|
+
end
|
24
|
+
|
25
|
+
test 'wrap' do
|
26
|
+
issue = TestIssue.new
|
27
|
+
colors = []
|
28
|
+
wrapper = coder.wrap(issue, 'favorite_colors', colors)
|
29
|
+
|
30
|
+
assert_kind_of Array, wrapper
|
31
|
+
|
32
|
+
assert !issue.changed?
|
33
|
+
wrapper << 'red'
|
34
|
+
assert issue.changed?
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class CassandraObject::Types::BaseTypeTest < CassandraObject::Types::TestCase
|
4
|
+
test 'ignore_nil' do
|
5
|
+
assert_equal true, coder.ignore_nil?
|
6
|
+
end
|
7
|
+
|
8
|
+
test 'encode' do
|
9
|
+
assert_equal '1', coder.encode(1)
|
10
|
+
assert_equal '', coder.encode(nil)
|
11
|
+
assert_equal '1', coder.encode('1')
|
12
|
+
end
|
13
|
+
|
14
|
+
test 'decode' do
|
15
|
+
assert_equal 'abc', coder.decode('abc')
|
16
|
+
end
|
17
|
+
|
18
|
+
test 'wrap' do
|
19
|
+
object = Object.new
|
20
|
+
assert_equal object, coder.wrap(nil, nil, object)
|
21
|
+
end
|
22
|
+
end
|
@@ -1,4 +1,11 @@
|
|
1
1
|
require 'test_helper'
|
2
2
|
|
3
|
-
class CassandraObject::
|
4
|
-
|
3
|
+
class CassandraObject::Types::DateTypeTest < CassandraObject::Types::TestCase
|
4
|
+
test 'encode' do
|
5
|
+
assert_equal '2004-04-25', coder.encode(Date.new(2004, 4, 25))
|
6
|
+
end
|
7
|
+
|
8
|
+
test 'decode' do
|
9
|
+
assert_equal Date.new(2004, 4, 25), coder.decode('2004-04-25')
|
10
|
+
end
|
11
|
+
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.6.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: 2011-08-
|
13
|
+
date: 2011-08-29 00:00:00.000000000Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: activemodel
|
17
|
-
requirement: &
|
17
|
+
requirement: &70153564769440 !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: *70153564769440
|
26
26
|
- !ruby/object:Gem::Dependency
|
27
27
|
name: cassandra
|
28
|
-
requirement: &
|
28
|
+
requirement: &70153564768800 !ruby/object:Gem::Requirement
|
29
29
|
none: false
|
30
30
|
requirements:
|
31
31
|
- - ~>
|
@@ -33,10 +33,10 @@ dependencies:
|
|
33
33
|
version: 0.12.0
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
|
-
version_requirements: *
|
36
|
+
version_requirements: *70153564768800
|
37
37
|
- !ruby/object:Gem::Dependency
|
38
38
|
name: bundler
|
39
|
-
requirement: &
|
39
|
+
requirement: &70153564768060 !ruby/object:Gem::Requirement
|
40
40
|
none: false
|
41
41
|
requirements:
|
42
42
|
- - ~>
|
@@ -44,7 +44,7 @@ dependencies:
|
|
44
44
|
version: 1.0.0
|
45
45
|
type: :development
|
46
46
|
prerelease: false
|
47
|
-
version_requirements: *
|
47
|
+
version_requirements: *70153564768060
|
48
48
|
description: Cassandra ActiveModel
|
49
49
|
email: gems@gotime.com
|
50
50
|
executables: []
|
@@ -101,12 +101,12 @@ files:
|
|
101
101
|
- lib/cassandra_object/type.rb
|
102
102
|
- lib/cassandra_object/types.rb
|
103
103
|
- lib/cassandra_object/types/array_type.rb
|
104
|
+
- lib/cassandra_object/types/base_type.rb
|
104
105
|
- lib/cassandra_object/types/boolean_type.rb
|
105
106
|
- lib/cassandra_object/types/date_type.rb
|
106
107
|
- lib/cassandra_object/types/float_type.rb
|
107
108
|
- lib/cassandra_object/types/hash_type.rb
|
108
109
|
- lib/cassandra_object/types/integer_type.rb
|
109
|
-
- lib/cassandra_object/types/set_type.rb
|
110
110
|
- lib/cassandra_object/types/string_type.rb
|
111
111
|
- lib/cassandra_object/types/time_type.rb
|
112
112
|
- lib/cassandra_object/types/time_with_zone_type.rb
|
@@ -119,6 +119,7 @@ files:
|
|
119
119
|
- test/callbacks_test.rb
|
120
120
|
- test/connection_test.rb
|
121
121
|
- test/consistency_test.rb
|
122
|
+
- test/dirty_test.rb
|
122
123
|
- test/finder_methods_test.rb
|
123
124
|
- test/identity/uuid_key_factory_test.rb
|
124
125
|
- test/identity_test.rb
|
@@ -126,12 +127,12 @@ files:
|
|
126
127
|
- test/test_helper.rb
|
127
128
|
- test/timestamps_test.rb
|
128
129
|
- test/types/array_type_test.rb
|
130
|
+
- test/types/base_type_test.rb
|
129
131
|
- test/types/boolean_type_test.rb
|
130
132
|
- test/types/date_type_test.rb
|
131
133
|
- test/types/float_type_test.rb
|
132
134
|
- test/types/hash_type_test.rb
|
133
135
|
- test/types/integer_type_test.rb
|
134
|
-
- test/types/set_type_test.rb
|
135
136
|
- test/types/string_type_test.rb
|
136
137
|
- test/types/time_type_test.rb
|
137
138
|
- test/validations_test.rb
|
@@ -167,6 +168,7 @@ test_files:
|
|
167
168
|
- test/callbacks_test.rb
|
168
169
|
- test/connection_test.rb
|
169
170
|
- test/consistency_test.rb
|
171
|
+
- test/dirty_test.rb
|
170
172
|
- test/finder_methods_test.rb
|
171
173
|
- test/identity/uuid_key_factory_test.rb
|
172
174
|
- test/identity_test.rb
|
@@ -174,12 +176,12 @@ test_files:
|
|
174
176
|
- test/test_helper.rb
|
175
177
|
- test/timestamps_test.rb
|
176
178
|
- test/types/array_type_test.rb
|
179
|
+
- test/types/base_type_test.rb
|
177
180
|
- test/types/boolean_type_test.rb
|
178
181
|
- test/types/date_type_test.rb
|
179
182
|
- test/types/float_type_test.rb
|
180
183
|
- test/types/hash_type_test.rb
|
181
184
|
- test/types/integer_type_test.rb
|
182
|
-
- test/types/set_type_test.rb
|
183
185
|
- test/types/string_type_test.rb
|
184
186
|
- test/types/time_type_test.rb
|
185
187
|
- test/validations_test.rb
|
@@ -1,20 +0,0 @@
|
|
1
|
-
module CassandraObject
|
2
|
-
module Types
|
3
|
-
class SetType
|
4
|
-
def encode(set)
|
5
|
-
if set.kind_of?(Set)
|
6
|
-
set.to_json
|
7
|
-
elsif set.kind_of?(Array)
|
8
|
-
set.uniq.to_json
|
9
|
-
else
|
10
|
-
raise ArgumentError.new("#{self} requires an Array or Set")
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
def decode(str)
|
15
|
-
return str.to_a if str.kind_of?(Set)
|
16
|
-
ActiveSupport::JSON.decode(str)
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
data/test/types/set_type_test.rb
DELETED
@@ -1,17 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
|
3
|
-
class CassandraObject::Types::SetTypeTest < CassandraObject::Types::TestCase
|
4
|
-
test 'encode' do
|
5
|
-
assert_equal ['1', '2'].to_json, coder.encode(['1', '2'].to_set)
|
6
|
-
assert_equal ['1', '2'].to_json, coder.encode(['1', '2', '2'])
|
7
|
-
|
8
|
-
assert_raise ArgumentError do
|
9
|
-
coder.encode('wtf')
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
test 'decode' do
|
14
|
-
assert_equal ['1', '2'], coder.decode(['1', '2'].to_set)
|
15
|
-
assert_equal ['1', '2'], coder.decode(['1', '2'].to_json)
|
16
|
-
end
|
17
|
-
end
|