hemp 1.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +19 -0
- data/.hound.yml +4 -0
- data/.rubocop.yml +233 -0
- data/CODE_OF_CONDUCT.md +13 -0
- data/Gemfile +4 -0
- data/LICENSE +21 -0
- data/README.md +256 -0
- data/Rakefile +6 -0
- data/bin/console +14 -0
- data/bin/setup +7 -0
- data/hemp.gemspec +45 -0
- data/lib/hemp.rb +5 -0
- data/lib/hemp/aliases.rb +13 -0
- data/lib/hemp/application.rb +59 -0
- data/lib/hemp/base_record.rb +96 -0
- data/lib/hemp/controller.rb +54 -0
- data/lib/hemp/dependencies.rb +10 -0
- data/lib/hemp/extensions/hash.rb +10 -0
- data/lib/hemp/extensions/object.rb +9 -0
- data/lib/hemp/orm/class_instance_vars.rb +21 -0
- data/lib/hemp/orm/database_error.rb +10 -0
- data/lib/hemp/orm/property.rb +49 -0
- data/lib/hemp/orm/record_interface.rb +99 -0
- data/lib/hemp/orm/sql_helper.rb +14 -0
- data/lib/hemp/routing/base.rb +83 -0
- data/lib/hemp/routing/route.rb +53 -0
- data/lib/hemp/routing/route_extensions.rb +22 -0
- data/lib/hemp/routing/route_split.rb +37 -0
- data/lib/hemp/routing/route_syntax_error.rb +10 -0
- data/lib/hemp/version.rb +3 -0
- metadata +217 -0
@@ -0,0 +1,83 @@
|
|
1
|
+
require "hemp/aliases"
|
2
|
+
|
3
|
+
module Hemp
|
4
|
+
module Routing
|
5
|
+
class Base
|
6
|
+
include Hemp::Aliases
|
7
|
+
include RouteExtensions
|
8
|
+
|
9
|
+
attr_reader :routes
|
10
|
+
|
11
|
+
SUPPORTED_VERB_LIST = %w(get delete patch post put).freeze
|
12
|
+
|
13
|
+
def initialize
|
14
|
+
@routes = {}
|
15
|
+
verb_helper SUPPORTED_VERB_LIST
|
16
|
+
end
|
17
|
+
|
18
|
+
def prepare(&block)
|
19
|
+
instance_eval(&block)
|
20
|
+
end
|
21
|
+
|
22
|
+
def verb_helper(verbs)
|
23
|
+
verbs.each do |verb|
|
24
|
+
self.class.
|
25
|
+
send(:define_method, verb) do |route_path, controller_hash|
|
26
|
+
hash_error(controller_hash) unless hash_valid? controller_hash
|
27
|
+
process_route_line verb, route_path, controller_hash[:to]
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def process_route_line(verb, route_path, controller_action)
|
33
|
+
handle_errors route_path, controller_action
|
34
|
+
route_args = parse_route_args(route_path.split("/"))
|
35
|
+
route_object = RouteAlias.new(controller_action, *route_args)
|
36
|
+
save_to_routes verb, route_object
|
37
|
+
end
|
38
|
+
|
39
|
+
def handle_errors(route_path, controller_action)
|
40
|
+
verify_route_path route_path
|
41
|
+
verify_controller_action controller_action
|
42
|
+
end
|
43
|
+
|
44
|
+
def verify_controller_action(controller_action)
|
45
|
+
error_constructor(
|
46
|
+
controller_action, "Controller action does not meet required pattern"
|
47
|
+
) if (controller_action =~ /^[a-zA-Z0-9_]+#[a-zA-Z0-9_]+$/).nil?
|
48
|
+
end
|
49
|
+
|
50
|
+
def verify_route_path(route_path)
|
51
|
+
error_constructor(
|
52
|
+
route_path, "Route should not be a blank string"
|
53
|
+
) if route_path.empty?
|
54
|
+
end
|
55
|
+
|
56
|
+
def parse_route_args(split_route_path)
|
57
|
+
route_split_helper = RouteSplitter.new(split_route_path)
|
58
|
+
|
59
|
+
route_split_helper.parse_regex_and_vars_from_route
|
60
|
+
end
|
61
|
+
|
62
|
+
def save_to_routes(verb, route_object)
|
63
|
+
routes[verb.to_sym] ||= []
|
64
|
+
routes[verb.to_sym] << route_object
|
65
|
+
end
|
66
|
+
|
67
|
+
def hash_error(controller_hash)
|
68
|
+
error_constructor(
|
69
|
+
controller_hash,
|
70
|
+
"Controller hash does not contain 'to' key"
|
71
|
+
)
|
72
|
+
end
|
73
|
+
|
74
|
+
def hash_valid?(controller_hash)
|
75
|
+
controller_hash.class == Hash && controller_hash.include?(:to)
|
76
|
+
end
|
77
|
+
|
78
|
+
def error_constructor(line, error_message)
|
79
|
+
raise RouteError.new line, error_message
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require "facets"
|
2
|
+
|
3
|
+
module Hemp
|
4
|
+
module Routing
|
5
|
+
class Route
|
6
|
+
attr_reader :controller_action, :regex_match, :url_variables
|
7
|
+
|
8
|
+
def initialize(controller_action, regex_match, url_variables = {})
|
9
|
+
@controller_action = controller_action.split("#")
|
10
|
+
@regex_match = regex_match
|
11
|
+
@url_variables = url_variables
|
12
|
+
end
|
13
|
+
|
14
|
+
def controller
|
15
|
+
@controller_action[0]
|
16
|
+
end
|
17
|
+
|
18
|
+
def action
|
19
|
+
@controller_action[1]
|
20
|
+
end
|
21
|
+
|
22
|
+
def controller_class
|
23
|
+
controller + "_controller"
|
24
|
+
end
|
25
|
+
|
26
|
+
def controller_camel
|
27
|
+
controller_class.camelcase :upper
|
28
|
+
end
|
29
|
+
|
30
|
+
def action_sym
|
31
|
+
action.to_sym
|
32
|
+
end
|
33
|
+
|
34
|
+
def controller_snake
|
35
|
+
controller_class.snakecase
|
36
|
+
end
|
37
|
+
|
38
|
+
def get_url_vars(path_info)
|
39
|
+
path_elements = path_info.split("/")
|
40
|
+
var_collection = {}
|
41
|
+
url_variables.each_key do |index|
|
42
|
+
var_collection[url_variables[index]] = path_elements[index]
|
43
|
+
end
|
44
|
+
|
45
|
+
var_collection
|
46
|
+
end
|
47
|
+
|
48
|
+
def ==(other)
|
49
|
+
(regex_match =~ other) == 0
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Hemp
|
2
|
+
module Routing
|
3
|
+
module RouteExtensions
|
4
|
+
def resources(*subjects)
|
5
|
+
subjects.each do |subject|
|
6
|
+
subject_helper subject
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
def subject_helper(subject)
|
11
|
+
get "/#{subject}", to: "#{subject}#index"
|
12
|
+
get "/#{subject}/new", to: "#{subject}#new"
|
13
|
+
post "/#{subject}", to: "#{subject}#create"
|
14
|
+
get "/#{subject}/:id", to: "#{subject}#show"
|
15
|
+
get "/#{subject}/:id/edit", to: "#{subject}#edit"
|
16
|
+
patch "/#{subject}/:id", to: "#{subject}#update"
|
17
|
+
put "/#{subject}/:id", to: "#{subject}#update"
|
18
|
+
delete "/#{subject}/:id", to: "#{subject}#destroy"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module Hemp
|
2
|
+
module Routing
|
3
|
+
class RouteSplitter
|
4
|
+
attr_accessor :split_route_path, :url_variable_hash, :url_regex_match
|
5
|
+
|
6
|
+
def initialize(split_route_path)
|
7
|
+
@split_route_path = split_route_path
|
8
|
+
@url_variable_hash = {}
|
9
|
+
@url_regex_match = []
|
10
|
+
end
|
11
|
+
|
12
|
+
def pick_out_url_variables
|
13
|
+
split_route_path.each_with_index do |split_element, index|
|
14
|
+
if split_element.start_with?(":")
|
15
|
+
url_regex_match << save_variable_and_index(split_element, index)
|
16
|
+
else
|
17
|
+
url_regex_match << split_element
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def save_variable_and_index(split_element, index)
|
23
|
+
variable_key = split_element.delete(":")
|
24
|
+
url_variable_hash[index] = variable_key.to_sym
|
25
|
+
|
26
|
+
"[a-zA-Z0-9_]+"
|
27
|
+
end
|
28
|
+
|
29
|
+
def parse_regex_and_vars_from_route
|
30
|
+
pick_out_url_variables
|
31
|
+
regex_string = "^" << url_regex_match.join("/") << "/*$"
|
32
|
+
|
33
|
+
[Regexp.new(regex_string), url_variable_hash]
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
data/lib/hemp/version.rb
ADDED
metadata
ADDED
@@ -0,0 +1,217 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: hemp
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Tobi Oduah
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-02-04 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.10'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.10'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '10.0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '10.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rack
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rack-test
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: facets
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: minitest
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :runtime
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: erubis
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :runtime
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: tilt
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :runtime
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ">="
|
123
|
+
- !ruby/object:Gem::Version
|
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: '0'
|
132
|
+
type: :runtime
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - ">="
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '0'
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: codeclimate-test-reporter
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - ">="
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '0'
|
146
|
+
type: :runtime
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - ">="
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '0'
|
153
|
+
description: Simple web framework for building web apps in Ruby following the MVC
|
154
|
+
design pattern
|
155
|
+
email:
|
156
|
+
- tobi.oduah@andela.com
|
157
|
+
executables: []
|
158
|
+
extensions: []
|
159
|
+
extra_rdoc_files: []
|
160
|
+
files:
|
161
|
+
- ".gitignore"
|
162
|
+
- ".hound.yml"
|
163
|
+
- ".rubocop.yml"
|
164
|
+
- CODE_OF_CONDUCT.md
|
165
|
+
- Gemfile
|
166
|
+
- LICENSE
|
167
|
+
- README.md
|
168
|
+
- Rakefile
|
169
|
+
- bin/console
|
170
|
+
- bin/setup
|
171
|
+
- hemp.gemspec
|
172
|
+
- lib/hemp.rb
|
173
|
+
- lib/hemp/aliases.rb
|
174
|
+
- lib/hemp/application.rb
|
175
|
+
- lib/hemp/base_record.rb
|
176
|
+
- lib/hemp/controller.rb
|
177
|
+
- lib/hemp/dependencies.rb
|
178
|
+
- lib/hemp/extensions/hash.rb
|
179
|
+
- lib/hemp/extensions/object.rb
|
180
|
+
- lib/hemp/orm/class_instance_vars.rb
|
181
|
+
- lib/hemp/orm/database_error.rb
|
182
|
+
- lib/hemp/orm/property.rb
|
183
|
+
- lib/hemp/orm/record_interface.rb
|
184
|
+
- lib/hemp/orm/sql_helper.rb
|
185
|
+
- lib/hemp/routing/base.rb
|
186
|
+
- lib/hemp/routing/route.rb
|
187
|
+
- lib/hemp/routing/route_extensions.rb
|
188
|
+
- lib/hemp/routing/route_split.rb
|
189
|
+
- lib/hemp/routing/route_syntax_error.rb
|
190
|
+
- lib/hemp/version.rb
|
191
|
+
homepage: https://github.com/andela-toduah/hemp-web-framework
|
192
|
+
licenses:
|
193
|
+
- MIT
|
194
|
+
metadata:
|
195
|
+
allowed_push_host: https://rubygems.org
|
196
|
+
post_install_message:
|
197
|
+
rdoc_options: []
|
198
|
+
require_paths:
|
199
|
+
- lib
|
200
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
201
|
+
requirements:
|
202
|
+
- - ">="
|
203
|
+
- !ruby/object:Gem::Version
|
204
|
+
version: '0'
|
205
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
206
|
+
requirements:
|
207
|
+
- - ">="
|
208
|
+
- !ruby/object:Gem::Version
|
209
|
+
version: '0'
|
210
|
+
requirements: []
|
211
|
+
rubyforge_project:
|
212
|
+
rubygems_version: 2.4.5.1
|
213
|
+
signing_key:
|
214
|
+
specification_version: 4
|
215
|
+
summary: Simple web framework for building web apps in Ruby following the MVC design
|
216
|
+
pattern
|
217
|
+
test_files: []
|