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.
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
-