hanami 0.0.0 → 0.7.0

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.
Files changed (168) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +214 -0
  3. data/FEATURES.md +156 -0
  4. data/LICENSE.md +22 -0
  5. data/README.md +80 -15
  6. data/bin/hanami +5 -0
  7. data/hanami.gemspec +27 -12
  8. data/lib/hanami.rb +78 -2
  9. data/lib/hanami/action/csrf_protection.rb +167 -0
  10. data/lib/hanami/action/routing_helpers.rb +40 -0
  11. data/lib/hanami/application.rb +244 -0
  12. data/lib/hanami/application_name.rb +101 -0
  13. data/lib/hanami/cli.rb +119 -0
  14. data/lib/hanami/cli_sub_commands/assets.rb +29 -0
  15. data/lib/hanami/cli_sub_commands/db.rb +124 -0
  16. data/lib/hanami/cli_sub_commands/destroy.rb +102 -0
  17. data/lib/hanami/cli_sub_commands/generate.rb +127 -0
  18. data/lib/hanami/commands/assets/precompile.rb +35 -0
  19. data/lib/hanami/commands/console.rb +90 -0
  20. data/lib/hanami/commands/db/abstract.rb +19 -0
  21. data/lib/hanami/commands/db/apply.rb +14 -0
  22. data/lib/hanami/commands/db/console.rb +50 -0
  23. data/lib/hanami/commands/db/create.rb +14 -0
  24. data/lib/hanami/commands/db/drop.rb +14 -0
  25. data/lib/hanami/commands/db/migrate.rb +19 -0
  26. data/lib/hanami/commands/db/prepare.rb +14 -0
  27. data/lib/hanami/commands/db/version.rb +14 -0
  28. data/lib/hanami/commands/generate/abstract.rb +63 -0
  29. data/lib/hanami/commands/generate/action.rb +262 -0
  30. data/lib/hanami/commands/generate/app.rb +116 -0
  31. data/lib/hanami/commands/generate/mailer.rb +118 -0
  32. data/lib/hanami/commands/generate/migration.rb +63 -0
  33. data/lib/hanami/commands/generate/model.rb +96 -0
  34. data/lib/hanami/commands/new/abstract.rb +128 -0
  35. data/lib/hanami/commands/new/app.rb +116 -0
  36. data/lib/hanami/commands/new/container.rb +102 -0
  37. data/lib/hanami/commands/routes.rb +41 -0
  38. data/lib/hanami/commands/server.rb +79 -0
  39. data/lib/hanami/config/configure.rb +17 -0
  40. data/lib/hanami/config/cookies.rb +68 -0
  41. data/lib/hanami/config/framework_configuration.rb +42 -0
  42. data/lib/hanami/config/load_paths.rb +27 -0
  43. data/lib/hanami/config/mapper.rb +36 -0
  44. data/lib/hanami/config/mapping.rb +12 -0
  45. data/lib/hanami/config/routes.rb +16 -0
  46. data/lib/hanami/config/security.rb +58 -0
  47. data/lib/hanami/config/sessions.rb +97 -0
  48. data/lib/hanami/configuration.rb +1728 -0
  49. data/lib/hanami/container.rb +59 -0
  50. data/lib/hanami/environment.rb +485 -0
  51. data/lib/hanami/frameworks.rb +14 -0
  52. data/lib/hanami/generators/action/action.rb.tt +8 -0
  53. data/lib/hanami/generators/action/action_spec.minitest.tt +12 -0
  54. data/lib/hanami/generators/action/action_spec.rspec.tt +11 -0
  55. data/lib/hanami/generators/action/action_without_view.rb.tt +9 -0
  56. data/lib/hanami/generators/action/template.tt +0 -0
  57. data/lib/hanami/generators/action/view.rb.tt +5 -0
  58. data/lib/hanami/generators/action/view_spec.minitest.tt +13 -0
  59. data/lib/hanami/generators/action/view_spec.rspec.tt +12 -0
  60. data/lib/hanami/generators/app/.gitkeep.tt +1 -0
  61. data/lib/hanami/generators/app/application.rb.tt +273 -0
  62. data/lib/hanami/generators/app/config/initializers/.gitkeep +0 -0
  63. data/lib/hanami/generators/app/config/routes.rb.tt +2 -0
  64. data/lib/hanami/generators/app/favicon.ico +0 -0
  65. data/lib/hanami/generators/app/templates/application.html.erb.tt +10 -0
  66. data/lib/hanami/generators/app/views/application_layout.rb.tt +7 -0
  67. data/lib/hanami/generators/application/app/.env.development.tt +4 -0
  68. data/lib/hanami/generators/application/app/.env.test.tt +4 -0
  69. data/lib/hanami/generators/application/app/.env.tt +1 -0
  70. data/lib/hanami/generators/application/app/.gitignore +0 -0
  71. data/lib/hanami/generators/application/app/.gitkeep +1 -0
  72. data/lib/hanami/generators/application/app/Gemfile.tt +37 -0
  73. data/lib/hanami/generators/application/app/Rakefile.minitest.tt +11 -0
  74. data/lib/hanami/generators/application/app/Rakefile.rspec.tt +6 -0
  75. data/lib/hanami/generators/application/app/apps/.gitkeep.tt +1 -0
  76. data/lib/hanami/generators/application/app/capybara.rb.rspec.tt +8 -0
  77. data/lib/hanami/generators/application/app/config.ru.tt +3 -0
  78. data/lib/hanami/generators/application/app/config/application.rb.tt +270 -0
  79. data/lib/hanami/generators/application/app/config/environment.rb.tt +5 -0
  80. data/lib/hanami/generators/application/app/config/initializers/.gitkeep +0 -0
  81. data/lib/hanami/generators/application/app/config/routes.rb.tt +2 -0
  82. data/lib/hanami/generators/application/app/db/.gitkeep +1 -0
  83. data/lib/hanami/generators/application/app/favicon.ico +0 -0
  84. data/lib/hanami/generators/application/app/features_helper.rb.minitest.tt +11 -0
  85. data/lib/hanami/generators/application/app/features_helper.rb.rspec.tt +12 -0
  86. data/lib/hanami/generators/application/app/gitignore.tt +2 -0
  87. data/lib/hanami/generators/application/app/gitignore_with_db.tt +4 -0
  88. data/lib/hanami/generators/application/app/hanamirc.tt +3 -0
  89. data/lib/hanami/generators/application/app/lib/app_name.rb.tt +59 -0
  90. data/lib/hanami/generators/application/app/lib/chirp/entities/.gitkeep +1 -0
  91. data/lib/hanami/generators/application/app/lib/chirp/repositories/.gitkeep +1 -0
  92. data/lib/hanami/generators/application/app/lib/config/mapping.rb.tt +7 -0
  93. data/lib/hanami/generators/application/app/rspec.rspec.tt +2 -0
  94. data/lib/hanami/generators/application/app/schema.sql.tt +0 -0
  95. data/lib/hanami/generators/application/app/spec_helper.rb.minitest.tt +7 -0
  96. data/lib/hanami/generators/application/app/spec_helper.rb.rspec.tt +104 -0
  97. data/lib/hanami/generators/application/app/templates/application.html.erb.tt +10 -0
  98. data/lib/hanami/generators/application/app/views/application_layout.rb.tt +7 -0
  99. data/lib/hanami/generators/application/container/.env.development.tt +3 -0
  100. data/lib/hanami/generators/application/container/.env.test.tt +3 -0
  101. data/lib/hanami/generators/application/container/.env.tt +1 -0
  102. data/lib/hanami/generators/application/container/.gitignore +0 -0
  103. data/lib/hanami/generators/application/container/.gitkeep +1 -0
  104. data/lib/hanami/generators/application/container/Gemfile.tt +36 -0
  105. data/lib/hanami/generators/application/container/Rakefile.minitest.tt +11 -0
  106. data/lib/hanami/generators/application/container/Rakefile.rspec.tt +6 -0
  107. data/lib/hanami/generators/application/container/capybara.rb.rspec.tt +8 -0
  108. data/lib/hanami/generators/application/container/config.ru.tt +3 -0
  109. data/lib/hanami/generators/application/container/config/environment.rb.tt +7 -0
  110. data/lib/hanami/generators/application/container/config/initializers/.gitkeep +0 -0
  111. data/lib/hanami/generators/application/container/db/.gitkeep +1 -0
  112. data/lib/hanami/generators/application/container/features_helper.rb.minitest.tt +11 -0
  113. data/lib/hanami/generators/application/container/features_helper.rb.rspec.tt +12 -0
  114. data/lib/hanami/generators/application/container/gitignore.tt +2 -0
  115. data/lib/hanami/generators/application/container/gitignore_with_db.tt +4 -0
  116. data/lib/hanami/generators/application/container/hanamirc.tt +3 -0
  117. data/lib/hanami/generators/application/container/lib/app_name.rb.tt +60 -0
  118. data/lib/hanami/generators/application/container/lib/chirp/entities/.gitkeep +1 -0
  119. data/lib/hanami/generators/application/container/lib/chirp/mailers/.gitkeep +0 -0
  120. data/lib/hanami/generators/application/container/lib/chirp/mailers/templates/.gitkeep +0 -0
  121. data/lib/hanami/generators/application/container/lib/chirp/repositories/.gitkeep +1 -0
  122. data/lib/hanami/generators/application/container/lib/config/mapping.rb.tt +7 -0
  123. data/lib/hanami/generators/application/container/rspec.rspec.tt +2 -0
  124. data/lib/hanami/generators/application/container/schema.sql.tt +0 -0
  125. data/lib/hanami/generators/application/container/spec_helper.rb.minitest.tt +7 -0
  126. data/lib/hanami/generators/application/container/spec_helper.rb.rspec.tt +104 -0
  127. data/lib/hanami/generators/database_config.rb +99 -0
  128. data/lib/hanami/generators/generatable.rb +51 -0
  129. data/lib/hanami/generators/generator.rb +35 -0
  130. data/lib/hanami/generators/mailer/mailer.rb.tt +7 -0
  131. data/lib/hanami/generators/mailer/mailer_spec.rb.tt +7 -0
  132. data/lib/hanami/generators/mailer/template.html.tt +0 -0
  133. data/lib/hanami/generators/mailer/template.txt.tt +0 -0
  134. data/lib/hanami/generators/migration/migration.rb.tt +4 -0
  135. data/lib/hanami/generators/model/entity.rb.tt +3 -0
  136. data/lib/hanami/generators/model/entity_spec.minitest.tt +5 -0
  137. data/lib/hanami/generators/model/entity_spec.rspec.tt +3 -0
  138. data/lib/hanami/generators/model/repository.rb.tt +3 -0
  139. data/lib/hanami/generators/model/repository_spec.minitest.tt +5 -0
  140. data/lib/hanami/generators/model/repository_spec.rspec.tt +3 -0
  141. data/lib/hanami/generators/test_framework.rb +42 -0
  142. data/lib/hanami/hanamirc.rb +152 -0
  143. data/lib/hanami/loader.rb +258 -0
  144. data/lib/hanami/mailer/glue.rb +68 -0
  145. data/lib/hanami/middleware.rb +143 -0
  146. data/lib/hanami/rake_helper.rb +68 -0
  147. data/lib/hanami/rake_tasks.rb +2 -0
  148. data/lib/hanami/rendering_policy.rb +77 -0
  149. data/lib/hanami/repositories/car_repository.rb +3 -0
  150. data/lib/hanami/repositories/name_repository.rb +3 -0
  151. data/lib/hanami/root.rb +7 -0
  152. data/lib/hanami/routes.rb +151 -0
  153. data/lib/hanami/routing/default.rb +25 -0
  154. data/lib/hanami/setup.rb +3 -0
  155. data/lib/hanami/static.rb +77 -0
  156. data/lib/hanami/templates/default.html.erb +9 -0
  157. data/lib/hanami/templates/welcome.html.erb +52 -0
  158. data/lib/hanami/version.rb +4 -1
  159. data/lib/hanami/views/default.rb +34 -0
  160. data/lib/hanami/views/default_template_finder.rb +20 -0
  161. data/lib/hanami/views/null_view.rb +17 -0
  162. data/lib/hanami/welcome.rb +40 -0
  163. metadata +357 -16
  164. data/.gitignore +0 -9
  165. data/Gemfile +0 -4
  166. data/Rakefile +0 -2
  167. data/bin/console +0 -14
  168. data/bin/setup +0 -8
