hemp 1.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.
- 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: []
|