sandra 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (2) hide show
  1. data/lib/sandra.rb +55 -18
  2. 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
- if valid?
30
- attrs = attributes.dup
31
- key = attrs.delete(self.class.key)
32
- self.class.insert(key, attrs)
33
- new_record = false
34
- true
35
- else
36
- false
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("User", key)
76
+ hash = connection.get(self.to_s, key)
65
77
  unless hash.empty?
66
- obj = self.new(hash)
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("User", key, columns)
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
- date: 2010-08-08 00:00:00 Z
14
- dependencies:
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
- prerelease: false
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: "0"
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
- requirement: &id002 !ruby/object:Gem::Requirement
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: "0"
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
- requirement: &id003 !ruby/object:Gem::Requirement
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: "0"
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
46
44
  type: :development
47
- version_requirements: *id003
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: "0"
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: "0"
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
-