snowpack 1.0.0.alpha2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +17 -0
- data/.rspec +3 -0
- data/.tool-versions +1 -0
- data/.travis.yml +16 -0
- data/Brewfile +2 -0
- data/CHANGELOG.md +25 -0
- data/Gemfile +13 -0
- data/LICENSE +21 -0
- data/README.md +116 -0
- data/Rakefile +6 -0
- data/bin/bootstrap +25 -0
- data/exe/snowpack +7 -0
- data/lib/snowpack/application.rb +98 -0
- data/lib/snowpack/application_cli.rb +39 -0
- data/lib/snowpack/cli/application/cli.rb +32 -0
- data/lib/snowpack/cli/application/command.rb +53 -0
- data/lib/snowpack/cli/application/commands/assets/clobber.rb +31 -0
- data/lib/snowpack/cli/application/commands/assets/compile.rb +32 -0
- data/lib/snowpack/cli/application/commands/console.rb +55 -0
- data/lib/snowpack/cli/application/commands/db/create.rb +33 -0
- data/lib/snowpack/cli/application/commands/db/create_migration.rb +38 -0
- data/lib/snowpack/cli/application/commands/db/drop.rb +33 -0
- data/lib/snowpack/cli/application/commands/db/migrate.rb +47 -0
- data/lib/snowpack/cli/application/commands/db/reset.rb +28 -0
- data/lib/snowpack/cli/application/commands/db/rollback.rb +54 -0
- data/lib/snowpack/cli/application/commands/db/sample_data.rb +41 -0
- data/lib/snowpack/cli/application/commands/db/seed.rb +41 -0
- data/lib/snowpack/cli/application/commands/db/structure/dump.rb +38 -0
- data/lib/snowpack/cli/application/commands/db/utils/database.rb +76 -0
- data/lib/snowpack/cli/application/commands/db/utils/database_config.rb +49 -0
- data/lib/snowpack/cli/application/commands/db/version.rb +37 -0
- data/lib/snowpack/cli/application/commands/generate/slice.rb +32 -0
- data/lib/snowpack/cli/application/commands/routes/update.rb +35 -0
- data/lib/snowpack/cli/application/commands.rb +27 -0
- data/lib/snowpack/cli/command.rb +48 -0
- data/lib/snowpack/cli/standalone/cli.rb +14 -0
- data/lib/snowpack/cli/standalone/commands/new.rb +33 -0
- data/lib/snowpack/cli/standalone/commands.rb +13 -0
- data/lib/snowpack/components/formalist.rb +27 -0
- data/lib/snowpack/components/persistence.rb +56 -0
- data/lib/snowpack/components.rb +5 -0
- data/lib/snowpack/console/context.rb +32 -0
- data/lib/snowpack/console/plugins/relation_readers.rb +17 -0
- data/lib/snowpack/console/plugins/slice_readers.rb +33 -0
- data/lib/snowpack/generator.rb +57 -0
- data/lib/snowpack/generators/application/generator.rb +67 -0
- data/lib/snowpack/generators/application/templates/.env-example.tt +10 -0
- data/lib/snowpack/generators/application/templates/.env.test-example.tt +1 -0
- data/lib/snowpack/generators/application/templates/.gitignore +20 -0
- data/lib/snowpack/generators/application/templates/.rspec +2 -0
- data/lib/snowpack/generators/application/templates/Brewfile +4 -0
- data/lib/snowpack/generators/application/templates/Gemfile.tt +46 -0
- data/lib/snowpack/generators/application/templates/Guardfile +7 -0
- data/lib/snowpack/generators/application/templates/Procfile.dev +3 -0
- data/lib/snowpack/generators/application/templates/Procfile.support +1 -0
- data/lib/snowpack/generators/application/templates/README.md.tt +45 -0
- data/lib/snowpack/generators/application/templates/Rakefile +5 -0
- data/lib/snowpack/generators/application/templates/bin/run +7 -0
- data/lib/snowpack/generators/application/templates/config/application.rb.tt +19 -0
- data/lib/snowpack/generators/application/templates/config/puma.rb.tt +14 -0
- data/lib/snowpack/generators/application/templates/config/routes.rb.tt +15 -0
- data/lib/snowpack/generators/application/templates/config.ru +5 -0
- data/lib/snowpack/generators/application/templates/db/migrate/.keep +0 -0
- data/lib/snowpack/generators/application/templates/db/sample_data.rb +1 -0
- data/lib/snowpack/generators/application/templates/db/seed.rb +1 -0
- data/lib/snowpack/generators/application/templates/lib/__application_path__/operation.rb.tt +12 -0
- data/lib/snowpack/generators/application/templates/lib/__application_path__/persistence/relations/.keep +0 -0
- data/lib/snowpack/generators/application/templates/lib/__application_path__/types.rb.tt +11 -0
- data/lib/snowpack/generators/application/templates/lib/__application_path__/web/action.rb.tt +56 -0
- data/lib/snowpack/generators/application/templates/lib/__application_path__/web/view/context.rb.tt +31 -0
- data/lib/snowpack/generators/application/templates/lib/hanami/action/csrf_protection.rb +225 -0
- data/lib/snowpack/generators/application/templates/log/.keep +0 -0
- data/lib/snowpack/generators/application/templates/package.json.tt +25 -0
- data/lib/snowpack/generators/application/templates/public/.keep +0 -0
- data/lib/snowpack/generators/application/templates/script/bootstrap +32 -0
- data/lib/snowpack/generators/application/templates/script/console +26 -0
- data/lib/snowpack/generators/application/templates/script/server +13 -0
- data/lib/snowpack/generators/application/templates/script/setup +27 -0
- data/lib/snowpack/generators/application/templates/script/support +9 -0
- data/lib/snowpack/generators/application/templates/script/test +19 -0
- data/lib/snowpack/generators/application/templates/script/update +13 -0
- data/lib/snowpack/generators/application/templates/spec/spec_helper.rb +13 -0
- data/lib/snowpack/generators/application/templates/spec/suite/.keep +0 -0
- data/lib/snowpack/generators/application/templates/spec/support/suite.rb +9 -0
- data/lib/snowpack/generators/application/templates/system/__application_path__/import.rb.tt +5 -0
- data/lib/snowpack/generators/application/templates/system/boot/assets.rb.tt +17 -0
- data/lib/snowpack/generators/application/templates/system/boot/logger.rb.tt +10 -0
- data/lib/snowpack/generators/application/templates/system/boot/monitor.rb.tt +9 -0
- data/lib/snowpack/generators/application/templates/system/boot/persistence.rb.tt +9 -0
- data/lib/snowpack/generators/application/templates/system/boot/settings.rb.tt +18 -0
- data/lib/snowpack/generators/application/templates/system/boot/web.rb.tt +9 -0
- data/lib/snowpack/generators/slice/generator.rb +62 -0
- data/lib/snowpack/generators/slice/templates/lib/__slice_path__/.keep +0 -0
- data/lib/snowpack/generators/slice/templates/lib/__slice_path__/web/action.rb.tt +10 -0
- data/lib/snowpack/generators/slice/templates/lib/__slice_path__/web/actions/.keep +0 -0
- data/lib/snowpack/generators/slice/templates/lib/__slice_path__/web/view.rb.tt +17 -0
- data/lib/snowpack/generators/slice/templates/lib/__slice_path__/web/views/.keep +0 -0
- data/lib/snowpack/generators/slice/templates/system/__slice_path__/import.rb.tt +9 -0
- data/lib/snowpack/generators/slice/templates/system/__slice_path__/slice.rb.tt +10 -0
- data/lib/snowpack/instrumentation/appsignal/appsignal_ext.rb +13 -0
- data/lib/snowpack/instrumentation/appsignal/que.rb +70 -0
- data/lib/snowpack/instrumentation/appsignal/rack.rb +84 -0
- data/lib/snowpack/roda/web.rb +47 -0
- data/lib/snowpack/slice.rb +85 -0
- data/lib/snowpack/test/suite.rb +164 -0
- data/lib/snowpack/test/tasks.rake +40 -0
- data/lib/snowpack/test_tasks.rb +4 -0
- data/lib/snowpack/types.rb +9 -0
- data/lib/snowpack/version.rb +5 -0
- data/lib/snowpack/view/part_builder.rb +45 -0
- data/lib/snowpack/view/parts/pager.rb +107 -0
- data/lib/snowpack/view/parts/paginated.rb +22 -0
- data/lib/snowpack/web/application.rb +38 -0
- data/lib/snowpack/web/assets.rb +56 -0
- data/lib/snowpack/web/endpoint_resolver.rb +66 -0
- data/lib/snowpack/web/form.rb +38 -0
- data/lib/snowpack/web/plugin.rb +44 -0
- data/lib/snowpack/web/rack_logger.rb +73 -0
- data/lib/snowpack/web/router.rb +58 -0
- data/lib/snowpack/web.rb +20 -0
- data/lib/snowpack.rb +27 -0
- data/snowpack.gemspec +34 -0
- metadata +327 -0
@@ -0,0 +1,38 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "rack"
|
4
|
+
require "hanami/controller"
|
5
|
+
require_relative "router"
|
6
|
+
|
7
|
+
module Snowpack
|
8
|
+
module Web
|
9
|
+
class Application
|
10
|
+
def initialize(application, &routes)
|
11
|
+
resolver = application.config.web.routing.endpoint_resolver.new(
|
12
|
+
application: application,
|
13
|
+
namespace: application.config.web.routing.action_key_namespace,
|
14
|
+
)
|
15
|
+
|
16
|
+
router = Router.new(
|
17
|
+
application: application,
|
18
|
+
endpoint_resolver: resolver,
|
19
|
+
&routes
|
20
|
+
)
|
21
|
+
|
22
|
+
@app = Rack::Builder.new do
|
23
|
+
use application[:rack_monitor]
|
24
|
+
|
25
|
+
router.middlewares.each do |(*middleware, block)|
|
26
|
+
use(*middleware, &block)
|
27
|
+
end
|
28
|
+
|
29
|
+
run router
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def call(env)
|
34
|
+
@app.call(env)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
require "yaml"
|
2
|
+
require "down"
|
3
|
+
|
4
|
+
module Snowpack
|
5
|
+
module Web
|
6
|
+
class Assets
|
7
|
+
attr_reader :root
|
8
|
+
attr_reader :precompiled
|
9
|
+
attr_reader :server_url
|
10
|
+
|
11
|
+
def initialize(root:, precompiled:, server_url: nil)
|
12
|
+
@root = root
|
13
|
+
@precompiled = precompiled
|
14
|
+
@server_url = server_url
|
15
|
+
end
|
16
|
+
|
17
|
+
def [](asset)
|
18
|
+
if precompiled
|
19
|
+
asset_path_from_manifest(asset)
|
20
|
+
else
|
21
|
+
asset_path_on_server(asset)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def read(asset)
|
26
|
+
path = self[asset]
|
27
|
+
|
28
|
+
if File.exist?("#{root}/public#{path}")
|
29
|
+
File.read("#{root}/public#{path}")
|
30
|
+
else
|
31
|
+
Down.open(path).read
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
|
37
|
+
def asset_path_from_manifest(asset)
|
38
|
+
if (hashed_asset = manifest[asset])
|
39
|
+
"/assets/#{hashed_asset}"
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def asset_path_on_server(asset)
|
44
|
+
"#{server_url}/assets/#{asset}"
|
45
|
+
end
|
46
|
+
|
47
|
+
def manifest
|
48
|
+
@manifest ||= YAML.load_file(manifest_path)
|
49
|
+
end
|
50
|
+
|
51
|
+
def manifest_path
|
52
|
+
"#{root}/public/assets/asset-manifest.json"
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# FIXME: This is for the NotCallableEndpointError. It would be good if this
|
4
|
+
# could be require-able without having to bring in all the routing files
|
5
|
+
require "hanami/routing"
|
6
|
+
|
7
|
+
module Snowpack
|
8
|
+
module Web
|
9
|
+
class EndpointResolver
|
10
|
+
attr_reader :application
|
11
|
+
attr_reader :container
|
12
|
+
attr_reader :base_namespace
|
13
|
+
|
14
|
+
def initialize(application:, container: application, namespace:)
|
15
|
+
@application = application
|
16
|
+
@container = container
|
17
|
+
@base_namespace = namespace
|
18
|
+
end
|
19
|
+
|
20
|
+
def sliced(name)
|
21
|
+
raise "Slices can only be mounted from top-level application" unless application.respond_to?(:slices)
|
22
|
+
|
23
|
+
slice = application.slices[name]
|
24
|
+
return unless slice
|
25
|
+
|
26
|
+
self.class.new(
|
27
|
+
application: application,
|
28
|
+
container: slice,
|
29
|
+
namespace: base_namespace,
|
30
|
+
)
|
31
|
+
end
|
32
|
+
|
33
|
+
def call(name, namespace = nil, configuration = nil)
|
34
|
+
endpoint =
|
35
|
+
case name
|
36
|
+
when String
|
37
|
+
resolve_string_identifier(name, namespace, configuration)
|
38
|
+
when Class
|
39
|
+
name.respond_to?(:call) ? name : name.new
|
40
|
+
else
|
41
|
+
name
|
42
|
+
end
|
43
|
+
|
44
|
+
unless endpoint.respond_to?(:call)
|
45
|
+
raise Hanami::Routing::NotCallableEndpointError.new(endpoint)
|
46
|
+
end
|
47
|
+
|
48
|
+
endpoint
|
49
|
+
end
|
50
|
+
|
51
|
+
private
|
52
|
+
|
53
|
+
def resolve_string_identifier(name, namespace, configuration)
|
54
|
+
identifier = [base_namespace, namespace, name].compact.join(".")
|
55
|
+
|
56
|
+
container[identifier].yield_self { |endpoint|
|
57
|
+
if configuration && endpoint.class < Hanami::Action
|
58
|
+
endpoint.with(configuration: configuration)
|
59
|
+
else
|
60
|
+
endpoint
|
61
|
+
end
|
62
|
+
}
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "json"
|
4
|
+
|
5
|
+
require "formalist"
|
6
|
+
require "formalist/elements/standard"
|
7
|
+
|
8
|
+
module Snowpack
|
9
|
+
module Web
|
10
|
+
class Form < ::Formalist::Form
|
11
|
+
setting :prefix
|
12
|
+
|
13
|
+
def self.prefix(value)
|
14
|
+
config.prefix = value
|
15
|
+
end
|
16
|
+
|
17
|
+
def prefix
|
18
|
+
self.class.config.prefix
|
19
|
+
end
|
20
|
+
|
21
|
+
def fill(input: {}, errors: {}, **args)
|
22
|
+
super(input: Hash(input), errors: errors, **args)
|
23
|
+
end
|
24
|
+
|
25
|
+
def to_h(config = {})
|
26
|
+
if config.any?
|
27
|
+
{ast: to_ast, prefix: prefix, config: {global: config}}
|
28
|
+
else
|
29
|
+
{ast: to_ast, prefix: prefix}
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def to_s
|
34
|
+
JSON.generate(to_h)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "dry/system/plugins"
|
4
|
+
require_relative "endpoint_resolver"
|
5
|
+
require_relative "rack_logger"
|
6
|
+
|
7
|
+
module Snowpack
|
8
|
+
module Web
|
9
|
+
module Plugin
|
10
|
+
def self.extended(system)
|
11
|
+
super
|
12
|
+
|
13
|
+
system.setting :web do
|
14
|
+
setting :routing do
|
15
|
+
setting :endpoint_resolver, EndpointResolver
|
16
|
+
setting :action_key_namespace, "web.actions"
|
17
|
+
end
|
18
|
+
|
19
|
+
setting :logging do
|
20
|
+
setting :filter_params, %w[_csrf password password_confirmation]
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
system.after :configure do
|
25
|
+
register_rack_monitor
|
26
|
+
attach_rack_logger
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def register_rack_monitor
|
31
|
+
return self if key?(:rack_monitor)
|
32
|
+
register :rack_monitor, Dry::Monitor::Rack::Middleware.new(self[:notifications])
|
33
|
+
self
|
34
|
+
end
|
35
|
+
|
36
|
+
def attach_rack_logger
|
37
|
+
RackLogger.new(self[:logger], filter_params: config.web.logging.filter_params).attach(self[:rack_monitor])
|
38
|
+
self
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
Dry::System::Plugins.register :web, Plugin
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "json"
|
4
|
+
require "rack/request"
|
5
|
+
|
6
|
+
module Snowpack
|
7
|
+
module Web
|
8
|
+
class RackLogger
|
9
|
+
attr_reader :logger
|
10
|
+
attr_reader :filter_params
|
11
|
+
|
12
|
+
def initialize(logger, filter_params: [])
|
13
|
+
@logger = logger
|
14
|
+
@filter_params = filter_params
|
15
|
+
end
|
16
|
+
|
17
|
+
def attach(rack_monitor)
|
18
|
+
rack_monitor.on :stop do |env:, status:, time:|
|
19
|
+
log_request env, status, time
|
20
|
+
end
|
21
|
+
|
22
|
+
rack_monitor.on :error do |event|
|
23
|
+
log_exception event[:exception]
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def log_request(env, status, time)
|
28
|
+
request = Rack::Request.new(env)
|
29
|
+
|
30
|
+
params = request.GET
|
31
|
+
params = params.merge(Hash(request.POST))
|
32
|
+
|
33
|
+
# TODO: support both roda and hanami params
|
34
|
+
json_params = Hash(request.get_header("roda.json_params"))
|
35
|
+
params = params.merge(json_params)
|
36
|
+
|
37
|
+
data = {
|
38
|
+
method: request.request_method,
|
39
|
+
path: request.path,
|
40
|
+
for: request.get_header("REMOTE_ADDR"),
|
41
|
+
status: status,
|
42
|
+
duration: time,
|
43
|
+
params: filter(params),
|
44
|
+
}
|
45
|
+
|
46
|
+
logger.info JSON.generate(data)
|
47
|
+
end
|
48
|
+
|
49
|
+
def log_exception(e)
|
50
|
+
logger.error e.message
|
51
|
+
logger.error (e.backtrace).join("\n")
|
52
|
+
end
|
53
|
+
|
54
|
+
private
|
55
|
+
|
56
|
+
FILTERED = "[FILTERED]"
|
57
|
+
|
58
|
+
def filter(params)
|
59
|
+
params.each_with_object({}) do |(k, v), h|
|
60
|
+
if filter_params.include?(k)
|
61
|
+
h.update(k => FILTERED)
|
62
|
+
elsif v.is_a?(Hash)
|
63
|
+
h.update(k => filter_params(v))
|
64
|
+
elsif v.is_a?(Array)
|
65
|
+
h.update(k => v.map { |m| m.is_a?(Hash) ? filter_params(m) : m })
|
66
|
+
else
|
67
|
+
h[k] = v
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "hanami/router"
|
4
|
+
|
5
|
+
module Snowpack
|
6
|
+
module Web
|
7
|
+
class Router < Hanami::Router
|
8
|
+
attr_reader :middlewares
|
9
|
+
|
10
|
+
def initialize(application:, **options, &block)
|
11
|
+
@application = application
|
12
|
+
@options = options
|
13
|
+
@middlewares = []
|
14
|
+
|
15
|
+
super(**options, &nil)
|
16
|
+
instance_exec(application, &block) if block
|
17
|
+
freeze overridden: true
|
18
|
+
end
|
19
|
+
|
20
|
+
# Do nothing when the superclass calls freeze during its own initialize
|
21
|
+
# (we need to do it later, after our instance_exec of the routes block)
|
22
|
+
def freeze(overridden: false)
|
23
|
+
super() if overridden
|
24
|
+
end
|
25
|
+
|
26
|
+
# Ensure we always return a rack-conformant result (sometimes we get a
|
27
|
+
# Hanami::Action::Response here, when we actually want the standard rack
|
28
|
+
# 3-element array)
|
29
|
+
def call(*)
|
30
|
+
super.to_a
|
31
|
+
end
|
32
|
+
|
33
|
+
def use(*args, &block)
|
34
|
+
middlewares << (args << block)
|
35
|
+
end
|
36
|
+
|
37
|
+
def mount(app, at:, host: nil, &block)
|
38
|
+
if app.is_a?(Symbol) && (sliced_resolver = @endpoint_resolver.sliced(app))
|
39
|
+
sliced_router = self.class.new(
|
40
|
+
application: @application.slices[app],
|
41
|
+
**@options,
|
42
|
+
endpoint_resolver: sliced_resolver,
|
43
|
+
&block
|
44
|
+
)
|
45
|
+
|
46
|
+
super(sliced_router, at: at, host: host)
|
47
|
+
else
|
48
|
+
super(app, at: at, host: host)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
# Allow router objects to be mounted within themselves
|
53
|
+
def match?(env)
|
54
|
+
match_path?(env)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
data/lib/snowpack/web.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "../snowpack"
|
4
|
+
require_relative "web/application"
|
5
|
+
|
6
|
+
module Snowpack
|
7
|
+
module Web
|
8
|
+
def self.routes(&block)
|
9
|
+
if block
|
10
|
+
@routes = block
|
11
|
+
else
|
12
|
+
@routes
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.application
|
17
|
+
@application ||= Application.new(Snowpack.application, &routes)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
data/lib/snowpack.rb
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "snowpack/version"
|
4
|
+
|
5
|
+
module Snowpack
|
6
|
+
@_mutex = Mutex.new
|
7
|
+
|
8
|
+
def self.application
|
9
|
+
@_mutex.synchronize do
|
10
|
+
raise "Snowpack.application not configured" unless defined?(@_application)
|
11
|
+
|
12
|
+
@_application
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.application?
|
17
|
+
defined?(@_application) && @_application
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.application=(klass)
|
21
|
+
@_mutex.synchronize do
|
22
|
+
raise "Snowpack.application already configured" if defined?(@_application)
|
23
|
+
|
24
|
+
@_application = klass unless klass.name.nil?
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
data/snowpack.gemspec
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
lib = File.expand_path('../lib', __FILE__)
|
2
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
|
+
require 'snowpack/version'
|
4
|
+
|
5
|
+
Gem::Specification.new do |spec|
|
6
|
+
spec.name = "snowpack"
|
7
|
+
spec.version = Snowpack::VERSION
|
8
|
+
spec.authors = ["Tim Riley", "Piotr Solnica"]
|
9
|
+
spec.email = ["tim@icelab.com.au", "piotr@icelab.com.au"]
|
10
|
+
|
11
|
+
spec.summary = "Lightweight application framework for Icelab"
|
12
|
+
spec.description = spec.summary
|
13
|
+
spec.homepage = "https://github.com/icelab/snowpack"
|
14
|
+
|
15
|
+
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
16
|
+
f.match(%r{^(test|spec|features)/})
|
17
|
+
end
|
18
|
+
spec.bindir = "exe"
|
19
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
20
|
+
spec.require_paths = ["lib"]
|
21
|
+
|
22
|
+
spec.add_runtime_dependency "dry-inflector", "~> 0.1"
|
23
|
+
spec.add_runtime_dependency "dry-monitor", "~> 0.3.1"
|
24
|
+
spec.add_runtime_dependency "dry-system", "~> 0.12", ">= 0.12.0"
|
25
|
+
spec.add_runtime_dependency "dry-types", "~> 1.0"
|
26
|
+
spec.add_runtime_dependency "down", "~> 4.0"
|
27
|
+
spec.add_runtime_dependency "hanami-cli" # requires unstable branch from github in application Gemfile
|
28
|
+
spec.add_runtime_dependency "hanami-utils" # requires unstable branch from github in application Gemfile
|
29
|
+
spec.add_runtime_dependency "rack", "~> 2.0"
|
30
|
+
|
31
|
+
spec.add_development_dependency "bundler"
|
32
|
+
spec.add_development_dependency "rake", "~> 12.0"
|
33
|
+
spec.add_development_dependency "rspec", "~> 3.0"
|
34
|
+
end
|