hanami 0.0.0 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
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: