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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d7a00e29a6a5328edd5213cd08821bd05627ac300c11bed5cc473a54059e63fc
4
- data.tar.gz: d529099f09b0056ed4be196a62b0cfea2bcf99c2b0bb4c747116bcf92a8b16ba
3
+ metadata.gz: ed1a83ba5a7f03e897667e5bcbd985e9f41ba88a891713b4f7b030f7a117f80a
4
+ data.tar.gz: 71883f4158b897b0f15b16d465f4ceee3a0c94bd8e9ba47924ce467218a575f4
5
5
  SHA512:
6
- metadata.gz: 59c837dd40c9dc13e80a8d467fd8ce1618cef3c8e4fc5e1dcffe25cc5faefcdb45bd22ffaaf5da531a9e9f6969e481ad8c1a7fcd0cf501c64194c3b516a5cbad
7
- data.tar.gz: 97a6c2f514e52a7304f1900e802d4132ebeaac41ad623c1bcd00202fc1f476b286d6f2a2c825cf6077323d509c283e654f01546debd140885c611adf0044d05f
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.0] - 2026-08-10
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 `./example/todos_app/app.rb` to run the example todo app.
81
- - run `./example/chat_app/app.rb` to run the example chat app.
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 all_routes = @all_routes ||= [] # :nodoc:
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
- all_routes << path_pattern.to_s unless path_pattern.to_s.start_with?("/stir_fry")
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 all_routes # :nodoc:
263
- self.class.all_routes
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
- <section>
16
- <ul class="error-page__backtrace">
17
- {application.all_routes.map { |route| <li>{route}</li> }.join }
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
- </section>
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
+ }
@@ -2,5 +2,5 @@
2
2
 
3
3
  module StirFry
4
4
  # VERSION is the release library version
5
- VERSION = "0.1.0"
5
+ VERSION = "0.1.2"
6
6
  end
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(App)
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 extract_options(klass, **options)
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 = klass.name.to_s
154
- SemanticLogger.environment = @app_env
155
- SemanticLogger.default_level = options.fetch(:log_level, default_log_level) || default_log_level
156
- SemanticLogger.add_appender(io: $stdout, formatter: log_format) unless log_stdout
157
- SemanticLogger.add_appender(filename: log_file, formatter: log_format) unless log_file.nil?
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.0
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