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.
@@ -0,0 +1,14 @@
1
+ require "fileutils"
2
+
3
+ module Hemp
4
+ module Orm
5
+ module SqlHelper
6
+ FileUtils.mkdir_p "db"
7
+ @db = SQLite3::Database.new File.join "db", "development.sqlite3"
8
+
9
+ def self.execute(*sql_args)
10
+ @db.execute(*sql_args)
11
+ end
12
+ end
13
+ end
14
+ end
@@ -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
@@ -0,0 +1,10 @@
1
+ module Hemp
2
+ module Routing
3
+ class RouteSyntaxError < StandardError
4
+ def initialize(method_path, custom_message = "")
5
+ super "Error while parsing routes. "\
6
+ "See line containing - '#{method_path}'. #{custom_message}"
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,3 @@
1
+ module Hemp
2
+ VERSION = "1.0.1".freeze
3
+ end
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: []