rollerskates 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.
- checksums.yaml +4 -4
- data/.rubocop.yml +0 -1
- data/README.md +31 -4
- data/db/app.db +0 -0
- data/lib/rollerskates/base_model.rb +32 -85
- data/lib/rollerskates/orm/associable.rb +20 -0
- data/lib/rollerskates/orm/helpers/database_table_helper.rb +76 -0
- data/lib/rollerskates/orm/helpers/query_helper.rb +107 -0
- data/lib/rollerskates/orm/query_builder.rb +87 -0
- data/lib/rollerskates/version.rb +1 -1
- data/rollerskates.gemspec +6 -4
- metadata +31 -14
- data/lib/rollerskates/helpers/model_helper.rb +0 -92
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 290bc3701e17c3951d3f2c07064d3323e54508bc
|
4
|
+
data.tar.gz: 3b89ebea759281b73d0aa902325251a15e060440
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 811a08e65001fec6c57d71bec7aa857d57cc910b25e1c5288e4dd9a3f4f5af68d0693415165dae414ec8d31687469fd093fef98fe1044fa0b120d3e2ff0d9f6a
|
7
|
+
data.tar.gz: 4c3f6fe6477224e872393a1a5875952df243e41c37273082f6a09fd28ac5d3388ec17813f8ddc848685efaf20da33269b2463869f44e70c2bdfd35e9fd6c61e7
|
data/.rubocop.yml
CHANGED
data/README.md
CHANGED
@@ -36,7 +36,7 @@ app_name
|
|
36
36
|
| └─── routes.rb
|
37
37
|
| └───application.rb
|
38
38
|
└───db
|
39
|
-
| └───
|
39
|
+
| └───app.db
|
40
40
|
└───config.ru
|
41
41
|
```
|
42
42
|
|
@@ -57,10 +57,13 @@ Allow your application class to inherit form `Rollerskates::Application` class
|
|
57
57
|
Set up your routes this way:
|
58
58
|
|
59
59
|
```ruby
|
60
|
-
|
60
|
+
APP_ROOT = __dir__
|
61
|
+
require_relative "./config/application.rb"
|
61
62
|
TodoApplication = Todolist::Application.new
|
63
|
+
use Rack::Reloader, 0
|
62
64
|
use Rack::MethodOverride
|
63
|
-
|
65
|
+
require_relative "./config/routes.rb"
|
66
|
+
use Rack::Static, urls: ["/css", "/js", "/fonts"], root: "/app/assets"
|
64
67
|
run TodoApplication
|
65
68
|
```
|
66
69
|
|
@@ -104,10 +107,30 @@ class Item < Rollerskates::BaseRecord
|
|
104
107
|
property :status, type: :boolean, nullable: false
|
105
108
|
|
106
109
|
create_table
|
110
|
+
belongs_to :user
|
111
|
+
has_many :product
|
112
|
+
|
113
|
+
def self.recent
|
114
|
+
order("id DESC").limit(5)
|
115
|
+
end
|
107
116
|
end
|
108
117
|
```
|
109
118
|
Rolletskates automatically adds the `id, created_at and updated_at` fields and thus need not to be specified in the model. Other properties, however should be specified as above.
|
110
119
|
|
120
|
+
You can make use of associations with the rollerskates framework. Also, you can chain methods to a degree. Rollerskates ORM can accommodate chaining such as:
|
121
|
+
> `select(:prop1, :prop2, :prop3)`
|
122
|
+
>
|
123
|
+
> `where(prop2: "Value")`
|
124
|
+
>
|
125
|
+
> `order("prop DESC")`
|
126
|
+
>
|
127
|
+
> `limit(5)`
|
128
|
+
|
129
|
+
And combinations such as:
|
130
|
+
> `select(:id, :name).where(status: "active").limit(5)`
|
131
|
+
|
132
|
+
NB: Unlike Rails, `Rollerskates` uses sigular expression for both `has_many` and `belongs_to`
|
133
|
+
|
111
134
|
### Views
|
112
135
|
|
113
136
|
```
|
@@ -116,9 +139,13 @@ Rolletskates automatically adds the `id, created_at and updated_at` fields and t
|
|
116
139
|
| └───items
|
117
140
|
| |____ new.erb
|
118
141
|
| |____ show.erb
|
142
|
+
|───────layouts
|
143
|
+
| |____ application.erb
|
119
144
|
|
120
145
|
```
|
121
|
-
Files in the view folder should be organized according to the controller and action name.
|
146
|
+
Files in the view folder should be organized according to the controller and action name. Instance variables declared in the respective controller action are available to your view.
|
147
|
+
|
148
|
+
The views make use of a layouts. You can abstract common elements in all your views to the `views/layouts/application.erb` file.
|
122
149
|
## Testing
|
123
150
|
|
124
151
|
The tests could be run automatically by using
|
data/db/app.db
CHANGED
Binary file
|
@@ -1,116 +1,63 @@
|
|
1
|
-
require "rollerskates/helpers/
|
1
|
+
require "rollerskates/orm/helpers/database_table_helper"
|
2
|
+
require "rollerskates/orm/associable"
|
3
|
+
require "rollerskates/orm/query_builder"
|
2
4
|
|
3
5
|
module Rollerskates
|
4
|
-
class BaseModel
|
6
|
+
class BaseModel
|
7
|
+
extend Rollerskates::Associable
|
8
|
+
extend Rollerskates::DatabaseTableHelper
|
9
|
+
|
5
10
|
def initialize(values = {})
|
6
11
|
hash_to_properties(values) unless values.empty?
|
7
12
|
end
|
8
13
|
|
9
|
-
def hash_to_properties(hash)
|
10
|
-
hash.each do |column, value|
|
11
|
-
instance_variable_set("@#{column}", value)
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
def update(hash)
|
16
|
-
hash_to_properties(hash)
|
17
|
-
@updated_at = Time.now.to_s
|
18
|
-
end
|
19
|
-
|
20
14
|
def save
|
21
|
-
|
22
|
-
if id
|
23
|
-
database.execute(update_query, values_for_update)
|
24
|
-
else
|
25
|
-
add_created_at_and_updated_at
|
26
|
-
database.execute "INSERT INTO #{table_name} (#{@columns.join(', ')})\
|
27
|
-
VALUES (#{@placeholders.join(', ')})", @values
|
28
|
-
end
|
15
|
+
self.class.query.build(to_hash).save
|
29
16
|
end
|
30
17
|
|
31
|
-
def
|
32
|
-
|
33
|
-
placeholders.join(", ")
|
18
|
+
def self.find(value)
|
19
|
+
query.where({ id: value }, true)
|
34
20
|
end
|
35
21
|
|
36
|
-
def
|
37
|
-
|
38
|
-
end
|
39
|
-
|
40
|
-
def create_columns_placeholders_values
|
41
|
-
@model = self
|
42
|
-
@columns = []
|
43
|
-
@placeholders = []
|
44
|
-
@values = []
|
45
|
-
|
46
|
-
all_columns.each do |column|
|
47
|
-
value = @model.send(column)
|
48
|
-
next unless value
|
49
|
-
@columns << column.to_s
|
50
|
-
@placeholders << "?"
|
51
|
-
@values << value
|
52
|
-
end
|
22
|
+
def self.find_by(find_conditions)
|
23
|
+
query.where(find_conditions, true)
|
53
24
|
end
|
54
25
|
|
55
|
-
def
|
56
|
-
|
57
|
-
@placeholders << ["?", "?"]
|
58
|
-
@values << [Time.now.to_s, Time.now.to_s]
|
26
|
+
def self.last(number = nil)
|
27
|
+
query.order("id DESC").first(number)
|
59
28
|
end
|
60
29
|
|
61
|
-
def self.create(
|
62
|
-
|
30
|
+
def self.create(create_parameters)
|
31
|
+
query.build(create_parameters).save
|
63
32
|
end
|
64
33
|
|
65
34
|
def self.all
|
66
|
-
|
67
|
-
FROM #{table_name}"
|
68
|
-
data.map do |row|
|
69
|
-
row_to_object(row)
|
70
|
-
end
|
71
|
-
end
|
72
|
-
|
73
|
-
def self.count
|
74
|
-
data = database.execute "SELECT COUNT(*) FROM #{table_name}"
|
75
|
-
data.flatten.first
|
35
|
+
query
|
76
36
|
end
|
77
37
|
|
78
|
-
def self.
|
79
|
-
|
80
|
-
FROM #{table_name} ORDER BY id ASC LIMIT 1"
|
81
|
-
row_to_object(data.flatten)
|
38
|
+
def self.query
|
39
|
+
Rollerskates::QueryBuilder.new self
|
82
40
|
end
|
83
41
|
|
84
|
-
def self.
|
85
|
-
|
86
|
-
FROM #{table_name} ORDER BY id DESC LIMIT 1"
|
87
|
-
row_to_object(data.flatten)
|
42
|
+
def self.method_missing(method, *args, &block)
|
43
|
+
query.send(method, *args, &block)
|
88
44
|
end
|
89
45
|
|
90
|
-
|
91
|
-
data = database.execute "SELECT #{all_columns.join(', ')}\
|
92
|
-
FROM #{table_name} WHERE id = ?", id
|
93
|
-
row_to_object data.flatten
|
94
|
-
end
|
95
|
-
|
96
|
-
def destroy
|
97
|
-
database.execute "DELETE FROM #{table_name} WHERE id = ?", id
|
98
|
-
end
|
46
|
+
private
|
99
47
|
|
100
|
-
def
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
def self.destroy_all
|
105
|
-
database.execute "DELETE FROM #{table_name}"
|
48
|
+
def hash_to_properties(hash)
|
49
|
+
hash.each do |column, value|
|
50
|
+
instance_variable_set("@#{column}", value)
|
51
|
+
end
|
106
52
|
end
|
107
53
|
|
108
|
-
def
|
109
|
-
|
110
|
-
|
111
|
-
|
54
|
+
def to_hash
|
55
|
+
hashed_object = {}
|
56
|
+
instance_variables.each do |property|
|
57
|
+
hashed_object[property[1..-1].to_sym] =
|
58
|
+
instance_variable_get(property.to_s)
|
112
59
|
end
|
113
|
-
|
60
|
+
hashed_object
|
114
61
|
end
|
115
62
|
end
|
116
63
|
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Rollerskates
|
2
|
+
module Associable
|
3
|
+
def belongs_to(table)
|
4
|
+
parent_model = table.to_s.camelize.constantize
|
5
|
+
define_method(table) do
|
6
|
+
parent_model.find_by(id: send("#{table}_id"))
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
def has_many(table)
|
11
|
+
child_model = table.to_s.camelize.constantize
|
12
|
+
child_table = table.to_s.pluralize
|
13
|
+
parent_model = model_name.to_s.downcase
|
14
|
+
define_method(child_table) do
|
15
|
+
column = "#{parent_model}_id"
|
16
|
+
child_model.where(column => id)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
require "sqlite3"
|
2
|
+
|
3
|
+
module Rollerskates
|
4
|
+
module DatabaseTableHelper
|
5
|
+
def table_name
|
6
|
+
to_s.downcase.pluralize
|
7
|
+
end
|
8
|
+
|
9
|
+
def database
|
10
|
+
@db ||= SQLite3::Database.new File.join("db", "app.db")
|
11
|
+
end
|
12
|
+
|
13
|
+
def model_name
|
14
|
+
to_s.downcase
|
15
|
+
end
|
16
|
+
|
17
|
+
def all_columns
|
18
|
+
columns = database.prepare "SELECT * FROM #{table_name}"
|
19
|
+
columns.columns.map(&:to_sym)
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def add_property(property)
|
25
|
+
@properties ||= [
|
26
|
+
"id integer PRIMARY KEY AUTOINCREMENT",
|
27
|
+
"created_at datetime NOT NULL",
|
28
|
+
"updated_at datetime NOT NULL"
|
29
|
+
]
|
30
|
+
@properties << property
|
31
|
+
end
|
32
|
+
|
33
|
+
def property(field, options)
|
34
|
+
add_property "#{field} #{parse_constraints(options)}"
|
35
|
+
end
|
36
|
+
|
37
|
+
def create_table
|
38
|
+
query = "CREATE TABLE IF NOT EXISTS #{table_name}\
|
39
|
+
(#{@properties.join(', ')})"
|
40
|
+
database.execute(query)
|
41
|
+
|
42
|
+
all_columns.each { |var| attr_accessor var }
|
43
|
+
end
|
44
|
+
|
45
|
+
def parse_constraints(constraints)
|
46
|
+
attributes = ""
|
47
|
+
constraints.each do |attr, value|
|
48
|
+
attributes += send(attr.to_s, value)
|
49
|
+
end
|
50
|
+
|
51
|
+
attributes
|
52
|
+
end
|
53
|
+
|
54
|
+
def type(value)
|
55
|
+
"#{value.to_s.upcase} "
|
56
|
+
end
|
57
|
+
|
58
|
+
def primary_key(value)
|
59
|
+
return "PRIMARY KEY " if value
|
60
|
+
" "
|
61
|
+
end
|
62
|
+
|
63
|
+
def nullable(value)
|
64
|
+
return "NOT NULL " if value
|
65
|
+
"NULL "
|
66
|
+
end
|
67
|
+
|
68
|
+
def default(value)
|
69
|
+
"DEFAULT `#{value}` "
|
70
|
+
end
|
71
|
+
|
72
|
+
def auto_increment(value)
|
73
|
+
"AUTOINCREMENT " if value
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
@@ -0,0 +1,107 @@
|
|
1
|
+
module Rollerskates
|
2
|
+
module QueryHelper
|
3
|
+
private
|
4
|
+
|
5
|
+
def table_name
|
6
|
+
@model.table_name
|
7
|
+
end
|
8
|
+
|
9
|
+
def database
|
10
|
+
@model.database
|
11
|
+
end
|
12
|
+
|
13
|
+
def query_statement
|
14
|
+
sql = "#{select_phrase} #{from_phrase}"
|
15
|
+
sql << where_phrase unless @columns.empty?
|
16
|
+
sql << order_phrase if @order
|
17
|
+
sql << limit_phrase if @limit
|
18
|
+
sql << offset_phrase if @offset
|
19
|
+
|
20
|
+
sql
|
21
|
+
end
|
22
|
+
|
23
|
+
def create_columns
|
24
|
+
@create_parameters[:created_at] = Time.now.to_s
|
25
|
+
@create_parameters[:updated_at] = Time.now.to_s
|
26
|
+
@create_parameters.keys.map { |column| "'#{column}'" }.join(", ")
|
27
|
+
end
|
28
|
+
|
29
|
+
def create_values
|
30
|
+
@create_parameters.values.map { |value| "'#{value}'" }.join(", ")
|
31
|
+
end
|
32
|
+
|
33
|
+
def update_values
|
34
|
+
@update_parameters[:updated_at] = Time.now.to_s
|
35
|
+
@update_parameters.map { |key, value| "#{key}" << " = '#{value}'" }
|
36
|
+
end
|
37
|
+
|
38
|
+
def select_phrase
|
39
|
+
if @count
|
40
|
+
"SELECT COUNT (*)"
|
41
|
+
elsif @select
|
42
|
+
"SELECT #{@select.flatten.join(', ')} "
|
43
|
+
else
|
44
|
+
"SELECT * "
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def from_phrase
|
49
|
+
"FROM #{table_name}"
|
50
|
+
end
|
51
|
+
|
52
|
+
def where_phrase
|
53
|
+
string = []
|
54
|
+
@columns.uniq.each do |col|
|
55
|
+
string << col.map { |key, value| "#{key}" << " = '#{value}'" }
|
56
|
+
end
|
57
|
+
" WHERE #{string.join(' AND ')}" unless @columns.empty?
|
58
|
+
end
|
59
|
+
|
60
|
+
def order_phrase
|
61
|
+
" ORDER BY #{@order}" if @order
|
62
|
+
end
|
63
|
+
|
64
|
+
def limit_phrase
|
65
|
+
" LIMIT #{@limit}" if @limit
|
66
|
+
end
|
67
|
+
|
68
|
+
def offset_phrase
|
69
|
+
" OFFSET #{@offset}" if @offset
|
70
|
+
end
|
71
|
+
|
72
|
+
def execute
|
73
|
+
sql = @query ? @query : query_statement
|
74
|
+
@result = database.execute sql
|
75
|
+
end
|
76
|
+
|
77
|
+
def data
|
78
|
+
execute unless @result
|
79
|
+
@data ||= if @type == :collection
|
80
|
+
@result.map { |row| row_to_object(row) }
|
81
|
+
elsif @type == :object
|
82
|
+
row_to_object(@result.flatten)
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
def method_missing(method, *_args)
|
87
|
+
if block_given?
|
88
|
+
data.each { |object| yield object }
|
89
|
+
return true
|
90
|
+
end
|
91
|
+
data.send(method)
|
92
|
+
end
|
93
|
+
|
94
|
+
def columns
|
95
|
+
all_columns = database.prepare query_statement
|
96
|
+
all_columns.columns.map(&:to_sym)
|
97
|
+
end
|
98
|
+
|
99
|
+
def row_to_object(row)
|
100
|
+
model_object = @model.new
|
101
|
+
columns.each_with_index do |attribute, index|
|
102
|
+
model_object.send("#{attribute}=", row[index])
|
103
|
+
end
|
104
|
+
model_object
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
@@ -0,0 +1,87 @@
|
|
1
|
+
require "rollerskates/orm/helpers/query_helper"
|
2
|
+
|
3
|
+
module Rollerskates
|
4
|
+
class QueryBuilder
|
5
|
+
include Rollerskates::QueryHelper
|
6
|
+
|
7
|
+
def initialize(model)
|
8
|
+
@model = model
|
9
|
+
@columns = []
|
10
|
+
@type = :collection
|
11
|
+
end
|
12
|
+
|
13
|
+
def select(*select_conditions)
|
14
|
+
@select = select_conditions
|
15
|
+
self
|
16
|
+
end
|
17
|
+
|
18
|
+
def where(where_conditions, object = nil)
|
19
|
+
if object
|
20
|
+
@type = :object
|
21
|
+
limit(1)
|
22
|
+
end
|
23
|
+
|
24
|
+
@columns << where_conditions
|
25
|
+
self
|
26
|
+
end
|
27
|
+
|
28
|
+
def first(number = nil)
|
29
|
+
@type = :object unless number
|
30
|
+
number ? limit(number) : limit(1)
|
31
|
+
end
|
32
|
+
|
33
|
+
def limit(limit_condition = nil)
|
34
|
+
@limit = limit_condition if limit_condition
|
35
|
+
self
|
36
|
+
end
|
37
|
+
|
38
|
+
def offset(offset_condition)
|
39
|
+
@offset = offset_condition if offset_condition
|
40
|
+
self
|
41
|
+
end
|
42
|
+
|
43
|
+
def order(order_conditions)
|
44
|
+
@order = order_conditions.to_s
|
45
|
+
self
|
46
|
+
end
|
47
|
+
|
48
|
+
def count
|
49
|
+
@count = true
|
50
|
+
execute
|
51
|
+
@result.flatten[0].to_i
|
52
|
+
end
|
53
|
+
|
54
|
+
def update(update_parameters)
|
55
|
+
@update_parameters = update_parameters
|
56
|
+
@query = "UPDATE #{table_name} SET \
|
57
|
+
#{update_values.join(', ')} WHERE id = #{id}"
|
58
|
+
self
|
59
|
+
end
|
60
|
+
|
61
|
+
def build(create_parameters)
|
62
|
+
@create_parameters = create_parameters
|
63
|
+
@query = "INSERT INTO #{table_name} (#{create_columns})\
|
64
|
+
VALUES (#{create_values})"
|
65
|
+
self
|
66
|
+
end
|
67
|
+
|
68
|
+
def destroy(item_id = nil)
|
69
|
+
index = item_id ? item_id : id
|
70
|
+
@query = "DELETE FROM #{table_name} WHERE id = #{index}"
|
71
|
+
execute
|
72
|
+
self
|
73
|
+
end
|
74
|
+
|
75
|
+
def destroy_all
|
76
|
+
@query = "DELETE FROM #{table_name}"
|
77
|
+
execute
|
78
|
+
self
|
79
|
+
end
|
80
|
+
|
81
|
+
def save
|
82
|
+
@type = :object
|
83
|
+
execute
|
84
|
+
data
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
data/lib/rollerskates/version.rb
CHANGED
data/rollerskates.gemspec
CHANGED
@@ -30,10 +30,12 @@ Gem::Specification.new do |spec|
|
|
30
30
|
spec.add_development_dependency "bundler", "~> 1.9"
|
31
31
|
spec.add_development_dependency "rake", "~> 10.0"
|
32
32
|
spec.add_development_dependency "rspec", "~> 3.0"
|
33
|
-
spec.add_development_dependency "coveralls"
|
34
|
-
spec.add_development_dependency "capybara"
|
33
|
+
spec.add_development_dependency "coveralls", "~> 0"
|
34
|
+
spec.add_development_dependency "capybara", "~> 2.6"
|
35
35
|
|
36
36
|
spec.add_runtime_dependency "rack", "~> 1.0"
|
37
|
-
spec.add_runtime_dependency "tilt"
|
38
|
-
spec.add_runtime_dependency "
|
37
|
+
spec.add_runtime_dependency "tilt", "~> 0"
|
38
|
+
spec.add_runtime_dependency "pry", "~> 0"
|
39
|
+
spec.add_runtime_dependency "sqlite3", "~> 1.3.11"
|
40
|
+
|
39
41
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rollerskates
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Femi Senjobi
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-06-
|
11
|
+
date: 2016-06-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -56,30 +56,30 @@ dependencies:
|
|
56
56
|
name: coveralls
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- - "
|
59
|
+
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
61
|
version: '0'
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- - "
|
66
|
+
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: capybara
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
|
-
- - "
|
73
|
+
- - "~>"
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version: '
|
75
|
+
version: '2.6'
|
76
76
|
type: :development
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
|
-
- - "
|
80
|
+
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version: '
|
82
|
+
version: '2.6'
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
84
|
name: rack
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -98,30 +98,44 @@ dependencies:
|
|
98
98
|
name: tilt
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
100
100
|
requirements:
|
101
|
-
- - "
|
101
|
+
- - "~>"
|
102
102
|
- !ruby/object:Gem::Version
|
103
103
|
version: '0'
|
104
104
|
type: :runtime
|
105
105
|
prerelease: false
|
106
106
|
version_requirements: !ruby/object:Gem::Requirement
|
107
107
|
requirements:
|
108
|
-
- - "
|
108
|
+
- - "~>"
|
109
109
|
- !ruby/object:Gem::Version
|
110
110
|
version: '0'
|
111
111
|
- !ruby/object:Gem::Dependency
|
112
|
-
name:
|
112
|
+
name: pry
|
113
113
|
requirement: !ruby/object:Gem::Requirement
|
114
114
|
requirements:
|
115
|
-
- - "
|
115
|
+
- - "~>"
|
116
116
|
- !ruby/object:Gem::Version
|
117
117
|
version: '0'
|
118
118
|
type: :runtime
|
119
119
|
prerelease: false
|
120
120
|
version_requirements: !ruby/object:Gem::Requirement
|
121
121
|
requirements:
|
122
|
-
- - "
|
122
|
+
- - "~>"
|
123
123
|
- !ruby/object:Gem::Version
|
124
124
|
version: '0'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: sqlite3
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - "~>"
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: 1.3.11
|
132
|
+
type: :runtime
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - "~>"
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: 1.3.11
|
125
139
|
description: This is a ruby MVC framework to speed up development time.
|
126
140
|
email:
|
127
141
|
- femi.senjobi@andela.com
|
@@ -148,7 +162,10 @@ files:
|
|
148
162
|
- lib/rollerskates/base_controller.rb
|
149
163
|
- lib/rollerskates/base_model.rb
|
150
164
|
- lib/rollerskates/dependencies.rb
|
151
|
-
- lib/rollerskates/
|
165
|
+
- lib/rollerskates/orm/associable.rb
|
166
|
+
- lib/rollerskates/orm/helpers/database_table_helper.rb
|
167
|
+
- lib/rollerskates/orm/helpers/query_helper.rb
|
168
|
+
- lib/rollerskates/orm/query_builder.rb
|
152
169
|
- lib/rollerskates/routing/mapper.rb
|
153
170
|
- lib/rollerskates/routing/route.rb
|
154
171
|
- lib/rollerskates/routing/router.rb
|
@@ -1,92 +0,0 @@
|
|
1
|
-
require "sqlite3"
|
2
|
-
|
3
|
-
module Rollerskates
|
4
|
-
class ModelHelper
|
5
|
-
class << self; attr_accessor :properties, :db; end
|
6
|
-
|
7
|
-
def database
|
8
|
-
@db ||= SQLite3::Database.new File.join("db", "app.db")
|
9
|
-
end
|
10
|
-
|
11
|
-
def add_property(property)
|
12
|
-
self.class.properties ||= [
|
13
|
-
"id integer PRIMARY KEY AUTOINCREMENT",
|
14
|
-
"created_at datetime NOT NULL",
|
15
|
-
"updated_at datetime NOT NULL"
|
16
|
-
]
|
17
|
-
self.class.properties << property
|
18
|
-
end
|
19
|
-
|
20
|
-
def self.property(field, options)
|
21
|
-
new.add_property "#{field} #{parse_constraints(options)}"
|
22
|
-
end
|
23
|
-
|
24
|
-
def self.create_table
|
25
|
-
query = "CREATE TABLE IF NOT EXISTS #{table_name}\
|
26
|
-
(#{properties.join(', ')})"
|
27
|
-
database.execute(query)
|
28
|
-
|
29
|
-
all_columns.each { |var| attr_accessor var }
|
30
|
-
end
|
31
|
-
|
32
|
-
def self.parse_constraints(constraints)
|
33
|
-
attributes = ""
|
34
|
-
constraints.each do |attr, value|
|
35
|
-
attributes += send(attr.to_s, value)
|
36
|
-
end
|
37
|
-
|
38
|
-
attributes
|
39
|
-
end
|
40
|
-
|
41
|
-
def self.type(value)
|
42
|
-
"#{value.to_s.upcase} "
|
43
|
-
end
|
44
|
-
|
45
|
-
def self.primary_key(value)
|
46
|
-
return "PRIMARY KEY " if value
|
47
|
-
" "
|
48
|
-
end
|
49
|
-
|
50
|
-
def self.nullable(value)
|
51
|
-
return "NOT NULL " if value
|
52
|
-
"NULL "
|
53
|
-
end
|
54
|
-
|
55
|
-
def self.default(value)
|
56
|
-
"DEFAULT `#{value}` "
|
57
|
-
end
|
58
|
-
|
59
|
-
def self.auto_increment(value)
|
60
|
-
"AUTOINCREMENT " if value
|
61
|
-
end
|
62
|
-
|
63
|
-
def update_query
|
64
|
-
"UPDATE #{table_name} SET #{placeholders_for_update} WHERE id = ?"
|
65
|
-
end
|
66
|
-
|
67
|
-
def table_name
|
68
|
-
self.class.to_s.downcase.pluralize
|
69
|
-
end
|
70
|
-
|
71
|
-
def model_name
|
72
|
-
self.class
|
73
|
-
end
|
74
|
-
|
75
|
-
def self.method_missing(method, *args)
|
76
|
-
new.send(method, *args)
|
77
|
-
end
|
78
|
-
|
79
|
-
def all_columns
|
80
|
-
@all_columns ||= database.prepare "SELECT * FROM #{table_name}"
|
81
|
-
@all_columns.columns.map(&:to_sym)
|
82
|
-
end
|
83
|
-
|
84
|
-
def method_missing(method, *args)
|
85
|
-
@model.send(method, *args)
|
86
|
-
end
|
87
|
-
|
88
|
-
def self.all_columns
|
89
|
-
new.all_columns
|
90
|
-
end
|
91
|
-
end
|
92
|
-
end
|