leanweb 0.3.0 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/leanweb +6 -0
- data/contrib/lib/hawese.rb +21 -7
- data/contrib/lib/leanweb/controller_mixins/render_with_layout.rb +47 -12
- data/lib/leanweb/controller.rb +26 -7
- data/lib/leanweb/route.rb +28 -4
- data/lib/leanweb/version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9c2c8b263119a2bfb7a4a812f4ffeb66bc9444bfc65a5ea0ab99d627d227e307
|
4
|
+
data.tar.gz: bbb016308a12268ee78694e378e931c016475ca8cf9ff4264d017f79664911f3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 52c6e7bdd02a5c2797d20cd6979574cec8a4d8333ab659f3332fa6b4e3bce906a69f950124453621e12dee38c0c585ac3abace0a8041c54d444524c0a21bbba3
|
7
|
+
data.tar.gz: 64ec617d144264edce4922fa2258173f6cc139a20102a9ba4c4290adb6ec06d13be4b5f265af715fdcd82005ae03c66ac447c7dd79bc30dce0c3235d4a4f8e22
|
data/bin/leanweb
CHANGED
data/contrib/lib/hawese.rb
CHANGED
@@ -28,15 +28,19 @@ class Hawese
|
|
28
28
|
end
|
29
29
|
ORIGIN = ENV.fetch('HAWESE_ORIGIN')
|
30
30
|
|
31
|
-
def payment_methods
|
32
|
-
|
33
|
-
|
31
|
+
def payment_methods(country = '*', currency = nil)
|
32
|
+
endpoint = String.new(
|
33
|
+
"#{ENDPOINT}/gateways/payment-methods/purchase?country=#{country}"
|
34
|
+
)
|
35
|
+
endpoint << "¤cy=#{currency}" if currency
|
36
|
+
uri = URI(endpoint)
|
37
|
+
JSON.parse(Net::HTTP.get(uri), symbolize_names: true)
|
34
38
|
end
|
35
39
|
|
36
40
|
def gateway_schema(gateway, query_params, schema = 'purchase')
|
37
41
|
uri = URI("#{ENDPOINT}/gateways/#{gateway}/schemas/#{schema}")
|
38
42
|
uri.query = URI.encode_www_form(query_params)
|
39
|
-
JSON.parse(Net::HTTP.get(uri))
|
43
|
+
JSON.parse(Net::HTTP.get(uri), symbolize_names: true)
|
40
44
|
end
|
41
45
|
|
42
46
|
def purchase(gateway, fields)
|
@@ -48,15 +52,25 @@ class Hawese
|
|
48
52
|
fields.to_json,
|
49
53
|
'Content-Type' => 'application/json'
|
50
54
|
)
|
51
|
-
JSON.parse(response.body)
|
55
|
+
JSON.parse(response.body, symbolize_names: true)
|
52
56
|
end
|
53
57
|
|
54
58
|
def purchase_from_schema(gateway, schema)
|
55
59
|
fields = {}
|
56
|
-
schema[
|
57
|
-
fields[property] = contents[
|
60
|
+
schema[:properties].each do |property, contents|
|
61
|
+
fields[property] = contents[:default] if contents.include?(:default)
|
58
62
|
end
|
59
63
|
purchase(gateway, fields)
|
60
64
|
end
|
65
|
+
|
66
|
+
def payment(uuid)
|
67
|
+
uri = URI("#{ENDPOINT}/payments/#{uuid}")
|
68
|
+
Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |http|
|
69
|
+
req = Net::HTTP::Get.new(uri)
|
70
|
+
req['Authorization'] = "Bearer #{ENV.fetch('HAWESE_AUTH_TOKEN')}"
|
71
|
+
response = http.request(req)
|
72
|
+
JSON.parse(response.body, symbolize_names: true)
|
73
|
+
end
|
74
|
+
end
|
61
75
|
end
|
62
76
|
end
|
@@ -12,7 +12,7 @@ module LeanWeb
|
|
12
12
|
module ControllerMixins
|
13
13
|
# {render_with_layout} for {Controller} with ERB, HAML, Tilt::EmacsOrg and
|
14
14
|
# Redcarpet Markdown support.
|
15
|
-
module RenderWithLayout
|
15
|
+
module RenderWithLayout # rubocop:disable Metrics/ModuleLength
|
16
16
|
# Render a response with a layout.
|
17
17
|
#
|
18
18
|
# Depending on the `path` file contents and options `@content_for` might
|
@@ -43,15 +43,21 @@ module LeanWeb
|
|
43
43
|
head: nil,
|
44
44
|
layout: 'layout.haml',
|
45
45
|
sub_layout: nil,
|
46
|
-
options:
|
46
|
+
options: nil,
|
47
47
|
&block
|
48
48
|
)
|
49
49
|
@content_for[:title] = title unless title.nil?
|
50
50
|
content = render_by_extension(path, sub_layout, options, &block)
|
51
|
-
prepare_head(head) unless head.nil?
|
51
|
+
prepare_head(**head) unless head.nil?
|
52
52
|
render_response(layout, 'text/html'){ content }
|
53
53
|
end
|
54
54
|
|
55
|
+
# Render response for missing static action methods. Called from
|
56
|
+
# {Route#respond}.
|
57
|
+
def default_static_action(view_path)
|
58
|
+
render_with_layout(view_path)
|
59
|
+
end
|
60
|
+
|
55
61
|
protected
|
56
62
|
|
57
63
|
# @param path [String]
|
@@ -60,8 +66,8 @@ module LeanWeb
|
|
60
66
|
# @option options [String] :setupfile can be absolute or relative to
|
61
67
|
# {VIEW_PATH}.
|
62
68
|
def render_org(path, layout: nil, options: {})
|
63
|
-
options[:setupfile] =
|
64
|
-
if options.include?(:setupfile)
|
69
|
+
options[:setupfile] = absolute_view_path(options[:setupfile]) \
|
70
|
+
if options.include?(:setupfile)
|
65
71
|
|
66
72
|
org_template = create_template(path, options)
|
67
73
|
|
@@ -83,6 +89,10 @@ module LeanWeb
|
|
83
89
|
def render_markdown(path, layout: nil, options: {})
|
84
90
|
maybe_render_markdown_toc!(path, options)
|
85
91
|
markdown_template = create_template(path, options)
|
92
|
+
|
93
|
+
@content_for[:title] = find_title('md', path) \
|
94
|
+
unless @content_for.include?(:title)
|
95
|
+
|
86
96
|
if layout
|
87
97
|
create_template(layout).render(self){ markdown_template.render(self) }
|
88
98
|
else
|
@@ -104,6 +114,23 @@ module LeanWeb
|
|
104
114
|
options[:with_toc_data] = true
|
105
115
|
end
|
106
116
|
|
117
|
+
def find_title(ext, path)
|
118
|
+
regex = find_title_ext_regex(ext)
|
119
|
+
title = nil
|
120
|
+
File.foreach(absolute_view_path(path)) do |line|
|
121
|
+
matches = line.match(regex)
|
122
|
+
(title = matches[1]) && break if matches
|
123
|
+
end
|
124
|
+
title
|
125
|
+
end
|
126
|
+
|
127
|
+
def find_title_ext_regex(ext)
|
128
|
+
case ext
|
129
|
+
when 'md' then /#(?!#)\s?(.+)/
|
130
|
+
when 'haml' then /%h1[^\s]*\s(.+)/
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
107
134
|
# @param path [String]
|
108
135
|
# @param layout [String]
|
109
136
|
# @param options [Hash] Check `Haml` options.
|
@@ -119,16 +146,24 @@ module LeanWeb
|
|
119
146
|
end
|
120
147
|
end
|
121
148
|
|
149
|
+
# rubocop:disable Metrics/MethodLength
|
122
150
|
def render_by_extension(path, layout, options, &block)
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
151
|
+
ext = File.extname(path)[1..]
|
152
|
+
options = options || template_defaults[ext] || {}
|
153
|
+
|
154
|
+
case ext
|
155
|
+
when 'org'
|
156
|
+
return render_org(path, layout: layout, options: options)
|
157
|
+
when 'md'
|
158
|
+
return render_markdown(path, layout: layout, options: options)
|
159
|
+
when 'haml'
|
160
|
+
@content_for[:title] = find_title('haml', path) \
|
161
|
+
unless @content_for.include?(:title)
|
130
162
|
end
|
163
|
+
|
164
|
+
render_other(path, layout: layout, options: options, &block)
|
131
165
|
end
|
166
|
+
# rubocop:enable Metrics/MethodLength
|
132
167
|
|
133
168
|
def prepare_head(js: nil, jsm: nil, css: nil, raw: nil)
|
134
169
|
head = String.new
|
data/lib/leanweb/controller.rb
CHANGED
@@ -59,6 +59,12 @@ module LeanWeb
|
|
59
59
|
Tilt[ext].new(path, 1, options || template_defaults[ext] || {})
|
60
60
|
end
|
61
61
|
|
62
|
+
# Render response for missing static action methods. Called from
|
63
|
+
# {Route#respond}.
|
64
|
+
def default_static_action(view_path)
|
65
|
+
render_response(view_path)
|
66
|
+
end
|
67
|
+
|
62
68
|
# Relative route to path from public directory considering current route.
|
63
69
|
#
|
64
70
|
# @param path [String] path from public directory, never begins with `/`.
|
@@ -70,9 +76,28 @@ module LeanWeb
|
|
70
76
|
@base_url + path
|
71
77
|
end
|
72
78
|
|
79
|
+
# Get absolute path for a file within {VIEW_PATH}.
|
80
|
+
# @param path [String] Can be:
|
81
|
+
# - A full path, starts with `/`.
|
82
|
+
# - A path relative to {VIEW_PATH}.
|
83
|
+
# - A path relative to current @route.path directory, starts with `./`.
|
84
|
+
# @return [String] Absolute path.
|
85
|
+
def absolute_view_path(path)
|
86
|
+
return path if path.start_with?('/')
|
87
|
+
|
88
|
+
view_path = String.new(LeanWeb::VIEW_PATH)
|
89
|
+
|
90
|
+
if path.start_with?('./')
|
91
|
+
view_path << @route.path.sub(%r{/[^/]*$}, '')
|
92
|
+
path = path[2..]
|
93
|
+
end
|
94
|
+
|
95
|
+
path == '' ? view_path : "#{view_path}/#{path}"
|
96
|
+
end
|
97
|
+
|
73
98
|
# Request params.
|
74
99
|
def params
|
75
|
-
@request
|
100
|
+
@request&.params
|
76
101
|
end
|
77
102
|
|
78
103
|
protected
|
@@ -81,11 +106,5 @@ module LeanWeb
|
|
81
106
|
def template_defaults
|
82
107
|
{}
|
83
108
|
end
|
84
|
-
|
85
|
-
# @param path [String]
|
86
|
-
# @return [String] Full path.
|
87
|
-
def absolute_view_path(path)
|
88
|
-
path[0] == '/' ? path : "#{LeanWeb::VIEW_PATH}/#{path}"
|
89
|
-
end
|
90
109
|
end
|
91
110
|
end
|
data/lib/leanweb/route.rb
CHANGED
@@ -63,12 +63,20 @@ module LeanWeb
|
|
63
63
|
str_path[-1] == '/' ? 'index' : File.basename(str_path)
|
64
64
|
end
|
65
65
|
|
66
|
+
# Respond with a proc, controller method, or in case of true static routes
|
67
|
+
# a rendering of {VIEW_PATH}/{path} with any file extension.
|
68
|
+
#
|
66
69
|
# @param request [Rack::Request]
|
67
70
|
# @return [Array] a valid rack response.
|
68
71
|
def respond(request)
|
69
72
|
return respond_proc(request) if @action.instance_of?(Proc)
|
70
73
|
|
71
74
|
respond_method(request)
|
75
|
+
rescue NoMethodError
|
76
|
+
raise unless @static == true && (view_path = guess_view_path)
|
77
|
+
|
78
|
+
controller = default_controller_class.new(self)
|
79
|
+
controller.default_static_action(view_path)
|
72
80
|
end
|
73
81
|
|
74
82
|
# String path, independent if {#path} is Regexp or String.
|
@@ -141,7 +149,14 @@ module LeanWeb
|
|
141
149
|
end
|
142
150
|
|
143
151
|
def default_action_action
|
144
|
-
"#{path_basename.gsub(
|
152
|
+
"#{path_basename.gsub(/[.-]/, '_')}_#{@method.downcase}".to_sym
|
153
|
+
end
|
154
|
+
|
155
|
+
def default_controller_class
|
156
|
+
require_relative("#{CONTROLLER_PATH}/#{DEFAULT_CONTROLLER.to_s.snakeize}")
|
157
|
+
Object.const_get(DEFAULT_CONTROLLER)
|
158
|
+
rescue LoadError
|
159
|
+
Controller
|
145
160
|
end
|
146
161
|
|
147
162
|
# @param request [Rack::Request]
|
@@ -160,8 +175,7 @@ module LeanWeb
|
|
160
175
|
# @return [Array] a valid Rack response.
|
161
176
|
def respond_proc(request)
|
162
177
|
params = action_params(request.path)
|
163
|
-
|
164
|
-
controller = Object.const_get(DEFAULT_CONTROLLER).new(self, request)
|
178
|
+
controller = default_controller_class.new(self, request)
|
165
179
|
return controller.instance_exec(**params, &@action) \
|
166
180
|
if params.instance_of?(Hash)
|
167
181
|
|
@@ -188,7 +202,7 @@ module LeanWeb
|
|
188
202
|
def output_path(path, content_type)
|
189
203
|
out_path =
|
190
204
|
if path[-1] == '/'
|
191
|
-
String.new("#{PUBLIC_PATH}#{path}
|
205
|
+
String.new("#{PUBLIC_PATH}#{path}index")
|
192
206
|
else
|
193
207
|
String.new("#{PUBLIC_PATH}#{path}")
|
194
208
|
end
|
@@ -199,5 +213,15 @@ module LeanWeb
|
|
199
213
|
|
200
214
|
out_path
|
201
215
|
end
|
216
|
+
|
217
|
+
def guess_view_path
|
218
|
+
return if @path.instance_of?(Regexp)
|
219
|
+
|
220
|
+
view_path = String.new("#{LeanWeb::VIEW_PATH}#{@path}")
|
221
|
+
view_path << 'index' if @path[-1] == '/' # add index if is index
|
222
|
+
view_path.sub!(%r{\.[^/]+$}, '') # drop static file extension if set
|
223
|
+
|
224
|
+
Dir["#{view_path}.*"].first # return first file match or nil
|
225
|
+
end
|
202
226
|
end
|
203
227
|
end
|
data/lib/leanweb/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: leanweb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Felix Freeman
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-11-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rack
|
@@ -222,7 +222,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
222
222
|
- !ruby/object:Gem::Version
|
223
223
|
version: '0'
|
224
224
|
requirements: []
|
225
|
-
rubygems_version: 3.3.
|
225
|
+
rubygems_version: 3.3.23
|
226
226
|
signing_key:
|
227
227
|
specification_version: 4
|
228
228
|
summary: LeanWeb is a minimal hybrid static / dynamic web framework
|