rapid_runty 0.1.1 → 0.1.2
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/.gitmodules +3 -0
- data/.rubocop.yml +6 -236
- data/Gemfile +2 -2
- data/Guardfile +2 -2
- data/README.md +2 -2
- data/Rakefile +3 -3
- data/bin/console +3 -3
- data/lib/rapid_runty/application.rb +16 -7
- data/lib/rapid_runty/dependencies.rb +8 -0
- data/lib/rapid_runty/routes/matcher.rb +110 -0
- data/lib/rapid_runty/routes/route.rb +80 -0
- data/lib/rapid_runty/routing.rb +5 -11
- data/lib/rapid_runty/util.rb +17 -0
- data/lib/rapid_runty/version.rb +1 -1
- data/lib/rapid_runty.rb +4 -2
- data/rapid_runty.gemspec +28 -28
- metadata +8 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 45302d9a8dbbf57572216e3d7decd9a79504fa51
|
4
|
+
data.tar.gz: 71527a5d37ac8a023a374bfb5b354738f8f61b7a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b0b02e994bb9479b459d5f15aba669b263887508d74cf71c2ba7a08dfe5f7fe707132f1110e21ea981f50515c85f4ee6103afd6904e55333ef68791ee1d713f5
|
7
|
+
data.tar.gz: 7d63588dc32c587faed2722be2f2bf547c6990c3d33d22b135f6b9b7d4a693ab9c7d11c1f242cc3db3f4095225c724ad62b6294a43f2486ac6fb53a5eda0eb3c
|
data/.gitmodules
ADDED
data/.rubocop.yml
CHANGED
@@ -1,243 +1,13 @@
|
|
1
1
|
AllCops:
|
2
|
-
Include:
|
3
|
-
- "**/*.gemspec"
|
4
|
-
- "**/*.rake"
|
5
|
-
- "**/Gemfile"
|
6
|
-
- "**/Rakefile"
|
7
|
-
- "**/Guardfile"
|
8
|
-
- "**/Thorfile"
|
9
|
-
- "**/Vagrantfile"
|
10
2
|
Exclude:
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
enabled: false
|
3
|
+
- "db/schema.rb"
|
4
|
+
- "Gemfile"
|
5
|
+
- "spec/**/*"
|
15
6
|
UseCache: false
|
16
|
-
Style/CollectionMethods:
|
17
|
-
Description: Preferred collection methods.
|
18
|
-
StyleGuide: https://github.com/bbatsov/ruby-style-guide#map-find-select-reduce-size
|
19
|
-
Enabled: true
|
20
|
-
PreferredMethods:
|
21
|
-
collect: map
|
22
|
-
collect!: map!
|
23
|
-
find: detect
|
24
|
-
find_all: select
|
25
|
-
reduce: inject
|
26
|
-
Style/DotPosition:
|
27
|
-
Description: Checks the position of the dot in multi-line method calls.
|
28
|
-
StyleGuide: https://github.com/bbatsov/ruby-style-guide#consistent-multi-line-chains
|
29
|
-
Enabled: true
|
30
|
-
EnforcedStyle: trailing
|
31
|
-
SupportedStyles:
|
32
|
-
- leading
|
33
|
-
- trailing
|
34
|
-
Style/FileName:
|
35
|
-
Description: Use snake_case for source file names.
|
36
|
-
StyleGuide: https://github.com/bbatsov/ruby-style-guide#snake-case-files
|
37
|
-
Enabled: false
|
38
|
-
Exclude: []
|
39
|
-
Style/GuardClause:
|
40
|
-
Description: Check for conditionals that can be replaced with guard clauses
|
41
|
-
StyleGuide: https://github.com/bbatsov/ruby-style-guide#no-nested-conditionals
|
42
|
-
Enabled: false
|
43
|
-
MinBodyLength: 1
|
44
|
-
Style/IfUnlessModifier:
|
45
|
-
Description: Favor modifier if/unless usage when you have a single-line body.
|
46
|
-
StyleGuide: https://github.com/bbatsov/ruby-style-guide#if-as-a-modifier
|
47
|
-
Enabled: false
|
48
|
-
MaxLineLength: 80
|
49
|
-
Style/OptionHash:
|
50
|
-
Description: Don't use option hashes when you can use keyword arguments.
|
51
|
-
Enabled: false
|
52
|
-
Style/PercentLiteralDelimiters:
|
53
|
-
Description: Use `%`-literal delimiters consistently
|
54
|
-
StyleGuide: https://github.com/bbatsov/ruby-style-guide#percent-literal-braces
|
55
|
-
Enabled: false
|
56
|
-
PreferredDelimiters:
|
57
|
-
"%": "()"
|
58
|
-
"%i": "()"
|
59
|
-
"%q": "()"
|
60
|
-
"%Q": "()"
|
61
|
-
"%r": "{}"
|
62
|
-
"%s": "()"
|
63
|
-
"%w": "()"
|
64
|
-
"%W": "()"
|
65
|
-
"%x": "()"
|
66
|
-
Style/PredicateName:
|
67
|
-
Description: Check the names of predicate methods.
|
68
|
-
StyleGuide: https://github.com/bbatsov/ruby-style-guide#bool-methods-qmark
|
69
|
-
Enabled: true
|
70
|
-
NamePrefix:
|
71
|
-
- is_
|
72
|
-
- has_
|
73
|
-
- have_
|
74
|
-
NamePrefixBlacklist:
|
75
|
-
- is_
|
76
|
-
Exclude:
|
77
|
-
- spec/**/*
|
78
|
-
Style/RaiseArgs:
|
79
|
-
Description: Checks the arguments passed to raise/fail.
|
80
|
-
StyleGuide: https://github.com/bbatsov/ruby-style-guide#exception-class-messages
|
81
|
-
Enabled: false
|
82
|
-
EnforcedStyle: exploded
|
83
|
-
SupportedStyles:
|
84
|
-
- compact
|
85
|
-
- exploded
|
86
|
-
Style/SignalException:
|
87
|
-
Description: Checks for proper usage of fail and raise.
|
88
|
-
StyleGuide: https://github.com/bbatsov/ruby-style-guide#fail-method
|
89
|
-
Enabled: false
|
90
|
-
EnforcedStyle: semantic
|
91
|
-
SupportedStyles:
|
92
|
-
- only_raise
|
93
|
-
- only_fail
|
94
|
-
- semantic
|
95
|
-
Style/SingleLineBlockParams:
|
96
|
-
Description: Enforces the names of some block params.
|
97
|
-
StyleGuide: https://github.com/bbatsov/ruby-style-guide#reduce-blocks
|
98
|
-
Enabled: false
|
99
|
-
Methods:
|
100
|
-
- reduce:
|
101
|
-
- a
|
102
|
-
- e
|
103
|
-
- inject:
|
104
|
-
- a
|
105
|
-
- e
|
106
|
-
Style/SingleLineMethods:
|
107
|
-
Description: Avoid single-line methods.
|
108
|
-
StyleGuide: https://github.com/bbatsov/ruby-style-guide#no-single-line-methods
|
109
|
-
Enabled: false
|
110
|
-
AllowIfMethodIsEmpty: true
|
111
|
-
Style/StringLiterals:
|
112
|
-
Description: Checks if uses of quotes match the configured preference.
|
113
|
-
StyleGuide: https://github.com/bbatsov/ruby-style-guide#consistent-string-literals
|
114
|
-
Enabled: true
|
115
|
-
EnforcedStyle: double_quotes
|
116
|
-
SupportedStyles:
|
117
|
-
- single_quotes
|
118
|
-
- double_quotes
|
119
|
-
Style/StringLiteralsInInterpolation:
|
120
|
-
Description: Checks if uses of quotes inside expressions in interpolated strings
|
121
|
-
match the configured preference.
|
122
|
-
Enabled: true
|
123
|
-
EnforcedStyle: single_quotes
|
124
|
-
SupportedStyles:
|
125
|
-
- single_quotes
|
126
|
-
- double_quotes
|
127
|
-
Style/TrailingCommaInLiteral:
|
128
|
-
Description: Checks for trailing comma in parameter lists and literals.
|
129
|
-
StyleGuide: https://github.com/bbatsov/ruby-style-guide#no-trailing-array-commas
|
130
|
-
Enabled: false
|
131
|
-
EnforcedStyleForMultiline: no_comma
|
132
|
-
SupportedStyles:
|
133
|
-
- comma
|
134
|
-
- no_comma
|
135
7
|
Metrics/AbcSize:
|
136
|
-
Description: A calculated magnitude based on number of assignments, branches, and
|
137
|
-
conditions.
|
138
|
-
Enabled: false
|
139
|
-
Max: 15
|
140
|
-
Metrics/ClassLength:
|
141
|
-
Description: Avoid classes longer than 100 lines of code.
|
142
|
-
Enabled: false
|
143
|
-
CountComments: false
|
144
|
-
Max: 100
|
145
|
-
Metrics/ModuleLength:
|
146
|
-
CountComments: false
|
147
|
-
Max: 100
|
148
|
-
Description: Avoid modules longer than 100 lines of code.
|
149
|
-
Enabled: false
|
150
|
-
Metrics/CyclomaticComplexity:
|
151
|
-
Description: A complexity metric that is strongly correlated to the number of test
|
152
|
-
cases needed to validate a method.
|
153
|
-
Enabled: false
|
154
|
-
Max: 6
|
155
|
-
Metrics/MethodLength:
|
156
|
-
Description: Avoid methods longer than 10 lines of code.
|
157
|
-
StyleGuide: https://github.com/bbatsov/ruby-style-guide#short-methods
|
158
|
-
Enabled: false
|
159
|
-
CountComments: false
|
160
|
-
Max: 10
|
161
|
-
Metrics/ParameterLists:
|
162
|
-
Description: Avoid parameter lists longer than three or four parameters.
|
163
|
-
StyleGuide: https://github.com/bbatsov/ruby-style-guide#too-many-params
|
164
|
-
Enabled: false
|
165
|
-
Max: 5
|
166
|
-
CountKeywordArgs: true
|
167
|
-
Metrics/PerceivedComplexity:
|
168
|
-
Description: A complexity metric geared towards measuring complexity for a human
|
169
|
-
reader.
|
170
|
-
Enabled: false
|
171
|
-
Max: 7
|
172
|
-
Lint/AssignmentInCondition:
|
173
|
-
Description: Don't use assignment in conditions.
|
174
|
-
StyleGuide: https://github.com/bbatsov/ruby-style-guide#safe-assignment-in-condition
|
175
8
|
Enabled: false
|
176
|
-
|
177
|
-
Style/InlineComment:
|
178
|
-
Description: Avoid inline comments.
|
179
|
-
Enabled: false
|
180
|
-
Style/AccessorMethodName:
|
181
|
-
Description: Check the naming of accessor methods for get_/set_.
|
182
|
-
Enabled: false
|
183
|
-
Style/Alias:
|
184
|
-
Description: Use alias_method instead of alias.
|
185
|
-
StyleGuide: https://github.com/bbatsov/ruby-style-guide#alias-method
|
9
|
+
Metrics/LineLength:
|
186
10
|
Enabled: false
|
187
11
|
Style/Documentation:
|
188
|
-
|
189
|
-
|
190
|
-
Style/DoubleNegation:
|
191
|
-
Description: Checks for uses of double negation (!!).
|
192
|
-
StyleGuide: https://github.com/bbatsov/ruby-style-guide#no-bang-bang
|
193
|
-
Enabled: false
|
194
|
-
Style/EachWithObject:
|
195
|
-
Description: Prefer `each_with_object` over `inject` or `reduce`.
|
196
|
-
Enabled: false
|
197
|
-
Style/EmptyLiteral:
|
198
|
-
Description: Prefer literals to Array.new/Hash.new/String.new.
|
199
|
-
StyleGuide: https://github.com/bbatsov/ruby-style-guide#literal-array-hash
|
200
|
-
Enabled: false
|
201
|
-
Style/ModuleFunction:
|
202
|
-
Description: Checks for usage of `extend self` in modules.
|
203
|
-
StyleGuide: https://github.com/bbatsov/ruby-style-guide#module-function
|
204
|
-
Enabled: false
|
205
|
-
Style/OneLineConditional:
|
206
|
-
Description: Favor the ternary operator(?:) over if/then/else/end constructs.
|
207
|
-
StyleGuide: https://github.com/bbatsov/ruby-style-guide#ternary-operator
|
208
|
-
Enabled: false
|
209
|
-
Style/PerlBackrefs:
|
210
|
-
Description: Avoid Perl-style regex back references.
|
211
|
-
StyleGuide: https://github.com/bbatsov/ruby-style-guide#no-perl-regexp-last-matchers
|
212
|
-
Enabled: false
|
213
|
-
Style/Send:
|
214
|
-
Description: Prefer `Object#__send__` or `Object#public_send` to `send`, as `send`
|
215
|
-
may overlap with existing methods.
|
216
|
-
StyleGuide: https://github.com/bbatsov/ruby-style-guide#prefer-public-send
|
217
|
-
Enabled: false
|
218
|
-
Style/SpecialGlobalVars:
|
219
|
-
Description: Avoid Perl-style global variables.
|
220
|
-
StyleGuide: https://github.com/bbatsov/ruby-style-guide#no-cryptic-perlisms
|
221
|
-
Enabled: false
|
222
|
-
Style/VariableInterpolation:
|
223
|
-
Description: Don't interpolate global, instance and class variables directly in
|
224
|
-
strings.
|
225
|
-
StyleGuide: https://github.com/bbatsov/ruby-style-guide#curlies-interpolate
|
226
|
-
Enabled: false
|
227
|
-
Style/WhenThen:
|
228
|
-
Description: Use when x then ... for one-line cases.
|
229
|
-
StyleGuide: https://github.com/bbatsov/ruby-style-guide#one-line-cases
|
230
|
-
Enabled: false
|
231
|
-
Lint/EachWithObjectArgument:
|
232
|
-
Description: Check for immutable argument given to each_with_object.
|
233
|
-
Enabled: true
|
234
|
-
Lint/HandleExceptions:
|
235
|
-
Description: Don't suppress exception.
|
236
|
-
StyleGuide: https://github.com/bbatsov/ruby-style-guide#dont-hide-exceptions
|
237
|
-
Enabled: false
|
238
|
-
Lint/LiteralInCondition:
|
239
|
-
Description: Checks of literals used in conditions.
|
240
|
-
Enabled: false
|
241
|
-
Lint/LiteralInInterpolation:
|
242
|
-
Description: Checks for literals used in interpolation.
|
243
|
-
Enabled: false
|
12
|
+
Exclude:
|
13
|
+
- 'lib/**/*'
|
data/Gemfile
CHANGED
@@ -1,7 +1,7 @@
|
|
1
|
-
source
|
1
|
+
source 'https://rubygems.org'
|
2
2
|
|
3
3
|
gemspec
|
4
4
|
|
5
5
|
group :development, :test do
|
6
|
-
gem
|
6
|
+
gem 'poltergeist', git: 'git://github.com/teampoltergeist/poltergeist.git'
|
7
7
|
end
|
data/Guardfile
CHANGED
@@ -1,5 +1,5 @@
|
|
1
|
-
guard :rspec, cmd:
|
1
|
+
guard :rspec, cmd: 'bundle exec rspec' do
|
2
2
|
watch(%r{^spec/.+_spec\.rb$})
|
3
3
|
watch(%r{^lib/rapid_runty/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
|
4
|
-
watch(
|
4
|
+
watch('spec/spec_helper.rb') { 'spec' }
|
5
5
|
end
|
data/README.md
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
|
6
6
|
# Rapid Runty
|
7
7
|
|
8
|
-
[](https://badge.fury.io/rb/rapid_runty) [](https://badge.fury.io/rb/rapid_runty) [](https://gemnasium.com/github.com/Habu-Kagumba/rapid_runty) [ ](https://codeship.com/projects/167383) [](https://coveralls.io/github/Habu-Kagumba/rapid_runty?branch=master) [](https://codebeat.co/projects/github-com-habu-kagumba-rapid_runty) [](http://inch-ci.org/github/Habu-Kagumba/rapid_runty)
|
9
9
|
|
10
10
|
**Rapid Runty** is a minimal web framework to get your web project up and running in seconds.
|
11
11
|
|
@@ -41,7 +41,7 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
|
|
41
41
|
|
42
42
|
## Contributing
|
43
43
|
|
44
|
-
Bug reports and pull requests are welcome on GitHub at https://github.com/
|
44
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/Habu-Kagumba/rapid_runty. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
|
45
45
|
|
46
46
|
|
47
47
|
## License
|
data/Rakefile
CHANGED
data/bin/console
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
3
|
+
require 'bundler/setup'
|
4
|
+
require 'rapid_runty'
|
5
5
|
|
6
6
|
# You can add fixtures and/or initialization code here to make experimenting
|
7
7
|
# with your gem easier. You can also use a different console, if you like.
|
@@ -10,5 +10,5 @@ require "rapid_runty"
|
|
10
10
|
# require "pry"
|
11
11
|
# Pry.start
|
12
12
|
|
13
|
-
require
|
13
|
+
require 'irb'
|
14
14
|
IRB.start
|
@@ -1,7 +1,8 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require 'rapid_runty/routing'
|
2
|
+
require 'rapid_runty/controller'
|
3
3
|
|
4
4
|
module RapidRunty
|
5
|
+
##
|
5
6
|
# Main framework Application class. Entry point for all requests.
|
6
7
|
#
|
7
8
|
# Example:
|
@@ -19,11 +20,19 @@ module RapidRunty
|
|
19
20
|
#
|
20
21
|
# @return [status, {headers}, [response]] array
|
21
22
|
def call(env)
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
23
|
+
request = Rack::Request.new(env)
|
24
|
+
|
25
|
+
verb = request.request_method.downcase.to_sym
|
26
|
+
path = Rack::Utils.unescape(request.path_info)
|
27
|
+
|
28
|
+
return [500, {}, []] if path == '/favicon.ico'
|
29
|
+
|
30
|
+
route = routes.match(verb, path)
|
31
|
+
if route.nil?
|
32
|
+
[404, { 'Content-Type' => 'text/html' }, '404 not found']
|
33
|
+
else
|
34
|
+
[200, { 'Content-Type' => 'text/html' }, ["Hello RapidRunty"]]
|
35
|
+
end
|
27
36
|
end
|
28
37
|
end
|
29
38
|
end
|
@@ -0,0 +1,110 @@
|
|
1
|
+
require 'pathname'
|
2
|
+
|
3
|
+
module RapidRunty
|
4
|
+
module Router
|
5
|
+
##
|
6
|
+
# Matches passed in path with array of application paths
|
7
|
+
module Matcher
|
8
|
+
def self.match(*args)
|
9
|
+
Base.match(*args)
|
10
|
+
end
|
11
|
+
|
12
|
+
class Base
|
13
|
+
##
|
14
|
+
# Defines the route that matches the path
|
15
|
+
#
|
16
|
+
# Example:
|
17
|
+
#
|
18
|
+
# RapidRunty::Router::Matcher.match("/foo", [{url: "/", to: "root#index"}, {url: "/bar", to: "bar#index"}, {url: "/foo", to: "foo#index"}]) #=> ["/foo", [], { controller: "foo", action: "index" }]
|
19
|
+
# RapidRunty::Router::Matcher.match("/04/01/01", [{url: "/:day/:month/:year", to: "date#find"}]) #=> ["/", ["04", "01", "01"], { controller: "date", action: "find" }]
|
20
|
+
# @param path [String] path from ENV["PATH_INFO"]
|
21
|
+
# @param application routes [Array] Array of Hash application defined routes
|
22
|
+
#
|
23
|
+
# Currently only supporting ":to" options which defines the "controller#action"
|
24
|
+
#
|
25
|
+
# @return [matching_route, matched_placeholders, matched_controller_action] array
|
26
|
+
#
|
27
|
+
def self.match(path, routes)
|
28
|
+
path = Path.new(path)
|
29
|
+
url_patterns = routes.map { |route| URLPattern.new(route) }
|
30
|
+
|
31
|
+
url_patterns.each do |pattern|
|
32
|
+
return [
|
33
|
+
pattern.to_s,
|
34
|
+
pattern.placeholders,
|
35
|
+
ControllerSetup.controller_action(pattern.options)
|
36
|
+
] if pattern == path
|
37
|
+
end
|
38
|
+
|
39
|
+
[nil, [], {}]
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
class Path
|
44
|
+
attr_accessor :parts, :ext, :options
|
45
|
+
|
46
|
+
def initialize(path)
|
47
|
+
path = Pathname(path)
|
48
|
+
self.parts, self.ext = split_path(path)
|
49
|
+
rescue TypeError
|
50
|
+
self.parts, self.ext = split_path(path[:url])
|
51
|
+
self.options = path[:to]
|
52
|
+
end
|
53
|
+
|
54
|
+
def to_s
|
55
|
+
'/' + parts.join('/') + ext
|
56
|
+
end
|
57
|
+
|
58
|
+
private
|
59
|
+
|
60
|
+
def split_path(path)
|
61
|
+
path = path.to_s
|
62
|
+
ext = Pathname(path).extname
|
63
|
+
path = path.sub(/#{ext}$/, '')
|
64
|
+
parts = path.split('/').reject(&:empty?)
|
65
|
+
parts = [''] if path == '/'
|
66
|
+
[parts, ext]
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
class URLPattern < Path
|
71
|
+
def placeholders
|
72
|
+
return [] unless @match
|
73
|
+
|
74
|
+
vars = []
|
75
|
+
parts.each_with_index do |part, i|
|
76
|
+
vars << @match.parts[i] if part[0] == ':'
|
77
|
+
end
|
78
|
+
vars
|
79
|
+
end
|
80
|
+
|
81
|
+
def ==(other)
|
82
|
+
is_match = size_match?(other) && parts_match?(other)
|
83
|
+
@match = other if is_match
|
84
|
+
is_match
|
85
|
+
end
|
86
|
+
|
87
|
+
private
|
88
|
+
|
89
|
+
def size_match?(path)
|
90
|
+
parts.size == path.parts.size
|
91
|
+
end
|
92
|
+
|
93
|
+
def parts_match?(path)
|
94
|
+
parts.each_with_index do |part, i|
|
95
|
+
return true if part[0] == ':' || path.parts[i] == part
|
96
|
+
end
|
97
|
+
false
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
class ControllerSetup
|
102
|
+
def self.controller_action(options)
|
103
|
+
Hash[
|
104
|
+
%w(controller action).zip options.split('#')
|
105
|
+
]
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
@@ -0,0 +1,80 @@
|
|
1
|
+
require 'rapid_runty/routes/matcher'
|
2
|
+
|
3
|
+
module RapidRunty
|
4
|
+
module Router
|
5
|
+
##
|
6
|
+
# This class registers all routes defined by the draw method.
|
7
|
+
class Routes < Array
|
8
|
+
def add(*args)
|
9
|
+
self << Route.new(*args)
|
10
|
+
end
|
11
|
+
|
12
|
+
##
|
13
|
+
# Match incoming paths from env to existing routes
|
14
|
+
#
|
15
|
+
# @param verb [String] HTTP verb extracted from Rack env
|
16
|
+
# @param path [String] the url path extracted from Rack env
|
17
|
+
#
|
18
|
+
# @return A RapidRunty::Router::Route Instance:
|
19
|
+
#
|
20
|
+
# Example:
|
21
|
+
# RapidRunty::Router::Routes.match("GET", "/foo/4") = #<RapidRunty::Router::Route options={"controller"=>"foo", "action"=>"bar"}, path="/foo/:id", placeholders=[], verb=:get
|
22
|
+
def match(verb, path)
|
23
|
+
return nil if empty?
|
24
|
+
|
25
|
+
verb = verb.to_s.downcase.strip.to_sym
|
26
|
+
|
27
|
+
routes = select { |route| route.verb == verb }
|
28
|
+
paths = routes.map { |route| { url: route.path }.merge route.options }
|
29
|
+
|
30
|
+
path, places, action = RapidRunty::Router::Matcher.match(path, paths)
|
31
|
+
return nil if path.nil?
|
32
|
+
|
33
|
+
route = routes.detect { |router| router.path == path }.clone
|
34
|
+
route.placeholders = places
|
35
|
+
route.options = action
|
36
|
+
route
|
37
|
+
end
|
38
|
+
|
39
|
+
##
|
40
|
+
# Provides familiar DSL to defining routes
|
41
|
+
#
|
42
|
+
# Example:
|
43
|
+
# DemoApplication.routes.draw do
|
44
|
+
# root "demo#index"
|
45
|
+
# get "/demo", to: "demo#index"
|
46
|
+
# get "/demo/new", to: "demo#new"
|
47
|
+
# get "/demo/:id", to: "demo#show"
|
48
|
+
# get "/demo/:id/edit", to: "demo#edit"
|
49
|
+
# post "/demo/", to: "demo#create"
|
50
|
+
# put "/demo/:id", to: "demo#update"
|
51
|
+
# patch "/demo/:id", to: "demo#update"
|
52
|
+
# delete "/demo/:id", to: "demo#destroy"
|
53
|
+
# end
|
54
|
+
def draw(&block)
|
55
|
+
instance_eval(&block)
|
56
|
+
end
|
57
|
+
|
58
|
+
def root(controller)
|
59
|
+
get '/', to: controller
|
60
|
+
end
|
61
|
+
|
62
|
+
%w(get post put patch delete).each do |method_name|
|
63
|
+
define_method(method_name) do |path, options|
|
64
|
+
add(method_name.to_sym, path, options)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
class Route
|
70
|
+
attr_accessor :verb, :path, :options, :placeholders
|
71
|
+
|
72
|
+
def initialize(verb, path, options)
|
73
|
+
self.verb = verb
|
74
|
+
self.path = path
|
75
|
+
self.options = options
|
76
|
+
self.placeholders = nil
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
data/lib/rapid_runty/routing.rb
CHANGED
@@ -1,17 +1,11 @@
|
|
1
|
+
require 'rapid_runty/routes/route'
|
2
|
+
|
1
3
|
module RapidRunty
|
2
4
|
class Application
|
3
|
-
|
4
|
-
#
|
5
|
-
# @param env [Hash] Rack environment Hash that includes CGI-like headers
|
6
|
-
#
|
7
|
-
# @return [Controller, Action] array
|
8
|
-
def get_controller_action(env)
|
9
|
-
_, controller, action, _other = env["PATH_INFO"].split("/", 4)
|
10
|
-
controller = controller.capitalize
|
11
|
-
controller += "Controller"
|
5
|
+
attr_reader :routes
|
12
6
|
|
13
|
-
|
14
|
-
|
7
|
+
def initialize
|
8
|
+
@routes = RapidRunty::Router::Routes.new
|
15
9
|
end
|
16
10
|
end
|
17
11
|
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# Extend the Ruby String class
|
2
|
+
class String
|
3
|
+
##
|
4
|
+
# Returns the snake_case version of a word
|
5
|
+
#
|
6
|
+
# Example:
|
7
|
+
#
|
8
|
+
# "IndexController".snake_case = "index_controller"
|
9
|
+
def snake_case
|
10
|
+
gsub!(/::/, '/')
|
11
|
+
gsub!(/([A-Z]+)([A-Z][a-z])/, '\1_\2')
|
12
|
+
gsub!(/([a-z\d])([A-Z])/, '\1_\2')
|
13
|
+
tr!('-', '_')
|
14
|
+
downcase!
|
15
|
+
self
|
16
|
+
end
|
17
|
+
end
|
data/lib/rapid_runty/version.rb
CHANGED
data/lib/rapid_runty.rb
CHANGED
data/rapid_runty.gemspec
CHANGED
@@ -1,45 +1,45 @@
|
|
1
1
|
# coding: utf-8
|
2
|
-
lib = File.expand_path(
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
3
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
-
require
|
4
|
+
require 'rapid_runty/version'
|
5
5
|
|
6
6
|
Gem::Specification.new do |spec|
|
7
|
-
spec.name =
|
7
|
+
spec.name = 'rapid_runty'
|
8
8
|
spec.version = RapidRunty::VERSION
|
9
|
-
spec.authors = [
|
10
|
-
spec.email = [
|
9
|
+
spec.authors = ['Herbert Kagumba']
|
10
|
+
spec.email = ['herbert.kagumba@andela.com']
|
11
11
|
|
12
|
-
spec.summary =
|
13
|
-
spec.description =
|
14
|
-
|
15
|
-
spec.homepage =
|
16
|
-
spec.license =
|
12
|
+
spec.summary = 'A minimal web framework'
|
13
|
+
spec.description = 'A minimal web framework to get your web project up '\
|
14
|
+
'and running in seconds.'
|
15
|
+
spec.homepage = 'https://github.com/Habu-Kagumb/rapid_runty'
|
16
|
+
spec.license = 'MIT'
|
17
17
|
|
18
18
|
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
19
19
|
f.match(%r{^(test|spec|features)/})
|
20
20
|
end
|
21
|
-
spec.bindir =
|
21
|
+
spec.bindir = 'exe'
|
22
22
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
23
|
-
spec.require_paths = [
|
23
|
+
spec.require_paths = ['lib']
|
24
24
|
|
25
|
-
spec.add_development_dependency
|
25
|
+
spec.add_development_dependency 'pry', '~> 0.10'
|
26
26
|
|
27
|
-
spec.add_development_dependency
|
28
|
-
spec.add_development_dependency
|
29
|
-
spec.add_development_dependency
|
30
|
-
spec.add_development_dependency
|
31
|
-
spec.add_development_dependency
|
27
|
+
spec.add_development_dependency 'rspec', '~> 3.0'
|
28
|
+
spec.add_development_dependency 'rack-test', '~> 0.6'
|
29
|
+
spec.add_development_dependency 'simplecov', '~> 0.12'
|
30
|
+
spec.add_development_dependency 'capybara', '~> 2.7'
|
31
|
+
spec.add_development_dependency 'coveralls', '~> 0.8'
|
32
32
|
|
33
|
-
spec.add_development_dependency
|
34
|
-
spec.add_development_dependency
|
35
|
-
spec.add_development_dependency
|
33
|
+
spec.add_development_dependency 'rake', '~> 10.0'
|
34
|
+
spec.add_development_dependency 'guard', '~> 2.14'
|
35
|
+
spec.add_development_dependency 'guard-rspec', '~> 4.7'
|
36
36
|
|
37
|
-
spec.add_development_dependency
|
38
|
-
spec.add_development_dependency
|
39
|
-
spec.add_development_dependency
|
40
|
-
spec.add_development_dependency
|
37
|
+
spec.add_development_dependency 'yard', '~> 0.9'
|
38
|
+
spec.add_development_dependency 'rubocop', '~> 0.42'
|
39
|
+
spec.add_development_dependency 'brakeman', '~> 3.3'
|
40
|
+
spec.add_development_dependency 'rubycritic', '~> 2.9'
|
41
41
|
|
42
|
-
spec.add_dependency
|
43
|
-
spec.add_dependency
|
44
|
-
spec.add_dependency
|
42
|
+
spec.add_dependency 'rack', '~> 2.0'
|
43
|
+
spec.add_dependency 'bundler', '~> 1.12'
|
44
|
+
spec.add_dependency 'thor', '~> 0.19'
|
45
45
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rapid_runty
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Herbert Kagumba
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-08-
|
11
|
+
date: 2016-08-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: pry
|
@@ -243,6 +243,7 @@ extra_rdoc_files: []
|
|
243
243
|
files:
|
244
244
|
- ".github/PULL_REQUEST_TEMPLATE.md"
|
245
245
|
- ".gitignore"
|
246
|
+
- ".gitmodules"
|
246
247
|
- ".hound.yml"
|
247
248
|
- ".rspec"
|
248
249
|
- ".rubocop.yml"
|
@@ -259,10 +260,14 @@ files:
|
|
259
260
|
- lib/rapid_runty.rb
|
260
261
|
- lib/rapid_runty/application.rb
|
261
262
|
- lib/rapid_runty/controller.rb
|
263
|
+
- lib/rapid_runty/dependencies.rb
|
264
|
+
- lib/rapid_runty/routes/matcher.rb
|
265
|
+
- lib/rapid_runty/routes/route.rb
|
262
266
|
- lib/rapid_runty/routing.rb
|
267
|
+
- lib/rapid_runty/util.rb
|
263
268
|
- lib/rapid_runty/version.rb
|
264
269
|
- rapid_runty.gemspec
|
265
|
-
homepage: https://github.com/
|
270
|
+
homepage: https://github.com/Habu-Kagumb/rapid_runty
|
266
271
|
licenses:
|
267
272
|
- MIT
|
268
273
|
metadata: {}
|