stir_fry 0.1.0 → 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/CHANGELOG.md +9 -1
- data/Gemfile +2 -0
- data/README.md +11 -6
- data/bin/stirfry +28 -0
- data/lib/stir_fry/app.rb +4 -6
- data/lib/stir_fry/cli/options.rb +118 -0
- data/lib/stir_fry/pages/not_found_page.rb +6 -3
- data/lib/stir_fry/pages/routes_page.rb +5 -4
- data/lib/stir_fry/static/stir_fry.css +65 -0
- data/lib/stir_fry/version.rb +1 -1
- data/lib/stir_fry.rb +7 -117
- data/stir_fry.gemspec +4 -1
- metadata +6 -16
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: ed1a83ba5a7f03e897667e5bcbd985e9f41ba88a891713b4f7b030f7a117f80a
|
|
4
|
+
data.tar.gz: 71883f4158b897b0f15b16d465f4ceee3a0c94bd8e9ba47924ce467218a575f4
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 5e39ad7677be38e3c105687812c5789394313fb2d24a493632e65de33742d419cb8a4997fb0939bafabb7dfe06f3f782a98a49bb02af45e986a3e3a40870a7ff
|
|
7
|
+
data.tar.gz: 5d5cb8dd4de5bc0d326d2ca7b19b3811f03f1bb92a87254601f749436033a9d86c5f5f2ae5dcec175c9533d78578e6124940bfb2a94a7e1245e7141e18ec1568
|
data/CHANGELOG.md
CHANGED
|
@@ -1,6 +1,14 @@
|
|
|
1
1
|
## [Unreleased]
|
|
2
2
|
|
|
3
|
-
## [0.1.
|
|
3
|
+
## [0.1.2] - 2026-09-07
|
|
4
|
+
|
|
5
|
+
- Added a `stirfry` cli command to gemspec files so it is usable
|
|
6
|
+
|
|
7
|
+
## [0.1.1] - 2026-09-07
|
|
8
|
+
|
|
9
|
+
- Added a `stirfry` cli command for easy development running.
|
|
10
|
+
|
|
11
|
+
## [0.1.0] - 2026-09-06
|
|
4
12
|
|
|
5
13
|
Initial release of the whole framework including:
|
|
6
14
|
|
data/Gemfile
CHANGED
|
@@ -7,6 +7,7 @@ gemspec
|
|
|
7
7
|
gem "irb"
|
|
8
8
|
gem "pstore"
|
|
9
9
|
gem "puma"
|
|
10
|
+
gem "rackup"
|
|
10
11
|
gem "rake", "~> 13.0"
|
|
11
12
|
gem "rdoc"
|
|
12
13
|
gem "rerun"
|
|
@@ -14,3 +15,4 @@ gem "rspec", "~> 3.13"
|
|
|
14
15
|
gem "rubocop", "~> 1.21"
|
|
15
16
|
gem "rubocop-rake", ">= 0.7.1"
|
|
16
17
|
gem "rubocop-rspec", "~> 3.10", require: false
|
|
18
|
+
gem "terminal-notifier"
|
data/README.md
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
|
-
# StirFry
|
|
1
|
+
# StirFry 🥡
|
|
2
2
|
A small, simple web framework that lets you enjoy ruby with a JSX type flavour.
|
|
3
|
+
Have a little fun! Mix it up!
|
|
4
|
+
|
|
5
|
+
- [Documentation](https://timanema.com/stir_fry/)
|
|
6
|
+
- [RubyGems](https://rubygems.org/gems/stir_fry)
|
|
7
|
+
- [Code of Conduct](CODE_OF_CONDUCT.md)
|
|
8
|
+
- [License](https://opensource.org/licenses/MIT)
|
|
3
9
|
|
|
4
10
|
## Installation
|
|
5
11
|
|
|
@@ -36,7 +42,8 @@ __END__
|
|
|
36
42
|
|
|
37
43
|
### app.rb
|
|
38
44
|
|
|
39
|
-
```
|
|
45
|
+
```ruby
|
|
46
|
+
require "stir_fry"
|
|
40
47
|
require "layout"
|
|
41
48
|
require "home"
|
|
42
49
|
|
|
@@ -48,8 +55,6 @@ class App < StirFry::App
|
|
|
48
55
|
response.text("Hello #{req.args["name"]}")
|
|
49
56
|
end
|
|
50
57
|
end
|
|
51
|
-
|
|
52
|
-
StirFry.run!(App)
|
|
53
58
|
```
|
|
54
59
|
|
|
55
60
|
See the `/examples` directory for more in-depth examples.
|
|
@@ -77,8 +82,8 @@ __END__
|
|
|
77
82
|
After checking out the repo,
|
|
78
83
|
|
|
79
84
|
- run `bundle install` to install dependencies.
|
|
80
|
-
- run
|
|
81
|
-
- run
|
|
85
|
+
- run `bundle exec stirfry ./example/todos` to run the example todo app.
|
|
86
|
+
- run `bundle exec stirfry ./example/chat` to run the example chat app.
|
|
82
87
|
- run `rake` to run the specs, rubocop and rdoc.
|
|
83
88
|
|
|
84
89
|
## Further Reading
|
data/bin/stirfry
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
$LOAD_PATH << File.expand_path(File.join(__dir__, "..", "lib"))
|
|
5
|
+
|
|
6
|
+
require "bundler/setup"
|
|
7
|
+
require "stir_fry"
|
|
8
|
+
require "stir_fry/cli/options"
|
|
9
|
+
require "rerun"
|
|
10
|
+
require "rackup"
|
|
11
|
+
require "yaml"
|
|
12
|
+
|
|
13
|
+
options = StirFry::CLI::Options.parse!
|
|
14
|
+
|
|
15
|
+
return unless options.key?(:config) # indicates early return from parse
|
|
16
|
+
|
|
17
|
+
config_path = options.fetch(:config)
|
|
18
|
+
yaml_options = File.exist?(config_path) ? YAML.load_file(config_path) : {}
|
|
19
|
+
options = yaml_options.merge(options)
|
|
20
|
+
|
|
21
|
+
rackup_options = []
|
|
22
|
+
rackup_options << "--host #{options.dig(:rackup, :host)}"
|
|
23
|
+
rackup_options << "--port #{options.dig(:rackup, :port)}"
|
|
24
|
+
rackup_options << "--quiet" if options.key?(:quiet)
|
|
25
|
+
rackup_options << "--warn" if options.key?(:warn)
|
|
26
|
+
command = "rackup #{rackup_options.join(" ")} #{options[:rackup_file]}"
|
|
27
|
+
|
|
28
|
+
Rerun::Runner.keep_running(command, options[:rerun])
|
data/lib/stir_fry/app.rb
CHANGED
|
@@ -17,8 +17,6 @@ module StirFry
|
|
|
17
17
|
# end
|
|
18
18
|
# get "/todo", Todos::List
|
|
19
19
|
# end
|
|
20
|
-
#
|
|
21
|
-
# StirFry.run!(App)
|
|
22
20
|
# ```
|
|
23
21
|
class App
|
|
24
22
|
DEFAULT_ERROR_HANDLERS = { # :nodoc: disable in production
|
|
@@ -35,7 +33,7 @@ module StirFry
|
|
|
35
33
|
|
|
36
34
|
class << self
|
|
37
35
|
def routes = @routes ||= {} # :nodoc:
|
|
38
|
-
def
|
|
36
|
+
def route_table = @route_table ||= [] # :nodoc:
|
|
39
37
|
def error_handlers = @error_handlers ||= DEFAULT_ERROR_HANDLERS.dup # :nodoc:
|
|
40
38
|
def call(env) = root_app.call(env) # :nodoc:
|
|
41
39
|
|
|
@@ -167,7 +165,7 @@ module StirFry
|
|
|
167
165
|
# `route("GET", "/")`
|
|
168
166
|
def route(verb, pattern, klass, &block)
|
|
169
167
|
path_pattern = Mustermann.new(route_prefix + pattern)
|
|
170
|
-
|
|
168
|
+
route_table << [verb, path_pattern.to_s] unless path_pattern.to_s.start_with?("/stir_fry")
|
|
171
169
|
(routes[verb] ||= []) << [path_pattern, route_handler(klass || block)]
|
|
172
170
|
end
|
|
173
171
|
|
|
@@ -259,8 +257,8 @@ module StirFry
|
|
|
259
257
|
handle_error(e)
|
|
260
258
|
end
|
|
261
259
|
|
|
262
|
-
def
|
|
263
|
-
self.class.
|
|
260
|
+
def route_table # :nodoc:
|
|
261
|
+
self.class.route_table
|
|
264
262
|
end
|
|
265
263
|
|
|
266
264
|
private
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "json"
|
|
4
|
+
require "optparse"
|
|
5
|
+
require "pathname"
|
|
6
|
+
|
|
7
|
+
module StirFry
|
|
8
|
+
module CLI # :nodoc:
|
|
9
|
+
# A class that handled CLI options for the cli which contains flags for both
|
|
10
|
+
# rerun and rackup.
|
|
11
|
+
class Options # :nodoc:
|
|
12
|
+
# rubocop:disable Metrics/MethodLength, Metrics/BlockLength, Metrics/AbcSize
|
|
13
|
+
def self.parse!(args: ARGV)
|
|
14
|
+
options = { rerun: {}, rackup: {} }
|
|
15
|
+
|
|
16
|
+
option_parser = OptionParser.new("", 24, " ") do |o|
|
|
17
|
+
o.banner = "Usage: stirfry [options] [application_directory]"
|
|
18
|
+
|
|
19
|
+
o.separator ""
|
|
20
|
+
o.separator "Uses the rerun gem and rackup to run your development app and reload it when needed."
|
|
21
|
+
o.separator "Version: #{StirFry::VERSION}"
|
|
22
|
+
|
|
23
|
+
o.separator ""
|
|
24
|
+
o.separator "Options:"
|
|
25
|
+
o.on("-d dir", "--dir dir",
|
|
26
|
+
"directory to watch. Specify multiple paths with ',' or separate '-d dir' " \
|
|
27
|
+
"option pairs. (default ./ )") do |dir|
|
|
28
|
+
(options[:rerun][:dir] ||= []).concat(dir.split(","))
|
|
29
|
+
end
|
|
30
|
+
o.on("-p pattern", "--pattern pattern", "file glob to watch, (default \"**/*\")") do |pattern|
|
|
31
|
+
options[:rerun][:pattern] = pattern
|
|
32
|
+
end
|
|
33
|
+
o.on("-i pattern", "--ignore pattern", "file glob(s) to ignore.") do |pattern|
|
|
34
|
+
(options[:rerun][:ignore] ||= []) << pattern
|
|
35
|
+
end
|
|
36
|
+
o.on("-n name", "--name name",
|
|
37
|
+
"name of app used in logs and notifications (default \"#{rerun_defaults[:name]}\")") do |name|
|
|
38
|
+
options[:rerun][:name] = name
|
|
39
|
+
end
|
|
40
|
+
o.on("--notify", "send messages through a desktop notification application.") do
|
|
41
|
+
options[:rerun][:notify] = os_notifier
|
|
42
|
+
end
|
|
43
|
+
o.on("-o", "--host HOST", "listen on HOST (default: #{rackup_defaults[:host]})") do |host|
|
|
44
|
+
options[:rackup][:host] = host
|
|
45
|
+
end
|
|
46
|
+
o.on("-p", "--port PORT", "use PORT (default: #{rackup_defaults[:port]})") do |port|
|
|
47
|
+
options[:rackup][:port] = port
|
|
48
|
+
end
|
|
49
|
+
o.on("-v", "--verbose", "output more logs") { options[:rerun][:verbose] = options[:verbose] = true }
|
|
50
|
+
o.on("-w", "--warn", "turn warnings on for your script") { options[:rerun][:warn] = options[:warn] = true }
|
|
51
|
+
o.on("-q", "--quiet", "turn off logging") { options[:rerun][:quiet] = options[:quiet] = true }
|
|
52
|
+
o.on_tail("--config config_filepath", "load config from path (default: .stirfry)") do |value|
|
|
53
|
+
options[:config] = value
|
|
54
|
+
end
|
|
55
|
+
o.on_tail("-h", "--help", "--usage", "show this message") do
|
|
56
|
+
puts o
|
|
57
|
+
return {}
|
|
58
|
+
end
|
|
59
|
+
o.on_tail("--version", "show version") do
|
|
60
|
+
puts StirFry::VERSION
|
|
61
|
+
return {}
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
begin
|
|
66
|
+
option_parser.parse! args
|
|
67
|
+
rescue OptionParser::InvalidOption => e
|
|
68
|
+
warn e.message
|
|
69
|
+
abort option_parser.to_s
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
options[:rackup] = rackup_defaults.dup.merge(options[:rackup])
|
|
73
|
+
options[:rerun] = rerun_defaults.dup.merge(options[:rerun])
|
|
74
|
+
options[:config] ||= ".stirfry"
|
|
75
|
+
options[:app_directory] = args.last && !args.last.empty? ? args.last.strip : "."
|
|
76
|
+
options[:rackup_file] = File.expand_path("config.ru", options[:app_directory])
|
|
77
|
+
options
|
|
78
|
+
end
|
|
79
|
+
# rubocop:enable Metrics/MethodLength, Metrics/BlockLength, Metrics/AbcSize
|
|
80
|
+
|
|
81
|
+
def self.validate_enum!(opt_name, enum)
|
|
82
|
+
raise OptionParser::InvalidOption, "unknown #{opt_name}: #{e}" unless enum.include?(e)
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def self.mac? = RUBY_PLATFORM =~ /darwin/i
|
|
86
|
+
def self.windows? = RUBY_PLATFORM =~ /(mswin|mingw32)/i
|
|
87
|
+
def self.linux? = RUBY_PLATFORM =~ /linux/i
|
|
88
|
+
|
|
89
|
+
def self.rackup_defaults
|
|
90
|
+
@rackup_defaults ||= {
|
|
91
|
+
host: "localhost",
|
|
92
|
+
port: 9292
|
|
93
|
+
}
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
def self.rerun_defaults
|
|
97
|
+
{
|
|
98
|
+
dir: [+"."],
|
|
99
|
+
ignore: [],
|
|
100
|
+
name: Pathname.getwd.basename.to_s.tr("_-", " ").split.map(&:capitalize).join(" "),
|
|
101
|
+
notify: false,
|
|
102
|
+
pattern: "**/*",
|
|
103
|
+
clear: true,
|
|
104
|
+
wait: 2,
|
|
105
|
+
signal: "TERM,INT,KILL"
|
|
106
|
+
}
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
def self.os_notifier
|
|
110
|
+
return "osx" if mac?
|
|
111
|
+
return "notify-send" if linux?
|
|
112
|
+
|
|
113
|
+
warn "no notifier supported for windows" if windows?
|
|
114
|
+
nil
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
end
|
|
@@ -23,9 +23,12 @@ __END__
|
|
|
23
23
|
<section class="error-page">
|
|
24
24
|
<p class="error-page__code">404</p>
|
|
25
25
|
<p class="error-page__message">Request path did not match any registered routes.</p>
|
|
26
|
-
<ul class="error-page__backtrace">
|
|
27
|
-
{application.all_routes.map { |route| <li>{route}</li> }.join }
|
|
28
|
-
</ul>
|
|
29
26
|
</section>
|
|
27
|
+
<nav class="route-list">
|
|
28
|
+
<p class="route-list__caption">Registered routes</p>
|
|
29
|
+
<ul class="route-list__items">
|
|
30
|
+
{application.route_table.map { |verb, path| <li class="route-list__item"><span class="route-list__verb" data-verb={verb}>{verb}</span><code class="route-list__path">{path}</code></li> }.join }
|
|
31
|
+
</ul>
|
|
32
|
+
</nav>
|
|
30
33
|
</section>
|
|
31
34
|
</StirFry.Pages.Layout>
|
|
@@ -12,10 +12,11 @@ __END__
|
|
|
12
12
|
<StirFry.Pages.Layout>
|
|
13
13
|
<section>
|
|
14
14
|
<header><h1>Routes</h1></header>
|
|
15
|
-
<
|
|
16
|
-
<
|
|
17
|
-
|
|
15
|
+
<nav class="route-list">
|
|
16
|
+
<p class="route-list__caption">{ "#{application.route_table.length} registered routes" }</p>
|
|
17
|
+
<ul class="route-list__items">
|
|
18
|
+
{application.route_table.map { |verb, path| <li class="route-list__item"><span class="route-list__verb" data-verb={verb}>{verb}</span><code class="route-list__path">{path}</code></li> }.join }
|
|
18
19
|
</ul>
|
|
19
|
-
</
|
|
20
|
+
</nav>
|
|
20
21
|
</section>
|
|
21
22
|
</StirFry.Pages.Layout>
|
|
@@ -62,3 +62,68 @@ ul.error-page__backtrace {
|
|
|
62
62
|
text-align: left;
|
|
63
63
|
list-style-type: none;
|
|
64
64
|
}
|
|
65
|
+
|
|
66
|
+
.route-list {
|
|
67
|
+
margin-top: 2rem;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
.route-list__caption {
|
|
71
|
+
margin: 0 0 0.75rem;
|
|
72
|
+
color: var(--muted);
|
|
73
|
+
font-size: 0.8rem;
|
|
74
|
+
font-weight: 600;
|
|
75
|
+
text-transform: uppercase;
|
|
76
|
+
letter-spacing: 0.06em;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
.route-list__items {
|
|
80
|
+
margin: 0;
|
|
81
|
+
padding: 0;
|
|
82
|
+
list-style: none;
|
|
83
|
+
border: 1px solid #e6e6e6;
|
|
84
|
+
border-radius: 6px;
|
|
85
|
+
overflow: hidden;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
.route-list__item {
|
|
89
|
+
display: flex;
|
|
90
|
+
align-items: center;
|
|
91
|
+
gap: 0.75rem;
|
|
92
|
+
padding: 0.55rem 0.9rem;
|
|
93
|
+
background: #fff;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
.route-list__item:nth-child(even) {
|
|
97
|
+
background: #f7f7f7;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
.route-list__item:hover {
|
|
101
|
+
background: #eef6f0;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
.route-list__verb {
|
|
105
|
+
flex: none;
|
|
106
|
+
min-width: 3.75rem;
|
|
107
|
+
padding: 0.15rem 0.5rem;
|
|
108
|
+
border-radius: 3px;
|
|
109
|
+
background: var(--muted);
|
|
110
|
+
color: #fff;
|
|
111
|
+
font-family: Menlo, Consolas, "Liberation Mono", monospace;
|
|
112
|
+
font-size: 0.72rem;
|
|
113
|
+
font-weight: 700;
|
|
114
|
+
letter-spacing: 0.04em;
|
|
115
|
+
text-align: center;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
.route-list__verb[data-verb="GET"] { background: var(--ruby-green); }
|
|
119
|
+
.route-list__verb[data-verb="POST"] { background: #1f6feb; }
|
|
120
|
+
.route-list__verb[data-verb="PUT"],
|
|
121
|
+
.route-list__verb[data-verb="PATCH"] { background: #b8860b; }
|
|
122
|
+
.route-list__verb[data-verb="DELETE"] { background: var(--ruby-red); }
|
|
123
|
+
|
|
124
|
+
.route-list__path {
|
|
125
|
+
font-family: Menlo, Consolas, "Liberation Mono", monospace;
|
|
126
|
+
font-size: 0.9rem;
|
|
127
|
+
color: var(--ink);
|
|
128
|
+
word-break: break-all;
|
|
129
|
+
}
|
data/lib/stir_fry/version.rb
CHANGED
data/lib/stir_fry.rb
CHANGED
|
@@ -40,58 +40,6 @@ module StirFry
|
|
|
40
40
|
SIGNALS = %i[INT TERM].freeze # :nodoc:
|
|
41
41
|
|
|
42
42
|
class << self
|
|
43
|
-
attr_reader :running_server # :nodoc:
|
|
44
|
-
|
|
45
|
-
##
|
|
46
|
-
# Start the application server for an App.
|
|
47
|
-
#
|
|
48
|
-
# Example:
|
|
49
|
-
#
|
|
50
|
-
# ```ruby
|
|
51
|
-
# class App < StirFry::App
|
|
52
|
-
# get "/" { |request:, response:| response.text("Hello world") }
|
|
53
|
-
# end
|
|
54
|
-
#
|
|
55
|
-
# StirFry.run!(App)
|
|
56
|
-
# ```
|
|
57
|
-
#
|
|
58
|
-
# Options:
|
|
59
|
-
#
|
|
60
|
-
# - port [int] port to listen on for the server.
|
|
61
|
-
# Defaults to 8080 in development and 80 in production.
|
|
62
|
-
# - host [string] host to bind on.
|
|
63
|
-
# Default to `localhost` in development and `0.0.0.0` in production
|
|
64
|
-
# - logger [Logger] logger to output requests and app messages to.
|
|
65
|
-
# Defaults to new semantic logger.
|
|
66
|
-
# - log_level [Symbol] the log level or limit output of the log.
|
|
67
|
-
# options: (:trace, :debug, :info, :warn, :error, :fatal)
|
|
68
|
-
# default: :trace in development and :info in production.
|
|
69
|
-
# - log_format [Symbol] the output format of the semantic logger.
|
|
70
|
-
# options: (:default, :color, :json, :logfmt)
|
|
71
|
-
# - log_stdout disable stdout logging.
|
|
72
|
-
# default: true
|
|
73
|
-
# - log_file set a filepath to output logs to.
|
|
74
|
-
# default: nil, only outputs to stdout.
|
|
75
|
-
#
|
|
76
|
-
def run!(app_klass, **options)
|
|
77
|
-
return unless running_server.nil?
|
|
78
|
-
|
|
79
|
-
Rackup::Handler.default.run(app_klass, **extract_options(app_klass, **options)) do |server|
|
|
80
|
-
at_exit { quit! }
|
|
81
|
-
SIGNALS.each { |signal| chain_trap(signal) { quit! } }
|
|
82
|
-
@logger.info("Server started", **server_info(server))
|
|
83
|
-
server.threaded = true if server.respond_to? :threaded=
|
|
84
|
-
@running_server = server
|
|
85
|
-
end
|
|
86
|
-
ensure
|
|
87
|
-
quit!
|
|
88
|
-
end
|
|
89
|
-
|
|
90
|
-
##
|
|
91
|
-
# Returns the running status of the server. If `run!` has not already been called
|
|
92
|
-
# then this will return false.
|
|
93
|
-
def running? = !running_server.nil?
|
|
94
|
-
|
|
95
43
|
# Is the set environment setting evaluated from environment variables APP_ENV,
|
|
96
44
|
# RACK_ENV or ENV. It defaults to :development.
|
|
97
45
|
def app_env = @app_env ||= (ENV["APP_ENV"] || ENV["RACK_ENV"] || ENV["ENV"] || :development).to_sym
|
|
@@ -106,75 +54,17 @@ module StirFry
|
|
|
106
54
|
def production? = app_end == :production
|
|
107
55
|
|
|
108
56
|
# Logger is the app wide logger for any app messages.
|
|
109
|
-
def logger = @logger ||= default_logger
|
|
110
|
-
|
|
111
|
-
##
|
|
112
|
-
# Stops the running server if it is running. If it is not running then this is
|
|
113
|
-
# a no-op
|
|
114
|
-
def quit!
|
|
115
|
-
return if running_server.nil?
|
|
116
|
-
|
|
117
|
-
running_server.respond_to?(:stop!) ? running_server.stop! : running_server.stop
|
|
118
|
-
end
|
|
57
|
+
def logger = @logger ||= default_logger
|
|
119
58
|
|
|
120
59
|
private
|
|
121
60
|
|
|
122
|
-
def
|
|
123
|
-
@port = options.fetch(:Port, options.fetch(:port, default_port)) || default_port
|
|
124
|
-
@host = options.fetch(:Host, options.fetch(:host, default_host)) || default_host
|
|
125
|
-
@logger = options.delete(:logger) || default_logger(klass, options)
|
|
126
|
-
dev_null = Logger.new(File.open(File::NULL, "w"))
|
|
127
|
-
{
|
|
128
|
-
# Set the capitalized options in case the downcased options are set.
|
|
129
|
-
Port: @port,
|
|
130
|
-
Host: @host,
|
|
131
|
-
# Disable Rack logging
|
|
132
|
-
Logger: dev_null,
|
|
133
|
-
AccessLog: dev_null
|
|
134
|
-
}.merge(options)
|
|
135
|
-
end
|
|
136
|
-
|
|
137
|
-
def server_info(server)
|
|
138
|
-
{
|
|
139
|
-
port: @port,
|
|
140
|
-
host: @host,
|
|
141
|
-
app_env: @app_env,
|
|
142
|
-
threaded: server.respond_to?(:threaded=),
|
|
143
|
-
server: Rackup::Handler.default.name
|
|
144
|
-
}
|
|
145
|
-
end
|
|
146
|
-
|
|
147
|
-
def default_logger(klass, options = {})
|
|
148
|
-
log_format = options.fetch(:log_format, :color) || :color
|
|
149
|
-
log_stdout = options.fetch(:log_silence, false)
|
|
150
|
-
log_file = options.fetch(:log_file, nil)
|
|
151
|
-
|
|
61
|
+
def default_logger
|
|
152
62
|
SemanticLogger.add_signal_handler
|
|
153
|
-
SemanticLogger.application =
|
|
154
|
-
SemanticLogger.environment =
|
|
155
|
-
SemanticLogger.default_level =
|
|
156
|
-
SemanticLogger.add_appender(io: $stdout, formatter:
|
|
157
|
-
SemanticLogger
|
|
158
|
-
SemanticLogger[klass.name.to_s]
|
|
159
|
-
end
|
|
160
|
-
|
|
161
|
-
def default_port
|
|
162
|
-
development? ? "8080" : "80"
|
|
163
|
-
end
|
|
164
|
-
|
|
165
|
-
def default_host
|
|
166
|
-
development? ? "localhost" : "0.0.0.0"
|
|
167
|
-
end
|
|
168
|
-
|
|
169
|
-
def default_log_level
|
|
170
|
-
development? ? :trace : :info
|
|
171
|
-
end
|
|
172
|
-
|
|
173
|
-
def chain_trap(sig, &)
|
|
174
|
-
prev = Signal.trap(sig) do
|
|
175
|
-
yield
|
|
176
|
-
prev.call if prev.respond_to?(:call)
|
|
177
|
-
end
|
|
63
|
+
SemanticLogger.application = "StirFry"
|
|
64
|
+
SemanticLogger.environment = app_env
|
|
65
|
+
SemanticLogger.default_level = :trace
|
|
66
|
+
SemanticLogger.add_appender(io: $stdout, formatter: :color)
|
|
67
|
+
SemanticLogger["StirFry"]
|
|
178
68
|
end
|
|
179
69
|
end
|
|
180
70
|
end
|
data/stir_fry.gemspec
CHANGED
|
@@ -13,10 +13,13 @@ Gem::Specification.new do |spec|
|
|
|
13
13
|
It leverages a JSX like templating language, simple routing definitions
|
|
14
14
|
similar to sinatra and usage of ruby that will make it feel easy and understandable.
|
|
15
15
|
DESC
|
|
16
|
+
spec.post_install_message = " 🐦⬛ Let's Get Cookin! 🥡 "
|
|
16
17
|
spec.homepage = "https://github.com/tanema/stir_fry"
|
|
17
18
|
spec.license = "MIT"
|
|
18
19
|
spec.required_ruby_version = ">= 3.1"
|
|
19
20
|
spec.require_paths = ["lib"]
|
|
21
|
+
spec.bindir = "bin"
|
|
22
|
+
spec.executables = ["stirfry"]
|
|
20
23
|
spec.metadata = {
|
|
21
24
|
"source_code_uri" => "https://github.com/tanema/stir_fry",
|
|
22
25
|
"changelog_uri" => "https://github.com/tanema/stir_fry/blob/main/CHANGELOG.md",
|
|
@@ -26,6 +29,7 @@ Gem::Specification.new do |spec|
|
|
|
26
29
|
"rubygems_mfa_required" => "true"
|
|
27
30
|
}
|
|
28
31
|
spec.files = Dir["lib/**/*"] + [
|
|
32
|
+
"bin/stirfry",
|
|
29
33
|
"README.md",
|
|
30
34
|
"CHANGELOG.md",
|
|
31
35
|
"CODE_OF_CONDUCT.md",
|
|
@@ -39,7 +43,6 @@ Gem::Specification.new do |spec|
|
|
|
39
43
|
spec.add_dependency "rack", ">= 3.0.0", "< 4"
|
|
40
44
|
spec.add_dependency "rack-protection", ">= 3.1"
|
|
41
45
|
spec.add_dependency "rack-session", ">= 2.0.0", "< 3"
|
|
42
|
-
spec.add_dependency "rackup", ">= 2.1"
|
|
43
46
|
spec.add_dependency "rbxrb", ">= 0.1"
|
|
44
47
|
spec.add_dependency "semantic_logger", ">= 5.1"
|
|
45
48
|
end
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: stir_fry
|
|
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
|
- Tim Anema
|
|
@@ -77,20 +77,6 @@ dependencies:
|
|
|
77
77
|
- - "<"
|
|
78
78
|
- !ruby/object:Gem::Version
|
|
79
79
|
version: '3'
|
|
80
|
-
- !ruby/object:Gem::Dependency
|
|
81
|
-
name: rackup
|
|
82
|
-
requirement: !ruby/object:Gem::Requirement
|
|
83
|
-
requirements:
|
|
84
|
-
- - ">="
|
|
85
|
-
- !ruby/object:Gem::Version
|
|
86
|
-
version: '2.1'
|
|
87
|
-
type: :runtime
|
|
88
|
-
prerelease: false
|
|
89
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
90
|
-
requirements:
|
|
91
|
-
- - ">="
|
|
92
|
-
- !ruby/object:Gem::Version
|
|
93
|
-
version: '2.1'
|
|
94
80
|
- !ruby/object:Gem::Dependency
|
|
95
81
|
name: rbxrb
|
|
96
82
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -125,7 +111,8 @@ description: |
|
|
|
125
111
|
similar to sinatra and usage of ruby that will make it feel easy and understandable.
|
|
126
112
|
email:
|
|
127
113
|
- timanema@gmail.com
|
|
128
|
-
executables:
|
|
114
|
+
executables:
|
|
115
|
+
- stirfry
|
|
129
116
|
extensions: []
|
|
130
117
|
extra_rdoc_files: []
|
|
131
118
|
files:
|
|
@@ -135,8 +122,10 @@ files:
|
|
|
135
122
|
- LICENSE
|
|
136
123
|
- README.md
|
|
137
124
|
- Rakefile
|
|
125
|
+
- bin/stirfry
|
|
138
126
|
- lib/stir_fry.rb
|
|
139
127
|
- lib/stir_fry/app.rb
|
|
128
|
+
- lib/stir_fry/cli/options.rb
|
|
140
129
|
- lib/stir_fry/component.rb
|
|
141
130
|
- lib/stir_fry/middleware.rb
|
|
142
131
|
- lib/stir_fry/middleware/logger.rb
|
|
@@ -160,6 +149,7 @@ metadata:
|
|
|
160
149
|
bug_tracker_uri: https://github.com/tanema/stir_fry/issues
|
|
161
150
|
documentation_uri: https://github.com/tanema/stir_fry
|
|
162
151
|
rubygems_mfa_required: 'true'
|
|
152
|
+
post_install_message: " \U0001F426⬛ Let's Get Cookin! \U0001F961 "
|
|
163
153
|
rdoc_options: []
|
|
164
154
|
require_paths:
|
|
165
155
|
- lib
|