bloc_record 0.0.0
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.
- checksums.yaml +7 -0
- data/README.md +28 -0
- data/bloc_record.gemspec +18 -0
- data/lib/bloc_record/associations.rb +39 -0
- data/lib/bloc_record/base.rb +26 -0
- data/lib/bloc_record/collection.rb +13 -0
- data/lib/bloc_record/connection.rb +7 -0
- data/lib/bloc_record/persistence.rb +115 -0
- data/lib/bloc_record/schema.rb +32 -0
- data/lib/bloc_record/selection.rb +199 -0
- data/lib/bloc_record/utility.rb +39 -0
- data/lib/bloc_record.rb +9 -0
- metadata +82 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: bbb82ba853b6d915d4868349bbc263eaec960c6e
|
4
|
+
data.tar.gz: d94682d9e695a4860f9926adf8b684779f983acd
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: f9aae1a6d31f0d23edf0e16f51857859dc99806bd38a021e3bb26248f8bf103a2f23bb00c66b12a98c5f0c3739f8495e6d96eee2895ec25c8a4adb1fe09e5a9d
|
7
|
+
data.tar.gz: 354f204cd1abfb07cbf3589834d28fab8bec0388775a77e70f80931c8d499a3ce13bb8d1cdf521081315bb37c9b1a156a3e87763bf21151e158dae1c21bfa409
|
data/README.md
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
(under construction)
|
2
|
+
|
3
|
+
How to use:
|
4
|
+
|
5
|
+
1) Clone and bundle install
|
6
|
+
|
7
|
+
2) Use with [AddressBlocWithDB](https://github.com/Bloc/address-bloc-with-db). It's already got the database ready to go. Then write a driver file like:
|
8
|
+
|
9
|
+
```ruby
|
10
|
+
require_relative 'models/address_book'
|
11
|
+
require_relative 'models/entry'
|
12
|
+
require 'bloc_record'
|
13
|
+
|
14
|
+
BlocRecord.connect_to("db/address_bloc.db")
|
15
|
+
|
16
|
+
AddressBook.create(name: "My Addressbook")
|
17
|
+
|
18
|
+
entry = Entry.new(name: "ben neely", phone: "208-350-8855", email: "Ben@bloc.io")
|
19
|
+
entry.save!
|
20
|
+
|
21
|
+
book = AddressBook.new
|
22
|
+
book.name = "BLAAAA"
|
23
|
+
book.save!
|
24
|
+
|
25
|
+
|
26
|
+
p Entry.find(entry.id)
|
27
|
+
p AddressBook.take(5)
|
28
|
+
```
|
data/bloc_record.gemspec
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
Gem::Specification.new do |s|
|
2
|
+
s.name = 'bloc_record'
|
3
|
+
s.version = '0.0.0'
|
4
|
+
s.date = '2015-12-02'
|
5
|
+
s.summary = 'An ActiveRecord-esque ORM adaptor'
|
6
|
+
s.description = 'An ActiveRecord-esque ORM adaptor'
|
7
|
+
s.authors = ['Ben Neely']
|
8
|
+
s.email = 'ben@bloc.io'
|
9
|
+
s.files = `git ls-files`.split($/)
|
10
|
+
s.executables = s.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
11
|
+
s.test_files = s.files.grep(%r{^(test|spec|features)/})
|
12
|
+
s.require_paths = ["lib"]
|
13
|
+
s.homepage =
|
14
|
+
'http://rubygems.org/gems/bloc_record'
|
15
|
+
s.license = 'MIT'
|
16
|
+
s.add_runtime_dependency 'sqlite3', '~> 1.3'
|
17
|
+
s.add_runtime_dependency 'activesupport'
|
18
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'sqlite3'
|
2
|
+
require 'active_support/inflector'
|
3
|
+
|
4
|
+
module Associations
|
5
|
+
def has_many(association)
|
6
|
+
self.send(:define_method, association) do
|
7
|
+
rows = self.class.connection.execute <<-SQL
|
8
|
+
SELECT * FROM #{association.to_s.singularize}
|
9
|
+
WHERE #{self.class.table}_id = #{self.id}
|
10
|
+
SQL
|
11
|
+
|
12
|
+
class_name = association.to_s.classify.constantize
|
13
|
+
collection = BlocRecord::Collection.new
|
14
|
+
|
15
|
+
rows.each do |row|
|
16
|
+
collection << class_name.new(Hash[class_name.columns.zip(row)])
|
17
|
+
end
|
18
|
+
|
19
|
+
collection
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def belongs_to(association)
|
24
|
+
self.send(:define_method, association) do
|
25
|
+
association_name = association.to_s
|
26
|
+
row = self.class.connection.get_first_row <<-SQL
|
27
|
+
SELECT * FROM #{association_name}
|
28
|
+
WHERE id = #{self.send(association_name + "_id")}
|
29
|
+
SQL
|
30
|
+
|
31
|
+
class_name = association_name.classify.constantize
|
32
|
+
|
33
|
+
if row
|
34
|
+
data = Hash[class_name.columns.zip(row)]
|
35
|
+
class_name.new(data)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'bloc_record/utility'
|
2
|
+
require 'bloc_record/schema'
|
3
|
+
require 'bloc_record/persistence'
|
4
|
+
require 'bloc_record/selection'
|
5
|
+
require 'bloc_record/connection'
|
6
|
+
require 'bloc_record/collection'
|
7
|
+
require 'bloc_record/associations'
|
8
|
+
|
9
|
+
module BlocRecord
|
10
|
+
class Base
|
11
|
+
include Persistence
|
12
|
+
extend Selection
|
13
|
+
extend Schema
|
14
|
+
extend Connection
|
15
|
+
extend Associations
|
16
|
+
|
17
|
+
def initialize(options={})
|
18
|
+
options = BlocRecord::Utility.convert_keys(options)
|
19
|
+
|
20
|
+
self.class.columns.each do |col|
|
21
|
+
self.class.send(:attr_accessor, col)
|
22
|
+
self.instance_variable_set("@#{col}", options[col])
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module BlocRecord
|
2
|
+
class Collection < Array
|
3
|
+
def update_all(updates)
|
4
|
+
ids = self.map(&:id)
|
5
|
+
self.any? ? self.first.class.update(ids, updates) : false
|
6
|
+
end
|
7
|
+
|
8
|
+
def group(*args)
|
9
|
+
ids = self.map(&:id)
|
10
|
+
self.any? ? self.first.class.group_by_ids(ids, args) : false
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,115 @@
|
|
1
|
+
require 'sqlite3'
|
2
|
+
require 'bloc_record/schema'
|
3
|
+
|
4
|
+
module Persistence
|
5
|
+
def self.included(base)
|
6
|
+
base.extend(ClassMethods)
|
7
|
+
end
|
8
|
+
|
9
|
+
module ClassMethods
|
10
|
+
def create(attrs)
|
11
|
+
attrs = BlocRecord::Utility.convert_keys(attrs)
|
12
|
+
attrs.delete "id"
|
13
|
+
vals = attributes.map { |key| BlocRecord::Utility.sql_strings(attrs[key]) }
|
14
|
+
|
15
|
+
connection.execute(
|
16
|
+
"INSERT INTO #{table} (#{attributes.join(",")}) VALUES (?)",
|
17
|
+
vals.join(",")
|
18
|
+
)
|
19
|
+
|
20
|
+
data = Hash[attributes.zip attrs.values]
|
21
|
+
data["id"] = connection.execute("SELECT last_insert_rowid();")[0][0]
|
22
|
+
new(data)
|
23
|
+
end
|
24
|
+
|
25
|
+
def update(ids, updates)
|
26
|
+
updates = BlocRecord::Utility.convert_keys(updates)
|
27
|
+
updates.delete "id"
|
28
|
+
updates_array = updates.keys.map { |key| "#{key} = ?" }
|
29
|
+
if ids.class == Fixnum
|
30
|
+
where_clause = "WHERE id = #{ids};"
|
31
|
+
elsif ids.class == Array
|
32
|
+
where_clause = ids.empty? ? ";" : "WHERE id IN (#{ids.join(",")});"
|
33
|
+
else
|
34
|
+
where_clause = ";"
|
35
|
+
end
|
36
|
+
|
37
|
+
connection.execute(
|
38
|
+
"UPDATE #{table} SET #{updates_array.join(", ")} #{where_clause}",
|
39
|
+
updates.values
|
40
|
+
)
|
41
|
+
|
42
|
+
true
|
43
|
+
end
|
44
|
+
|
45
|
+
def update_all(updates)
|
46
|
+
update(nil, updates)
|
47
|
+
end
|
48
|
+
|
49
|
+
def destroy(*id)
|
50
|
+
if id.length > 1
|
51
|
+
where_clause = "WHERE id IN (#{id.join(",")});"
|
52
|
+
else
|
53
|
+
where_clause = "WHERE id = #{id.first};"
|
54
|
+
end
|
55
|
+
|
56
|
+
connection.execute <<-SQL
|
57
|
+
DELETE FROM #{table} #{where_clause}
|
58
|
+
SQL
|
59
|
+
|
60
|
+
true
|
61
|
+
end
|
62
|
+
|
63
|
+
def destroy_all(conditions_hash=nil)
|
64
|
+
if conditions_hash && !conditions_hash.empty?
|
65
|
+
conditions_hash = BlocRecord::Utility.convert_keys(conditions_hash)
|
66
|
+
conditions = conditions_hash.keys.map { |key| "#{key} = ?" }.join(" and ")
|
67
|
+
|
68
|
+
connection.execute(
|
69
|
+
"DELETE FROM #{table} WHERE #{conditions};",
|
70
|
+
conditions_hash.values
|
71
|
+
)
|
72
|
+
else
|
73
|
+
connection.execute <<-SQL
|
74
|
+
DELETE FROM #{table}
|
75
|
+
SQL
|
76
|
+
end
|
77
|
+
|
78
|
+
true
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
def save!
|
83
|
+
unless self.id
|
84
|
+
self.id = self.class.create(BlocRecord::Utility.instance_variables_to_hash(self)).id
|
85
|
+
BlocRecord::Utility.reload_obj(self)
|
86
|
+
return true
|
87
|
+
end
|
88
|
+
|
89
|
+
fields = self.class.attributes.map { |col| "#{col}=#{BlocRecord::Utility.sql_strings(self.instance_variable_get("@#{col}"))}" }.join(",")
|
90
|
+
|
91
|
+
self.class.connection.execute <<-SQL
|
92
|
+
UPDATE #{self.class.table}
|
93
|
+
SET #{fields}
|
94
|
+
WHERE id = #{self.id};
|
95
|
+
SQL
|
96
|
+
|
97
|
+
true
|
98
|
+
end
|
99
|
+
|
100
|
+
def save
|
101
|
+
self.save! rescue false
|
102
|
+
end
|
103
|
+
|
104
|
+
def update_attribute(attribute, value)
|
105
|
+
self.class.update(self.id, { attribute => value })
|
106
|
+
end
|
107
|
+
|
108
|
+
def update_attributes(updates)
|
109
|
+
self.class.update(self.id, updates)
|
110
|
+
end
|
111
|
+
|
112
|
+
def destroy
|
113
|
+
self.class.destroy(self.id)
|
114
|
+
end
|
115
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'sqlite3'
|
2
|
+
require 'bloc_record/utility'
|
3
|
+
|
4
|
+
module Schema
|
5
|
+
def table
|
6
|
+
BlocRecord::Utility.underscore(name)
|
7
|
+
end
|
8
|
+
|
9
|
+
def columns
|
10
|
+
schema.keys
|
11
|
+
end
|
12
|
+
|
13
|
+
def attributes
|
14
|
+
columns - ["id"]
|
15
|
+
end
|
16
|
+
|
17
|
+
def schema
|
18
|
+
unless @schema
|
19
|
+
@schema = {}
|
20
|
+
connection.table_info(table) do |col|
|
21
|
+
@schema[col["name"]] = col["type"]
|
22
|
+
end
|
23
|
+
end
|
24
|
+
@schema
|
25
|
+
end
|
26
|
+
|
27
|
+
def count
|
28
|
+
connection.execute(<<-SQL)[0][0]
|
29
|
+
SELECT COUNT(*) FROM #{table}
|
30
|
+
SQL
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,199 @@
|
|
1
|
+
require 'sqlite3'
|
2
|
+
|
3
|
+
module Selection
|
4
|
+
def find(*ids)
|
5
|
+
|
6
|
+
if ids.length == 1
|
7
|
+
find_one(ids.first)
|
8
|
+
else
|
9
|
+
rows = connection.execute <<-SQL
|
10
|
+
SELECT #{columns.join ","} FROM #{table}
|
11
|
+
WHERE id IN (#{ids.join(",")});
|
12
|
+
SQL
|
13
|
+
|
14
|
+
rows_to_array(rows)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def find_one(id)
|
19
|
+
row = connection.get_first_row <<-SQL
|
20
|
+
SELECT #{columns.join ","} FROM #{table}
|
21
|
+
WHERE id = #{id};
|
22
|
+
SQL
|
23
|
+
|
24
|
+
init_object_from_row(row)
|
25
|
+
end
|
26
|
+
|
27
|
+
def find_by(attribute, value)
|
28
|
+
row = connection.get_first_row(
|
29
|
+
"SELECT #{columns.join ","} FROM #{table} WHERE #{attribute} = ?;",
|
30
|
+
BlocRecord::Utility.sql_strings(value)
|
31
|
+
)
|
32
|
+
|
33
|
+
init_object_from_row(row)
|
34
|
+
end
|
35
|
+
|
36
|
+
def take(num=1)
|
37
|
+
if num > 1
|
38
|
+
rows = connection.execute(
|
39
|
+
"SELECT #{columns.join ","} FROM #{table} ORDER BY random() LIMIT ?;",
|
40
|
+
num
|
41
|
+
)
|
42
|
+
|
43
|
+
rows_to_array(rows)
|
44
|
+
else
|
45
|
+
take_one
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def take_one
|
50
|
+
row = connection.get_first_row <<-SQL
|
51
|
+
SELECT #{columns.join ","} FROM #{table}
|
52
|
+
ORDER BY random()
|
53
|
+
LIMIT 1;
|
54
|
+
SQL
|
55
|
+
|
56
|
+
init_object_from_row(row)
|
57
|
+
end
|
58
|
+
|
59
|
+
def first
|
60
|
+
row = connection.get_first_row <<-SQL
|
61
|
+
SELECT #{columns.join ","} FROM #{table}
|
62
|
+
ORDER BY id
|
63
|
+
ASC LIMIT 1;
|
64
|
+
SQL
|
65
|
+
|
66
|
+
init_object_from_row(row)
|
67
|
+
end
|
68
|
+
|
69
|
+
def last
|
70
|
+
row = connection.get_first_row <<-SQL
|
71
|
+
SELECT #{columns.join ","} FROM #{table}
|
72
|
+
ORDER BY id
|
73
|
+
DESC LIMIT 1;
|
74
|
+
SQL
|
75
|
+
|
76
|
+
init_object_from_row(row)
|
77
|
+
end
|
78
|
+
|
79
|
+
def all
|
80
|
+
rows = connection.execute <<-SQL
|
81
|
+
SELECT #{columns.join ","} FROM #{table};
|
82
|
+
SQL
|
83
|
+
|
84
|
+
rows_to_array(rows)
|
85
|
+
end
|
86
|
+
|
87
|
+
def where(*args)
|
88
|
+
if args.count > 1
|
89
|
+
expression = args.shift
|
90
|
+
params = args
|
91
|
+
else
|
92
|
+
case args.first
|
93
|
+
when String
|
94
|
+
expression = "?"
|
95
|
+
params = args.first
|
96
|
+
when Hash
|
97
|
+
params = BlocRecord::Utility.convert_keys(args.first)
|
98
|
+
expression = params.keys.map {|key| "#{key}=:#{key}"}.join(" and ")
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
sql = <<-SQL
|
103
|
+
SELECT #{columns.join ","} FROM #{table}
|
104
|
+
WHERE #{expression};
|
105
|
+
SQL
|
106
|
+
|
107
|
+
rows = connection.execute(sql, params)
|
108
|
+
rows_to_array(rows)
|
109
|
+
end
|
110
|
+
|
111
|
+
def order(*args)
|
112
|
+
if args.count > 1
|
113
|
+
order = args.join(",")
|
114
|
+
else
|
115
|
+
order = args.first.to_s
|
116
|
+
end
|
117
|
+
rows = connection.execute(
|
118
|
+
"SELECT * FROM #{table} ORDER BY ?;",
|
119
|
+
order
|
120
|
+
)
|
121
|
+
rows_to_array(rows)
|
122
|
+
end
|
123
|
+
|
124
|
+
def join(*args)
|
125
|
+
if args.count > 1
|
126
|
+
joins = args.map { |arg| "INNER JOIN #{arg} ON #{arg}.#{table}_id = #{table}.id"}.join(" ")
|
127
|
+
rows = connection.execute <<-SQL
|
128
|
+
SELECT * FROM #{table} #{joins}
|
129
|
+
SQL
|
130
|
+
else
|
131
|
+
case args.first
|
132
|
+
when String
|
133
|
+
rows = connection.execute <<-SQL
|
134
|
+
SELECT * FROM #{table} #{BlocRecord::Utility.sql_strings(args.first)};
|
135
|
+
SQL
|
136
|
+
when Symbol
|
137
|
+
rows = connection.execute <<-SQL
|
138
|
+
SELECT * FROM #{table}
|
139
|
+
INNER JOIN #{args.first} ON #{args.first}.#{table}_id = #{table}.id
|
140
|
+
SQL
|
141
|
+
end
|
142
|
+
end
|
143
|
+
rows_to_array(rows)
|
144
|
+
end
|
145
|
+
|
146
|
+
def select(*fields)
|
147
|
+
rows = connection.execute(
|
148
|
+
"SELECT ? FROM #{table};",
|
149
|
+
fields.join(", ")
|
150
|
+
)
|
151
|
+
collection = BlocRecord::Collection.new
|
152
|
+
rows.each { |row| collection << new(Hash[fields.zip(row)]) }
|
153
|
+
collection
|
154
|
+
end
|
155
|
+
|
156
|
+
def limit(value, offset=0)
|
157
|
+
rows = connection.execute(
|
158
|
+
"SELECT * FROM #{table} LIMIT ? OFFSET ?;",
|
159
|
+
[value, offset]
|
160
|
+
)
|
161
|
+
rows_to_array(rows)
|
162
|
+
end
|
163
|
+
|
164
|
+
def group(*args)
|
165
|
+
group_by_ids(nil, args)
|
166
|
+
end
|
167
|
+
|
168
|
+
def group_by_ids(ids, args)
|
169
|
+
if args.count > 1
|
170
|
+
conditions = args.join(", ")
|
171
|
+
else
|
172
|
+
conditions = args.first
|
173
|
+
end
|
174
|
+
|
175
|
+
where_clause = ids.nil? ? "" : "WHERE id IN (#{ids.join(",")})"
|
176
|
+
|
177
|
+
rows = connection.execute(
|
178
|
+
"SELECT * FROM #{table} #{where_clause} GROUP BY ?;",
|
179
|
+
conditions.to_s
|
180
|
+
)
|
181
|
+
|
182
|
+
rows_to_array(rows)
|
183
|
+
end
|
184
|
+
|
185
|
+
private
|
186
|
+
|
187
|
+
def init_object_from_row(row)
|
188
|
+
if row
|
189
|
+
data = Hash[columns.zip(row)]
|
190
|
+
new(data)
|
191
|
+
end
|
192
|
+
end
|
193
|
+
|
194
|
+
def rows_to_array(rows)
|
195
|
+
collection = BlocRecord::Collection.new
|
196
|
+
rows.each { |row| collection << new(Hash[columns.zip(row)]) }
|
197
|
+
collection
|
198
|
+
end
|
199
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module BlocRecord
|
2
|
+
module Utility
|
3
|
+
extend self
|
4
|
+
|
5
|
+
def underscore(camel_cased_word)
|
6
|
+
string = camel_cased_word.gsub(/::/, '/')
|
7
|
+
string.gsub!(/([A-Z]+)([A-Z][a-z])/,'\1_\2')
|
8
|
+
string.gsub!(/([a-z\d])([A-Z])/,'\1_\2')
|
9
|
+
string.tr!("-", "_")
|
10
|
+
string.downcase
|
11
|
+
end
|
12
|
+
def sql_strings(value)
|
13
|
+
case value
|
14
|
+
when String
|
15
|
+
"'#{value}'"
|
16
|
+
when Numeric
|
17
|
+
value.to_s
|
18
|
+
else
|
19
|
+
"null"
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def convert_keys(options)
|
24
|
+
options.keys.each {|k| options[k.to_s] = options.delete(k) if k.kind_of?(Symbol)}
|
25
|
+
options
|
26
|
+
end
|
27
|
+
|
28
|
+
def instance_variables_to_hash(obj)
|
29
|
+
Hash[obj.instance_variables.map{ |var| ["#{var.to_s.delete('@')}", obj.instance_variable_get(var.to_s)]}]
|
30
|
+
end
|
31
|
+
|
32
|
+
def reload_obj(dirty_obj)
|
33
|
+
persisted_obj = dirty_obj.class.find_one(dirty_obj.id)
|
34
|
+
dirty_obj.instance_variables.each do |instance_variable|
|
35
|
+
dirty_obj.instance_variable_set(instance_variable, persisted_obj.instance_variable_get(instance_variable))
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
data/lib/bloc_record.rb
ADDED
metadata
ADDED
@@ -0,0 +1,82 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: bloc_record
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Ben Neely
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-12-02 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: sqlite3
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.3'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.3'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: activesupport
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
description: An ActiveRecord-esque ORM adaptor
|
42
|
+
email: ben@bloc.io
|
43
|
+
executables: []
|
44
|
+
extensions: []
|
45
|
+
extra_rdoc_files: []
|
46
|
+
files:
|
47
|
+
- README.md
|
48
|
+
- bloc_record.gemspec
|
49
|
+
- lib/bloc_record.rb
|
50
|
+
- lib/bloc_record/associations.rb
|
51
|
+
- lib/bloc_record/base.rb
|
52
|
+
- lib/bloc_record/collection.rb
|
53
|
+
- lib/bloc_record/connection.rb
|
54
|
+
- lib/bloc_record/persistence.rb
|
55
|
+
- lib/bloc_record/schema.rb
|
56
|
+
- lib/bloc_record/selection.rb
|
57
|
+
- lib/bloc_record/utility.rb
|
58
|
+
homepage: http://rubygems.org/gems/bloc_record
|
59
|
+
licenses:
|
60
|
+
- MIT
|
61
|
+
metadata: {}
|
62
|
+
post_install_message:
|
63
|
+
rdoc_options: []
|
64
|
+
require_paths:
|
65
|
+
- lib
|
66
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
67
|
+
requirements:
|
68
|
+
- - ">="
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
version: '0'
|
71
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
requirements: []
|
77
|
+
rubyforge_project:
|
78
|
+
rubygems_version: 2.4.6
|
79
|
+
signing_key:
|
80
|
+
specification_version: 4
|
81
|
+
summary: An ActiveRecord-esque ORM adaptor
|
82
|
+
test_files: []
|