@@ -0,0 +1,25 @@
1
+ module Hanami
2
+ module Routing
3
+ # The default Rack application that responds when a resource cannot be found.
4
+ #
5
+ # @since 0.1.0
6
+ # @api private
7
+ class Default
8
+ DEFAULT_CODE = 404
9
+ DEFAULT_BODY = ['Not Found'].freeze
10
+ CONTENT_TYPE = 'Content-Type'.freeze
11
+
12
+ class NullAction
13
+ include Hanami::Action
14
+
15
+ def call(env)
16
+ end
17
+ end
18
+
19
+ def call(env)
20
+ action = NullAction.new.tap { |a| a.call(env) }
21
+ [ DEFAULT_CODE, {CONTENT_TYPE => action.content_type}, DEFAULT_BODY, action ]
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,3 @@
1
+ require 'hanami'
2
+
3
+ Bundler.require(*Hanami::Environment.new.bundler_groups)
@@ -0,0 +1,77 @@
1
+ require 'rack/static'
2
+ require 'hanami/assets/compiler'
3
+
4
+ module Hanami
5
+ class Static < ::Rack::Static
6
+ PATH_INFO = 'PATH_INFO'.freeze
7
+ PUBLIC_DIRECTORY = Hanami.public_directory.join('**', '*').to_s.freeze
8
+
9
+ def initialize(app)
10
+ super(app, root: Hanami.public_directory, header_rules: _header_rules)
11
+ @sources = _sources_from_applications
12
+ end
13
+
14
+ def call(env)
15
+ path = env[PATH_INFO]
16
+
17
+ prefix, config = @sources.find {|p, _| path.start_with?(p) }
18
+ original = if prefix && config
19
+ config.sources.find(path.sub(prefix, ''))
20
+ end
21
+
22
+ if can_serve(path, original)
23
+ super
24
+ else
25
+ precompile(original, config) ?
26
+ call(env) :
27
+ @app.call(env)
28
+ end
29
+ end
30
+
31
+ private
32
+
33
+ def can_serve(path, original = nil)
34
+ destination = Dir[PUBLIC_DIRECTORY].find do |file|
35
+ file.index(path).to_i > 0
36
+ end
37
+
38
+ (super(path) || !!destination) && _fresh?(original, destination)
39
+ end
40
+
41
+ def _fresh?(original, destination)
42
+ # At this point we're sure that destination exist.
43
+ #
44
+ # If original is missing, it could be a file that a developer manually
45
+ # created into public directory without having the corresponding original.
46
+ # In this case we return true, so the destination file can be served.
47
+ return true if original.nil? || !::File.exist?(original.to_s)
48
+
49
+ ::File.mtime(destination) >
50
+ ::File.mtime(original)
51
+ end
52
+
53
+ def precompile(original, config)
54
+ return unless original && config
55
+
56
+ Hanami::Assets::Compiler.compile(config, original)
57
+ true
58
+ end
59
+
60
+ def _sources_from_applications
61
+ Hanami::Application.applications.each_with_object({}) do |application, result|
62
+ config = _assets_configuration(application)
63
+ result["#{ config.prefix }/"] = config
64
+ end
65
+ end
66
+
67
+ def _assets_configuration(application)
68
+ application.configuration.namespace::Assets.configuration
69
+ end
70
+
71
+ def _header_rules
72
+ unless Hanami.env?(:development, :test)
73
+ [[:all, {'Cache-Control' => 'public, max-age=31536000'}]]
74
+ end
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,9 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title><%= title %></title>
5
+ </head>
6
+ <body>
7
+ <h1><%= title %></h1>
8
+ </body>
9
+ </html>
@@ -0,0 +1,52 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>Hanami | The web, with simplicity</title>
5
+ <link rel="shortcut icon" type="image/x-icon" href="/assets/favicon.ico">
6
+ <style>
7
+ * { margin: 0; padding: 0; }
8
+ body { font-family: "HelveticaNeue-Light", "Helvetica Neue Light", "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; color: #333; background-color: #ecf0f1; font-size: 16px; line-height: 24px; }
9
+ h2, h3 { margin: -20px; line-height: 100px; text-align: center; }
10
+ .logo { text-align: center; margin-top: 0.5em; }
11
+ h2 { font-size: 30px; }
12
+ h3 { font-size: 20px; line-height: 22px; color: #666; }
13
+ hr { margin: 2em; color: #ecf0f1; }
14
+ ul { text-align: center; }
15
+ li { display: inline; margin: 2em; line-height: 24px; list-style-type: none; vertical-align: text-top;}
16
+ p { margin-top: 60px; text-align: center; }
17
+ a { color: #333; padding: 1px; }
18
+ code { padding: .2em; background-color: #ecf0f1 }
19
+ #container { margin:0 auto; padding: 24px; width:700px; background-color:#fff; border: 1px solid #999; border-width: 0 1px 1px 1px; }
20
+ #content { margin: 30px 10px 0 10px; }
21
+ #footer { margin:0 auto 0; padding: 12px; width:700px; line-height: 24px; font-size: 12px; }
22
+ .bold { font-weight: bold; }
23
+ </style>
24
+ </head>
25
+ <body>
26
+ <div id="container">
27
+ <div class="logo">
28
+ <img alt="Hanami Logo" width="350" src="data:image/png;base64,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"/>
29
+ </div>
30
+ <hr />
31
+ <h2>The web, with simplicity.</h2>
32
+
33
+ <h3>Hanami is Open Source Software for MVC web development with Ruby.</h3>
34
+
35
+ <p>Please generate a new action with:<br><code>bundle exec hanami generate action<%= application_name %> home#index --url=/</code>.</p>
36
+
37
+ <hr style="margin-top: 4em;"/>
38
+ <div id="content">
39
+ <ul>
40
+ <li><a href="http://hanamirb.org">Website</a></li>
41
+ <li><a href="http://hanamirb.org/guides">Guides</a></li>
42
+ <li><a href="http://www.rubydoc.info/gems/hanami">API docs</a></li>
43
+ <li><a href="https://github.com/hanami/hanami">Source code</a></li>
44
+ <li><a href="https://gitter.im/hanami/chat">Chat</a></li>
45
+ </ul>
46
+ </div>
47
+ </div>
48
+ <div id="footer">
49
+ &copy; 2014 &dash; <%= Time.now.year %> Luca Guidi &mdash; Hanami is released under the MIT License.
50
+ </div>
51
+ </body>
52
+ </html>
@@ -1,3 +1,6 @@
1
1
  module Hanami
2
- VERSION = "0.0.0"
2
+ # Defines the version
3
+ #
4
+ # @since 0.1.0
5
+ VERSION = '0.7.0'.freeze
3
6
  end
@@ -0,0 +1,34 @@
1
+ require 'hanami/views/default_template_finder'
2
+
3
+ module Hanami
4
+ module Views
5
+ # The default view that is rendered for non successful responses (200 and 201)
6
+ #
7
+ # @since 0.1.0
8
+ # @api private
9
+ class Default
10
+ include Hanami::View
11
+
12
+ configuration.reset!
13
+
14
+ layout nil
15
+ root Pathname.new(File.dirname(__FILE__)).join('../templates').realpath
16
+ template 'default'
17
+
18
+ def title
19
+ response[2].first
20
+ end
21
+
22
+ def self.render(root, template_name, context)
23
+ format = context[:format]
24
+ template = DefaultTemplateFinder.new(self, root, template_name, format).find
25
+
26
+ if template
27
+ new(template, context).render
28
+ else
29
+ super(context)
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,20 @@
1
+ module Hanami
2
+ module Views
3
+ class DefaultTemplateFinder < View::Rendering::TemplateFinder
4
+ # Template Finder
5
+ #
6
+ # @since 0.2.0
7
+ # @api private
8
+ def initialize(view, root, template_name, format)
9
+ @view = view
10
+ @root = root
11
+ @options = { template: template_name, format: format }
12
+ end
13
+
14
+ private
15
+ def root
16
+ @root
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,17 @@
1
+ module Hanami
2
+ module Views
3
+ # Null Object pattern for views
4
+ #
5
+ # @since 0.1.0
6
+ # @api private
7
+ class NullView
8
+ def initialize(body)
9
+ @body = body
10
+ end
11
+
12
+ def render(context)
13
+ @body
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,40 @@
1
+ require 'erb'
2
+ require 'pathname'
3
+ require 'hanami/environment'
4
+ require 'hanami/utils/string'
5
+
6
+ module Hanami
7
+ class Welcome
8
+ def initialize(app)
9
+ @root = Pathname.new(__dir__).join('templates').realpath
10
+ end
11
+
12
+ def call(env)
13
+ @request_path = env['REQUEST_PATH'] || ''
14
+ @body = [ERB.new(@root.join('welcome.html.erb').read).result(binding)]
15
+
16
+ [200, {}, @body]
17
+ end
18
+
19
+ def application_name
20
+ " #{ app }" if container?
21
+ end
22
+
23
+ private
24
+
25
+ def container?
26
+ Environment.new.container?
27
+ end
28
+
29
+ def application_class
30
+ applications = Hanami::Application.applications.to_a
31
+ applications.select do |app|
32
+ @request_path.include? app.configuration.path_prefix.to_s
33
+ end.first
34
+ end
35
+
36
+ def app
37
+ Utils::String.new(application_class).namespace.downcase
38
+ end
39
+ end
40
+ end
metadata CHANGED
@@ -1,61 +1,401 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hanami
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.0
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Luca Guidi
8
+ - Trung Lê
9
+ - Alfonso Uceda Pompa
8
10
  autorequire:
9
- bindir: exe
11
+ bindir: bin
10
12
  cert_chain: []
11
- date: 2016-01-20 00:00:00.000000000 Z
13
+ date: 2016-01-22 00:00:00.000000000 Z
12
14
  dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: hanami-utils
17
+ requirement: !ruby/object:Gem::Requirement
18
+ requirements:
19
+ - - "~>"
20
+ - !ruby/object:Gem::Version
21
+ version: '0.7'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ requirements:
26
+ - - "~>"
27
+ - !ruby/object:Gem::Version
28
+ version: '0.7'
29
+ - !ruby/object:Gem::Dependency
30
+ name: hanami-router
31
+ requirement: !ruby/object:Gem::Requirement
32
+ requirements:
33
+ - - "~>"
34
+ - !ruby/object:Gem::Version
35
+ version: '0.6'
36
+ type: :runtime
37
+ prerelease: false
38
+ version_requirements: !ruby/object:Gem::Requirement
39
+ requirements:
40
+ - - "~>"
41
+ - !ruby/object:Gem::Version
42
+ version: '0.6'
43
+ - !ruby/object:Gem::Dependency
44
+ name: hanami-controller
45
+ requirement: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - "~>"
48
+ - !ruby/object:Gem::Version
49
+ version: '0.6'
50
+ type: :runtime
51
+ prerelease: false
52
+ version_requirements: !ruby/object:Gem::Requirement
53
+ requirements:
54
+ - - "~>"
55
+ - !ruby/object:Gem::Version
56
+ version: '0.6'
57
+ - !ruby/object:Gem::Dependency
58
+ name: hanami-view
59
+ requirement: !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - "~>"
62
+ - !ruby/object:Gem::Version
63
+ version: '0.6'
64
+ type: :runtime
65
+ prerelease: false
66
+ version_requirements: !ruby/object:Gem::Requirement
67
+ requirements:
68
+ - - "~>"
69
+ - !ruby/object:Gem::Version
70
+ version: '0.6'
71
+ - !ruby/object:Gem::Dependency
72
+ name: hanami-helpers
73
+ requirement: !ruby/object:Gem::Requirement
74
+ requirements:
75
+ - - "~>"
76
+ - !ruby/object:Gem::Version
77
+ version: '0.3'
78
+ type: :runtime
79
+ prerelease: false
80
+ version_requirements: !ruby/object:Gem::Requirement
81
+ requirements:
82
+ - - "~>"
83
+ - !ruby/object:Gem::Version
84
+ version: '0.3'
85
+ - !ruby/object:Gem::Dependency
86
+ name: hanami-mailer
87
+ requirement: !ruby/object:Gem::Requirement
88
+ requirements:
89
+ - - "~>"
90
+ - !ruby/object:Gem::Version
91
+ version: '0.2'
92
+ type: :runtime
93
+ prerelease: false
94
+ version_requirements: !ruby/object:Gem::Requirement
95
+ requirements:
96
+ - - "~>"
97
+ - !ruby/object:Gem::Version
98
+ version: '0.2'
99
+ - !ruby/object:Gem::Dependency
100
+ name: hanami-assets
101
+ requirement: !ruby/object:Gem::Requirement
102
+ requirements:
103
+ - - "~>"
104
+ - !ruby/object:Gem::Version
105
+ version: '0.2'
106
+ type: :runtime
107
+ prerelease: false
108
+ version_requirements: !ruby/object:Gem::Requirement
109
+ requirements:
110
+ - - "~>"
111
+ - !ruby/object:Gem::Version
112
+ version: '0.2'
113
+ - !ruby/object:Gem::Dependency
114
+ name: shotgun
115
+ requirement: !ruby/object:Gem::Requirement
116
+ requirements:
117
+ - - "~>"
118
+ - !ruby/object:Gem::Version
119
+ version: '0.9'
120
+ type: :runtime
121
+ prerelease: false
122
+ version_requirements: !ruby/object:Gem::Requirement
123
+ requirements:
124
+ - - "~>"
125
+ - !ruby/object:Gem::Version
126
+ version: '0.9'
127
+ - !ruby/object:Gem::Dependency
128
+ name: dotenv
129
+ requirement: !ruby/object:Gem::Requirement
130
+ requirements:
131
+ - - "~>"
132
+ - !ruby/object:Gem::Version
133
+ version: '2.0'
134
+ type: :runtime
135
+ prerelease: false
136
+ version_requirements: !ruby/object:Gem::Requirement
137
+ requirements:
138
+ - - "~>"
139
+ - !ruby/object:Gem::Version
140
+ version: '2.0'
141
+ - !ruby/object:Gem::Dependency
142
+ name: thor
143
+ requirement: !ruby/object:Gem::Requirement
144
+ requirements:
145
+ - - "~>"
146
+ - !ruby/object:Gem::Version
147
+ version: '0.19'
148
+ type: :runtime
149
+ prerelease: false
150
+ version_requirements: !ruby/object:Gem::Requirement
151
+ requirements:
152
+ - - "~>"
153
+ - !ruby/object:Gem::Version
154
+ version: '0.19'
13
155
  - !ruby/object:Gem::Dependency
14
156
  name: bundler
15
157
  requirement: !ruby/object:Gem::Requirement
16
158
  requirements:
17
159
  - - "~>"
18
160
  - !ruby/object:Gem::Version
19
- version: '1.11'
161
+ version: '1.6'
162
+ type: :runtime
163
+ prerelease: false
164
+ version_requirements: !ruby/object:Gem::Requirement
165
+ requirements:
166
+ - - "~>"
167
+ - !ruby/object:Gem::Version
168
+ version: '1.6'
169
+ - !ruby/object:Gem::Dependency
170
+ name: minispec-metadata
171
+ requirement: !ruby/object:Gem::Requirement
172
+ requirements:
173
+ - - "~>"
174
+ - !ruby/object:Gem::Version
175
+ version: 3.2.1
20
176
  type: :development
21
177
  prerelease: false
22
178
  version_requirements: !ruby/object:Gem::Requirement
23
179
  requirements:
24
180
  - - "~>"
25
181
  - !ruby/object:Gem::Version
26
- version: '1.11'
182
+ version: 3.2.1
183
+ - !ruby/object:Gem::Dependency
184
+ name: minitest
185
+ requirement: !ruby/object:Gem::Requirement
186
+ requirements:
187
+ - - "~>"
188
+ - !ruby/object:Gem::Version
189
+ version: '5'
190
+ type: :development
191
+ prerelease: false
192
+ version_requirements: !ruby/object:Gem::Requirement
193
+ requirements:
194
+ - - "~>"
195
+ - !ruby/object:Gem::Version
196
+ version: '5'
197
+ - !ruby/object:Gem::Dependency
198
+ name: rack-test
199
+ requirement: !ruby/object:Gem::Requirement
200
+ requirements:
201
+ - - "~>"
202
+ - !ruby/object:Gem::Version
203
+ version: '0.6'
204
+ type: :development
205
+ prerelease: false
206
+ version_requirements: !ruby/object:Gem::Requirement
207
+ requirements:
208
+ - - "~>"
209
+ - !ruby/object:Gem::Version
210
+ version: '0.6'
27
211
  - !ruby/object:Gem::Dependency
28
212
  name: rake
29
213
  requirement: !ruby/object:Gem::Requirement
30
214
  requirements:
31
215
  - - "~>"
32
216
  - !ruby/object:Gem::Version
33
- version: '10.0'
217
+ version: '10'
34
218
  type: :development
35
219
  prerelease: false
36
220
  version_requirements: !ruby/object:Gem::Requirement
37
221
  requirements:
38
222
  - - "~>"
39
223
  - !ruby/object:Gem::Version
40
- version: '10.0'
224
+ version: '10'
41
225
  description: Hanami is a web framework for Ruby
42
226
  email:
43
227
  - me@lucaguidi.com
44
- executables: []
228
+ - trung.le@ruby-journal.com
229
+ - uceda73@gmail.com
230
+ executables:
231
+ - hanami
45
232
  extensions: []
46
233
  extra_rdoc_files: []
47
234
  files:
48
- - ".gitignore"
49
- - Gemfile
235
+ - CHANGELOG.md
236
+ - FEATURES.md
237
+ - LICENSE.md
50
238
  - README.md
51
- - Rakefile
52
- - bin/console
53
- - bin/setup
239
+ - bin/hanami
54
240
  - hanami.gemspec
55
241
  - lib/hanami.rb
242
+ - lib/hanami/action/csrf_protection.rb
243
+ - lib/hanami/action/routing_helpers.rb
244
+ - lib/hanami/application.rb
245
+ - lib/hanami/application_name.rb
246
+ - lib/hanami/cli.rb
247
+ - lib/hanami/cli_sub_commands/assets.rb
248
+ - lib/hanami/cli_sub_commands/db.rb
249
+ - lib/hanami/cli_sub_commands/destroy.rb
250
+ - lib/hanami/cli_sub_commands/generate.rb
251
+ - lib/hanami/commands/assets/precompile.rb
252
+ - lib/hanami/commands/console.rb
253
+ - lib/hanami/commands/db/abstract.rb
254
+ - lib/hanami/commands/db/apply.rb
255
+ - lib/hanami/commands/db/console.rb
256
+ - lib/hanami/commands/db/create.rb
257
+ - lib/hanami/commands/db/drop.rb
258
+ - lib/hanami/commands/db/migrate.rb
259
+ - lib/hanami/commands/db/prepare.rb
260
+ - lib/hanami/commands/db/version.rb
261
+ - lib/hanami/commands/generate/abstract.rb
262
+ - lib/hanami/commands/generate/action.rb
263
+ - lib/hanami/commands/generate/app.rb
264
+ - lib/hanami/commands/generate/mailer.rb
265
+ - lib/hanami/commands/generate/migration.rb
266
+ - lib/hanami/commands/generate/model.rb
267
+ - lib/hanami/commands/new/abstract.rb
268
+ - lib/hanami/commands/new/app.rb
269
+ - lib/hanami/commands/new/container.rb
270
+ - lib/hanami/commands/routes.rb
271
+ - lib/hanami/commands/server.rb
272
+ - lib/hanami/config/configure.rb
273
+ - lib/hanami/config/cookies.rb
274
+ - lib/hanami/config/framework_configuration.rb
275
+ - lib/hanami/config/load_paths.rb
276
+ - lib/hanami/config/mapper.rb
277
+ - lib/hanami/config/mapping.rb
278
+ - lib/hanami/config/routes.rb
279
+ - lib/hanami/config/security.rb
280
+ - lib/hanami/config/sessions.rb
281
+ - lib/hanami/configuration.rb
282
+ - lib/hanami/container.rb
283
+ - lib/hanami/environment.rb
284
+ - lib/hanami/frameworks.rb
285
+ - lib/hanami/generators/action/action.rb.tt
286
+ - lib/hanami/generators/action/action_spec.minitest.tt
287
+ - lib/hanami/generators/action/action_spec.rspec.tt
288
+ - lib/hanami/generators/action/action_without_view.rb.tt
289
+ - lib/hanami/generators/action/template.tt
290
+ - lib/hanami/generators/action/view.rb.tt
291
+ - lib/hanami/generators/action/view_spec.minitest.tt
292
+ - lib/hanami/generators/action/view_spec.rspec.tt
293
+ - lib/hanami/generators/app/.gitkeep.tt
294
+ - lib/hanami/generators/app/application.rb.tt
295
+ - lib/hanami/generators/app/config/initializers/.gitkeep
296
+ - lib/hanami/generators/app/config/routes.rb.tt
297
+ - lib/hanami/generators/app/favicon.ico
298
+ - lib/hanami/generators/app/templates/application.html.erb.tt
299
+ - lib/hanami/generators/app/views/application_layout.rb.tt
300
+ - lib/hanami/generators/application/app/.env.development.tt
301
+ - lib/hanami/generators/application/app/.env.test.tt
302
+ - lib/hanami/generators/application/app/.env.tt
303
+ - lib/hanami/generators/application/app/.gitignore
304
+ - lib/hanami/generators/application/app/.gitkeep
305
+ - lib/hanami/generators/application/app/Gemfile.tt
306
+ - lib/hanami/generators/application/app/Rakefile.minitest.tt
307
+ - lib/hanami/generators/application/app/Rakefile.rspec.tt
308
+ - lib/hanami/generators/application/app/apps/.gitkeep.tt
309
+ - lib/hanami/generators/application/app/capybara.rb.rspec.tt
310
+ - lib/hanami/generators/application/app/config.ru.tt
311
+ - lib/hanami/generators/application/app/config/application.rb.tt
312
+ - lib/hanami/generators/application/app/config/environment.rb.tt
313
+ - lib/hanami/generators/application/app/config/initializers/.gitkeep
314
+ - lib/hanami/generators/application/app/config/routes.rb.tt
315
+ - lib/hanami/generators/application/app/db/.gitkeep
316
+ - lib/hanami/generators/application/app/favicon.ico
317
+ - lib/hanami/generators/application/app/features_helper.rb.minitest.tt
318
+ - lib/hanami/generators/application/app/features_helper.rb.rspec.tt
319
+ - lib/hanami/generators/application/app/gitignore.tt
320
+ - lib/hanami/generators/application/app/gitignore_with_db.tt
321
+ - lib/hanami/generators/application/app/hanamirc.tt
322
+ - lib/hanami/generators/application/app/lib/app_name.rb.tt
323
+ - lib/hanami/generators/application/app/lib/chirp/entities/.gitkeep
324
+ - lib/hanami/generators/application/app/lib/chirp/repositories/.gitkeep
325
+ - lib/hanami/generators/application/app/lib/config/mapping.rb.tt
326
+ - lib/hanami/generators/application/app/rspec.rspec.tt
327
+ - lib/hanami/generators/application/app/schema.sql.tt
328
+ - lib/hanami/generators/application/app/spec_helper.rb.minitest.tt
329
+ - lib/hanami/generators/application/app/spec_helper.rb.rspec.tt
330
+ - lib/hanami/generators/application/app/templates/application.html.erb.tt
331
+ - lib/hanami/generators/application/app/views/application_layout.rb.tt
332
+ - lib/hanami/generators/application/container/.env.development.tt
333
+ - lib/hanami/generators/application/container/.env.test.tt
334
+ - lib/hanami/generators/application/container/.env.tt
335
+ - lib/hanami/generators/application/container/.gitignore
336
+ - lib/hanami/generators/application/container/.gitkeep
337
+ - lib/hanami/generators/application/container/Gemfile.tt
338
+ - lib/hanami/generators/application/container/Rakefile.minitest.tt
339
+ - lib/hanami/generators/application/container/Rakefile.rspec.tt
340
+ - lib/hanami/generators/application/container/capybara.rb.rspec.tt
341
+ - lib/hanami/generators/application/container/config.ru.tt
342
+ - lib/hanami/generators/application/container/config/environment.rb.tt
343
+ - lib/hanami/generators/application/container/config/initializers/.gitkeep
344
+ - lib/hanami/generators/application/container/db/.gitkeep
345
+ - lib/hanami/generators/application/container/features_helper.rb.minitest.tt
346
+ - lib/hanami/generators/application/container/features_helper.rb.rspec.tt
347
+ - lib/hanami/generators/application/container/gitignore.tt
348
+ - lib/hanami/generators/application/container/gitignore_with_db.tt
349
+ - lib/hanami/generators/application/container/hanamirc.tt
350
+ - lib/hanami/generators/application/container/lib/app_name.rb.tt
351
+ - lib/hanami/generators/application/container/lib/chirp/entities/.gitkeep
352
+ - lib/hanami/generators/application/container/lib/chirp/mailers/.gitkeep
353
+ - lib/hanami/generators/application/container/lib/chirp/mailers/templates/.gitkeep
354
+ - lib/hanami/generators/application/container/lib/chirp/repositories/.gitkeep
355
+ - lib/hanami/generators/application/container/lib/config/mapping.rb.tt
356
+ - lib/hanami/generators/application/container/rspec.rspec.tt
357
+ - lib/hanami/generators/application/container/schema.sql.tt
358
+ - lib/hanami/generators/application/container/spec_helper.rb.minitest.tt
359
+ - lib/hanami/generators/application/container/spec_helper.rb.rspec.tt
360
+ - lib/hanami/generators/database_config.rb
361
+ - lib/hanami/generators/generatable.rb
362
+ - lib/hanami/generators/generator.rb
363
+ - lib/hanami/generators/mailer/mailer.rb.tt
364
+ - lib/hanami/generators/mailer/mailer_spec.rb.tt
365
+ - lib/hanami/generators/mailer/template.html.tt
366
+ - lib/hanami/generators/mailer/template.txt.tt
367
+ - lib/hanami/generators/migration/migration.rb.tt
368
+ - lib/hanami/generators/model/entity.rb.tt
369
+ - lib/hanami/generators/model/entity_spec.minitest.tt
370
+ - lib/hanami/generators/model/entity_spec.rspec.tt
371
+ - lib/hanami/generators/model/repository.rb.tt
372
+ - lib/hanami/generators/model/repository_spec.minitest.tt
373
+ - lib/hanami/generators/model/repository_spec.rspec.tt
374
+ - lib/hanami/generators/test_framework.rb
375
+ - lib/hanami/hanamirc.rb
376
+ - lib/hanami/loader.rb
377
+ - lib/hanami/mailer/glue.rb
378
+ - lib/hanami/middleware.rb
379
+ - lib/hanami/rake_helper.rb
380
+ - lib/hanami/rake_tasks.rb
381
+ - lib/hanami/rendering_policy.rb
382
+ - lib/hanami/repositories/car_repository.rb
383
+ - lib/hanami/repositories/name_repository.rb
384
+ - lib/hanami/root.rb
385
+ - lib/hanami/routes.rb
386
+ - lib/hanami/routing/default.rb
387
+ - lib/hanami/setup.rb
388
+ - lib/hanami/static.rb
389
+ - lib/hanami/templates/default.html.erb
390
+ - lib/hanami/templates/welcome.html.erb
56
391
  - lib/hanami/version.rb
392
+ - lib/hanami/views/default.rb
393
+ - lib/hanami/views/default_template_finder.rb
394
+ - lib/hanami/views/null_view.rb
395
+ - lib/hanami/welcome.rb
57
396
  homepage: http://hanamirb.org
58
- licenses: []
397
+ licenses:
398
+ - MIT
59
399
  metadata: {}
60
400
  post_install_message:
61
401
  rdoc_options: []
@@ -65,7 +405,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
65
405
  requirements:
66
406
  - - ">="
67
407
  - !ruby/object:Gem::Version
68
- version: '0'
408
+ version: 2.0.0
69
409
  required_rubygems_version: !ruby/object:Gem::Requirement
70
410
  requirements:
71
411
  - - ">="
@@ -76,5 +416,6 @@ rubyforge_project:
76
416
  rubygems_version: 2.5.1
77
417
  signing_key:
78
418
  specification_version: 4
79
- summary: The web, with simplicity
419
+ summary: The web, with simplicity.
80
420
  test_files: []
421
+ has_rdoc: