corm 0.0.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 (4) hide show
  1. checksums.yaml +7 -0
  2. data/lib/corm.rb +2 -0
  3. data/lib/corm/model.rb +202 -0
  4. metadata +106 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 67ef8193840e0b7e30a9c91e1514d810375df22e
4
+ data.tar.gz: f04ac8aedcf098c9dc693b894b2a87c557d1d800
5
+ SHA512:
6
+ metadata.gz: 4353603cfd46afb226f050ff30dade6cd58298176a9a48ba65c28c4114511b2be191881aa2eef9b53d0af9b824c83e6d14a8658147de56689b7163a7ef51b948
7
+ data.tar.gz: 0c55131ed43b43cb681f1422d50f166d0860d5b346e1b02f248db53d068b88fcdbeccd7cf0101c09f1135123883ac378dc426f8f60a55a44ff91c7a2337817c5
@@ -0,0 +1,2 @@
1
+ # encoding: utf-8
2
+ require 'corm/model'
@@ -0,0 +1,202 @@
1
+ # encoding: utf-8
2
+
3
+ require 'cassandra'
4
+ require 'multi_json'
5
+ require 'set'
6
+
7
+
8
+ module Corm
9
+
10
+ class Model
11
+
12
+ def self.configure opts = {}
13
+ @@cluster = Cassandra.cluster opts
14
+ end
15
+
16
+ def self.cluster
17
+ @@cluster
18
+ end
19
+
20
+ def self.execute *args
21
+ session.execute *args
22
+ end
23
+
24
+ def self.field name, type, pkey = false
25
+
26
+ fields[name.to_s.downcase] = type.to_s.downcase
27
+
28
+ primary_key name.to_s.downcase if pkey
29
+
30
+ send(:define_method, name.to_s.downcase) do
31
+ type = self.class.fields[name.to_s.downcase]
32
+ value = record[name.to_s.downcase]
33
+ if type == 'json'
34
+ MultiJson.decode value
35
+ elsif type.start_with?('list') && type['json']
36
+ value.map{|s| MultiJson.decode s}
37
+ elsif type.start_with?('set') && type['json']
38
+ Set.new value.map{|s| MultiJson.decode s}
39
+ elsif type.start_with?('map') && type['json']
40
+ value.inject({}) do |hash, (k, v)|
41
+ k = MultiJson.decode k if type['json,'] || type['json ,']
42
+ v = MultiJson.decode v if type[', json'] || type[',json']
43
+ hash.merge(k => v)
44
+ end
45
+ else
46
+ value
47
+ end
48
+ end
49
+
50
+ send(:define_method, '[]') do |field|
51
+ send field.to_s.downcase
52
+ end
53
+
54
+ send(:define_method, "#{name.to_s.downcase}=") do |value|
55
+ type = self.class.fields[name.to_s.downcase]
56
+ record[name.to_s.downcase] = if type == 'json'
57
+ MultiJson.encode value
58
+ elsif type.start_with?('list') && type['json']
59
+ value.map{|s| MultiJson.encode s}
60
+ elsif type.start_with?('set') && type['json']
61
+ Set.new value.map{|s| MultiJson.encode s}
62
+ elsif type.start_with?('map') && type['json']
63
+ value.inject({}) do |hash, (k, v)|
64
+ k = MultiJson.encode k if type['json,'] || type['json ,']
65
+ v = MultiJson.encode v if type[', json'] || type[',json']
66
+ hash.merge(k => v)
67
+ end
68
+ else
69
+ value
70
+ end
71
+ end
72
+
73
+ send(:define_method, '[]=') do |field, value|
74
+ send "#{field.to_s.downcase}=", value
75
+ end
76
+
77
+ nil
78
+ end
79
+
80
+ def self.fields
81
+ @@fields ||= {}
82
+ @@fields
83
+ end
84
+
85
+ def self.get relations
86
+ if statements['get'].nil?
87
+ fields = primary_key.flatten.map{ |key| "#{key} = ?" }.join ' AND '
88
+ statement = "SELECT * FROM #{keyspace}.#{table} WHERE #{fields} LIMIT 1;"
89
+ statements['get'] = session.prepare statement
90
+ end
91
+ values = primary_key.flatten.map{ |key| relations[key.to_s] || relations[key.to_sym] }
92
+ _cassandra_record = execute(statements['get'], arguments: values).first
93
+ _cassandra_record ? self.new(_cassandra_record: _cassandra_record) : nil
94
+ end
95
+
96
+ def self.keyspace name = nil
97
+ @@keyspace = name.to_s unless name.nil?
98
+ @@keyspace
99
+ end
100
+
101
+ def self.primary_key partition_key = nil, *cols
102
+ @@primary_key = [Array(partition_key), cols] unless partition_key.nil?
103
+ @@primary_key
104
+ end
105
+
106
+ def self.properties *args
107
+ @@properties ||= args
108
+ @@properties
109
+ end
110
+
111
+ def self.session
112
+ @@session ||= cluster.connect keyspace
113
+ @@session
114
+ end
115
+
116
+ def self.statements
117
+ @@statements ||= {}
118
+ @@statements
119
+ end
120
+
121
+ def self.table name = nil
122
+ @@table = name unless name.nil?
123
+ @@table
124
+ end
125
+
126
+ def self.table!
127
+ table_ = [keyspace, table].compact.join '.'
128
+ pkey = []
129
+ partition_key = primary_key[0].join(',')
130
+ pkey << (primary_key[0].count > 1 ? "(#{partition_key})" : partition_key) unless primary_key[0].to_a.empty?
131
+ pkey << primary_key[1].join(',') unless primary_key[1].to_a.empty?
132
+ pkey = pkey.join ','
133
+ fields_ = fields.to_a.map{ |args| args.join ' ' }.concat(["PRIMARY KEY (#{pkey})"]).join ', '
134
+ definition = "CREATE TABLE #{table_} (#{fields_})".downcase.gsub('json', 'text')
135
+ definition = properties.to_a.empty? ? "#{definition};" : "#{definition} WITH #{properties.to_a.join ' AND '};"
136
+ execute definition
137
+ end
138
+
139
+ def initialize opts = {}
140
+ @record = opts.delete(:_cassandra_record) || opts.delete('_cassandra_record')
141
+ opts.each{ |k,v| self.send "#{k}=", v } if @record.nil?
142
+ end
143
+
144
+ def delete
145
+ if statements['delete'].nil?
146
+ pks = primary_key.flatten.map{ |key| "#{key} = ?" }.join ' AND '
147
+ statement = "DELETE FROM #{keyspace}.#{table} WHERE #{pks};"
148
+ statements['delete'] = session.prepare statement
149
+ end
150
+ values = primary_key.flatten.map{ |key| record[key.to_s] || record[key.to_sym] }
151
+ execute statements['delete'], arguments: values
152
+ nil
153
+ end
154
+
155
+ def record
156
+ @record ||= {}
157
+ @record
158
+ end
159
+
160
+ def save
161
+ if statements['save'].nil?
162
+ values = fields.keys.map{'?'} .join ','
163
+ statement = "INSERT INTO #{keyspace}.#{table} (#{fields.keys.join ','}) VALUES (#{values});"
164
+ statements['save'] = session.prepare statement
165
+ end
166
+ puts execute statements['save'], arguments: fields.keys.map{|k| record[k]}
167
+ nil
168
+ end
169
+
170
+ private
171
+
172
+ def execute *args
173
+ self.class.execute *args
174
+ end
175
+
176
+ def keyspace
177
+ self.class.keyspace
178
+ end
179
+
180
+ def fields
181
+ self.class.fields
182
+ end
183
+
184
+ def primary_key
185
+ self.class.primary_key
186
+ end
187
+
188
+ def session
189
+ self.class.session
190
+ end
191
+
192
+ def statements
193
+ self.class.statements
194
+ end
195
+
196
+ def table
197
+ self.class.table
198
+ end
199
+
200
+ end
201
+
202
+ end
metadata ADDED
@@ -0,0 +1,106 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: corm
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Stefano Fontanelli
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-02-17 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: cassandra-driver
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 2.0.1
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 2.0.1
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: 2.0.1
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 2.0.1
33
+ - !ruby/object:Gem::Dependency
34
+ name: multi_json
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: 1.10.1
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ version: 1.10.1
43
+ type: :runtime
44
+ prerelease: false
45
+ version_requirements: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - "~>"
48
+ - !ruby/object:Gem::Version
49
+ version: 1.10.1
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ version: 1.10.1
53
+ - !ruby/object:Gem::Dependency
54
+ name: rake
55
+ requirement: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - "~>"
58
+ - !ruby/object:Gem::Version
59
+ version: 10.0.0
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: 10.0.0
63
+ type: :development
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - "~>"
68
+ - !ruby/object:Gem::Version
69
+ version: 10.0.0
70
+ - - ">="
71
+ - !ruby/object:Gem::Version
72
+ version: 10.0.0
73
+ description: ''
74
+ email:
75
+ - stefano@gild.com
76
+ executables: []
77
+ extensions: []
78
+ extra_rdoc_files: []
79
+ files:
80
+ - lib/corm.rb
81
+ - lib/corm/model.rb
82
+ homepage: https://github.com/stefanofontanelli/corm
83
+ licenses: []
84
+ metadata: {}
85
+ post_install_message:
86
+ rdoc_options: []
87
+ require_paths:
88
+ - lib
89
+ required_ruby_version: !ruby/object:Gem::Requirement
90
+ requirements:
91
+ - - ">="
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
94
+ required_rubygems_version: !ruby/object:Gem::Requirement
95
+ requirements:
96
+ - - ">="
97
+ - !ruby/object:Gem::Version
98
+ version: '0'
99
+ requirements: []
100
+ rubyforge_project:
101
+ rubygems_version: 2.2.2
102
+ signing_key:
103
+ specification_version: 4
104
+ summary: Very basic Cassandrea ORM which is rails-deps-free
105
+ test_files: []
106
+ has_rdoc: