sandra 0.1.0 → 0.1.1
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/lib/sandra.rb +55 -18
- metadata +42 -50
data/lib/sandra.rb
CHANGED
@@ -1,14 +1,17 @@
|
|
1
1
|
require 'active_model'
|
2
2
|
require 'cassandra'
|
3
3
|
require 'sandra/key_validator'
|
4
|
+
require 'sandra/list'
|
4
5
|
|
5
6
|
module Sandra
|
6
7
|
def self.included(base)
|
7
8
|
base.extend(ClassMethods)
|
8
9
|
base.extend(ActiveModel::Naming)
|
10
|
+
base.extend(ActiveModel::Callbacks)
|
9
11
|
base.class_eval do
|
10
12
|
include ActiveModel::Validations
|
11
13
|
include ActiveModel::Conversion
|
14
|
+
define_model_callbacks :create, :update, :save, :destroy
|
12
15
|
attr_accessor :attributes, :new_record
|
13
16
|
def initialize(attrs = {})
|
14
17
|
@attributes = attrs.stringify_keys
|
@@ -17,6 +20,10 @@ module Sandra
|
|
17
20
|
end
|
18
21
|
end
|
19
22
|
|
23
|
+
def key
|
24
|
+
attributes[self.class.key.to_s]
|
25
|
+
end
|
26
|
+
|
20
27
|
def new_record?
|
21
28
|
new_record
|
22
29
|
end
|
@@ -26,19 +33,24 @@ module Sandra
|
|
26
33
|
end
|
27
34
|
|
28
35
|
def save
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
36
|
+
callback_target = self.new_record? ? :create : :update
|
37
|
+
run_callbacks callback_target do
|
38
|
+
run_callbacks :save do
|
39
|
+
attrs = attributes.dup
|
40
|
+
key = attrs.delete(self.class.key)
|
41
|
+
if key && valid?
|
42
|
+
self.class.insert(key, attrs)
|
43
|
+
new_record = false
|
44
|
+
true
|
45
|
+
else
|
46
|
+
false
|
47
|
+
end
|
48
|
+
end
|
37
49
|
end
|
38
50
|
end
|
39
51
|
|
40
52
|
module ClassMethods
|
41
|
-
def column(col_name)
|
53
|
+
def column(col_name, type)
|
42
54
|
define_method col_name do
|
43
55
|
attr = col_name.to_s
|
44
56
|
attributes[attr]
|
@@ -50,7 +62,7 @@ module Sandra
|
|
50
62
|
end
|
51
63
|
|
52
64
|
def establish_connection(options = {})
|
53
|
-
connection_options = YAML.load_file("#{::Rails.root.to_s}/config/sandra.yml")[Rails.env].merge(options)
|
65
|
+
connection_options = YAML.load_file("#{::Rails.root.to_s}/config/sandra.yml")[::Rails.env].merge(options)
|
54
66
|
keyspace = connection_options["keyspace"]
|
55
67
|
host = "#{connection_options["host"]}:#{connection_options["port"]}"
|
56
68
|
@connection = Cassandra.new(keyspace, host)
|
@@ -61,25 +73,29 @@ module Sandra
|
|
61
73
|
end
|
62
74
|
|
63
75
|
def get(key)
|
64
|
-
hash = connection.get(
|
76
|
+
hash = connection.get(self.to_s, key)
|
65
77
|
unless hash.empty?
|
66
|
-
|
67
|
-
obj.username = key
|
68
|
-
obj.new_record = false
|
69
|
-
obj
|
78
|
+
self.new_object(key, hash)
|
70
79
|
else
|
71
80
|
nil
|
72
81
|
end
|
73
82
|
end
|
74
83
|
|
84
|
+
def new_object(key, attributes)
|
85
|
+
obj = self.new(attributes)
|
86
|
+
obj.send("#{@key}=", key)
|
87
|
+
obj.new_record = false
|
88
|
+
obj
|
89
|
+
end
|
90
|
+
|
75
91
|
def insert(key, columns = {})
|
76
|
-
connection.insert(
|
92
|
+
connection.insert(self.to_s, key, columns)
|
77
93
|
end
|
78
94
|
|
79
|
-
def key_attribute(name)
|
95
|
+
def key_attribute(name, type)
|
80
96
|
@key = name
|
81
97
|
validates name, :presence => true, :key => true
|
82
|
-
column name
|
98
|
+
column name, type
|
83
99
|
end
|
84
100
|
|
85
101
|
def key
|
@@ -91,5 +107,26 @@ module Sandra
|
|
91
107
|
obj.save
|
92
108
|
obj
|
93
109
|
end
|
110
|
+
|
111
|
+
def range(options)
|
112
|
+
connection.get_range(self.to_s, options).map do |key, value|
|
113
|
+
self.new_object(key, value)
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
def list(name, type)
|
118
|
+
define_method name do
|
119
|
+
var_name = "@__#{name}_list"
|
120
|
+
unless instance_variable_get(var_name)
|
121
|
+
instance_variable_set(var_name, Sandra::List.new(name, type, self))
|
122
|
+
end
|
123
|
+
instance_variable_get(var_name)
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
def multi_get(keys)
|
128
|
+
collection = connection.multi_get(self.to_s, keys)
|
129
|
+
collection.map {|key, attrs| self.new_object(key, attrs) }
|
130
|
+
end
|
94
131
|
end
|
95
132
|
end
|
metadata
CHANGED
@@ -1,88 +1,80 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: sandra
|
3
|
-
version: !ruby/object:Gem::Version
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.1
|
4
5
|
prerelease:
|
5
|
-
version: 0.1.0
|
6
6
|
platform: ruby
|
7
|
-
authors:
|
7
|
+
authors:
|
8
8
|
- Charles Max Wood
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
- !ruby/object:Gem::Dependency
|
12
|
+
date: 2010-08-08 00:00:00.000000000Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
16
15
|
name: cassandra
|
17
|
-
|
18
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
16
|
+
requirement: &70280507014000 !ruby/object:Gem::Requirement
|
19
17
|
none: false
|
20
|
-
requirements:
|
21
|
-
- -
|
22
|
-
- !ruby/object:Gem::Version
|
23
|
-
version:
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
24
22
|
type: :runtime
|
25
|
-
version_requirements: *id001
|
26
|
-
- !ruby/object:Gem::Dependency
|
27
|
-
name: activemodel
|
28
23
|
prerelease: false
|
29
|
-
|
24
|
+
version_requirements: *70280507014000
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: activemodel
|
27
|
+
requirement: &70280507013560 !ruby/object:Gem::Requirement
|
30
28
|
none: false
|
31
|
-
requirements:
|
32
|
-
- -
|
33
|
-
- !ruby/object:Gem::Version
|
34
|
-
version:
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0'
|
35
33
|
type: :runtime
|
36
|
-
version_requirements: *id002
|
37
|
-
- !ruby/object:Gem::Dependency
|
38
|
-
name: rspec
|
39
34
|
prerelease: false
|
40
|
-
|
35
|
+
version_requirements: *70280507013560
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: rspec
|
38
|
+
requirement: &70280507013140 !ruby/object:Gem::Requirement
|
41
39
|
none: false
|
42
|
-
requirements:
|
43
|
-
- -
|
44
|
-
- !ruby/object:Gem::Version
|
45
|
-
version:
|
40
|
+
requirements:
|
41
|
+
- - ! '>='
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '0'
|
46
44
|
type: :development
|
47
|
-
|
45
|
+
prerelease: false
|
46
|
+
version_requirements: *70280507013140
|
48
47
|
description: Provides an Object Relational interface to Cassandra
|
49
48
|
email: chuck@teachmetocode.com
|
50
49
|
executables: []
|
51
|
-
|
52
50
|
extensions: []
|
53
|
-
|
54
51
|
extra_rdoc_files: []
|
55
|
-
|
56
|
-
files:
|
52
|
+
files:
|
57
53
|
- README
|
58
54
|
- MIT-LICENSE
|
59
55
|
- lib/sandra.rb
|
60
56
|
homepage: http://teachmetocode.com/
|
61
57
|
licenses: []
|
62
|
-
|
63
58
|
post_install_message:
|
64
59
|
rdoc_options: []
|
65
|
-
|
66
|
-
require_paths:
|
60
|
+
require_paths:
|
67
61
|
- lib
|
68
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
62
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
69
63
|
none: false
|
70
|
-
requirements:
|
71
|
-
- -
|
72
|
-
- !ruby/object:Gem::Version
|
73
|
-
version:
|
74
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - ! '>='
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: '0'
|
68
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
75
69
|
none: false
|
76
|
-
requirements:
|
77
|
-
- -
|
78
|
-
- !ruby/object:Gem::Version
|
79
|
-
version:
|
70
|
+
requirements:
|
71
|
+
- - ! '>='
|
72
|
+
- !ruby/object:Gem::Version
|
73
|
+
version: '0'
|
80
74
|
requirements: []
|
81
|
-
|
82
75
|
rubyforge_project:
|
83
76
|
rubygems_version: 1.8.6
|
84
77
|
signing_key:
|
85
78
|
specification_version: 3
|
86
79
|
summary: ORM for Cassandra in Ruby
|
87
80
|
test_files: []
|
88
|
-
|