lotusrb 0.3.2 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (85) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +20 -0
  3. data/FEATURES.md +17 -0
  4. data/README.md +16 -355
  5. data/lib/lotus.rb +0 -1
  6. data/lib/lotus/action/csrf_protection.rb +167 -0
  7. data/lib/lotus/application.rb +3 -1
  8. data/lib/lotus/cli.rb +14 -13
  9. data/lib/lotus/commands/console.rb +1 -1
  10. data/lib/lotus/commands/db.rb +102 -0
  11. data/lib/lotus/commands/db/abstract.rb +15 -0
  12. data/lib/lotus/commands/db/apply.rb +14 -0
  13. data/lib/lotus/commands/db/console.rb +1 -5
  14. data/lib/lotus/commands/db/create.rb +14 -0
  15. data/lib/lotus/commands/db/drop.rb +14 -0
  16. data/lib/lotus/commands/db/migrate.rb +19 -0
  17. data/lib/lotus/commands/db/prepare.rb +14 -0
  18. data/lib/lotus/commands/db/version.rb +14 -0
  19. data/lib/lotus/commands/generate.rb +20 -20
  20. data/lib/lotus/commands/new.rb +1 -0
  21. data/lib/lotus/commands/routes.rb +1 -2
  22. data/lib/lotus/configuration.rb +29 -0
  23. data/lib/lotus/container.rb +19 -3
  24. data/lib/lotus/environment.rb +62 -9
  25. data/lib/lotus/frameworks.rb +1 -0
  26. data/lib/lotus/generators/action.rb +46 -10
  27. data/lib/lotus/generators/action/action_spec.minitest.tt +1 -1
  28. data/lib/lotus/generators/action/action_spec.rspec.tt +1 -1
  29. data/lib/lotus/generators/action/view_spec.minitest.tt +2 -1
  30. data/lib/lotus/generators/action/view_spec.rspec.tt +2 -1
  31. data/lib/lotus/generators/app.rb +39 -0
  32. data/lib/lotus/generators/app/.gitkeep +1 -0
  33. data/lib/lotus/generators/application/app.rb +184 -0
  34. data/lib/lotus/generators/application/app/.env.development.tt +3 -0
  35. data/lib/lotus/generators/application/app/.env.test.tt +3 -0
  36. data/lib/lotus/generators/application/{container/config → app}/.env.tt +0 -0
  37. data/lib/lotus/generators/application/app/.gitkeep +1 -0
  38. data/lib/lotus/generators/application/app/Gemfile.tt +35 -0
  39. data/lib/lotus/generators/application/app/Rakefile.minitest.tt +10 -0
  40. data/lib/lotus/generators/application/app/Rakefile.rspec.tt +5 -0
  41. data/lib/lotus/generators/application/app/apps/.gitkeep.tt +1 -0
  42. data/lib/lotus/generators/application/app/capybara.rb.rspec.tt +8 -0
  43. data/lib/lotus/generators/application/app/config.ru.tt +3 -0
  44. data/lib/lotus/generators/application/app/config/application.rb.tt +227 -0
  45. data/lib/lotus/generators/application/app/config/environment.rb.tt +5 -0
  46. data/lib/lotus/generators/application/app/config/routes.rb.tt +2 -0
  47. data/lib/lotus/generators/application/app/db/.gitkeep +1 -0
  48. data/lib/lotus/generators/application/app/features_helper.rb.minitest.tt +11 -0
  49. data/lib/lotus/generators/application/app/features_helper.rb.rspec.tt +12 -0
  50. data/lib/lotus/generators/application/app/gitignore.tt +2 -0
  51. data/lib/lotus/generators/application/app/lib/app_name.rb.tt +47 -0
  52. data/lib/lotus/generators/application/app/lib/chirp/entities/.gitkeep +1 -0
  53. data/lib/lotus/generators/application/app/lib/chirp/repositories/.gitkeep +1 -0
  54. data/lib/lotus/generators/application/app/lib/config/mapping.rb.tt +7 -0
  55. data/lib/lotus/generators/application/app/lotusrc.tt +3 -0
  56. data/lib/lotus/generators/application/app/rspec.rspec.tt +2 -0
  57. data/lib/lotus/generators/application/app/schema.sql.tt +0 -0
  58. data/lib/lotus/generators/application/app/spec_helper.rb.minitest.tt +7 -0
  59. data/lib/lotus/generators/application/app/spec_helper.rb.rspec.tt +100 -0
  60. data/lib/lotus/generators/application/app/templates/application.html.erb.tt +9 -0
  61. data/lib/lotus/generators/application/app/views/application_layout.rb.tt +7 -0
  62. data/lib/lotus/generators/application/container.rb +37 -13
  63. data/lib/lotus/generators/application/container/{config/.env.development.tt → .env.development.tt} +0 -0
  64. data/lib/lotus/generators/application/container/{config/.env.test.tt → .env.test.tt} +0 -0
  65. data/lib/lotus/generators/application/container/.env.tt +1 -0
  66. data/lib/lotus/generators/application/container/lib/app_name.rb.tt +9 -0
  67. data/lib/lotus/generators/application/container/schema.sql.tt +0 -0
  68. data/lib/lotus/generators/migration.rb +58 -0
  69. data/lib/lotus/generators/migration/migration.rb.tt +4 -0
  70. data/lib/lotus/generators/model.rb +10 -7
  71. data/lib/lotus/generators/slice.rb +4 -12
  72. data/lib/lotus/generators/slice/application.rb.tt +3 -19
  73. data/lib/lotus/generators/slice/config/routes.rb.tt +1 -7
  74. data/lib/lotus/loader.rb +15 -1
  75. data/lib/lotus/lotusrc.rb +8 -3
  76. data/lib/lotus/templates/{welcome.html → welcome.html.erb} +4 -3
  77. data/lib/lotus/version.rb +1 -1
  78. data/lib/lotus/welcome.rb +20 -1
  79. data/lotusrb.gemspec +5 -5
  80. metadata +67 -18
  81. data/lib/lotus/generators/slice/action.rb.tt +0 -8
  82. data/lib/lotus/generators/slice/config/mapping.rb.tt +0 -13
  83. data/lib/lotus/generators/slice/templates/template.html.erb.tt +0 -2
  84. data/lib/lotus/generators/slice/view.rb.tt +0 -5
  85. data/lib/lotus/logger.rb +0 -141
@@ -0,0 +1,5 @@
1
+ require 'rubygems'
2
+ require 'bundler/setup'
3
+ require 'lotus/setup'
4
+ require_relative '../lib/<%= config[:app_name] %>'
5
+ require_relative '../config/application'
@@ -0,0 +1,2 @@
1
+ # Configure your routes here
2
+ # See: http://www.rubydoc.info/gems/lotus-router/#Usage
@@ -0,0 +1,11 @@
1
+ # Require this file for feature tests
2
+ require_relative './spec_helper'
3
+
4
+ require 'capybara'
5
+ require 'capybara/dsl'
6
+
7
+ Capybara.app = <%= config[:classified_app_name] %>::Application.new
8
+
9
+ class MiniTest::Spec
10
+ include Capybara::DSL
11
+ end
@@ -0,0 +1,12 @@
1
+ # Require this file for feature tests
2
+ require_relative './spec_helper'
3
+
4
+ require 'capybara'
5
+ require 'capybara/rspec'
6
+
7
+ RSpec.configure do |config|
8
+ config.include RSpec::FeatureExampleGroup
9
+
10
+ config.include Capybara::DSL, feature: true
11
+ config.include Capybara::RSpecMatchers, feature: true
12
+ end
@@ -0,0 +1,2 @@
1
+ /db/<%= config[:app_name] %>_development
2
+ /db/<%= config[:app_name] %>_test
@@ -0,0 +1,47 @@
1
+ require 'lotus/model'
2
+ Dir["#{ __dir__ }/<%= config[:app_name] %>/**/*.rb"].each { |file| require_relative file }
3
+
4
+ Lotus::Model.configure do
5
+ # Database adapter
6
+ #
7
+ # Available options:
8
+ #
9
+ # * Memory adapter
10
+ # adapter type: :memory, uri: 'memory://localhost/<%= config[:app_name] %>_development'
11
+ #
12
+ # * SQL adapter
13
+ # adapter type: :sql, uri: 'sqlite://db/<%= config[:app_name] %>_development.sqlite3'
14
+ # adapter type: :sql, uri: 'postgres://localhost/<%= config[:app_name] %>_development'
15
+ # adapter type: :sql, uri: 'mysql://localhost/<%= config[:app_name] %>_development'
16
+ #
17
+ adapter type: :<%= config[:database_config][:type] %>, uri: ENV['<%= config[:app_name].to_env_s %>_DATABASE_URL']
18
+
19
+ <%- if config[:database_config][:type] == :sql -%>
20
+ ##
21
+ # Migrations
22
+ #
23
+ migrations 'db/migrations'
24
+ schema 'db/schema.sql'
25
+
26
+ <%- end -%>
27
+ ##
28
+ # Database mapping
29
+ #
30
+ # Intended for specifying application wide mappings.
31
+ #
32
+ # You can specify mapping file to load with:
33
+ #
34
+ # mapping "#{__dir__}/config/mapping"
35
+ #
36
+ # Alternatively, you can use a block syntax like the following:
37
+ #
38
+ mapping do
39
+ # collection :users do
40
+ # entity User
41
+ # repository UserRepository
42
+ #
43
+ # attribute :id, Integer
44
+ # attribute :name, String
45
+ # end
46
+ end
47
+ end.load!
@@ -0,0 +1,7 @@
1
+ # collection :users do
2
+ # entity User
3
+ # repository UserRepository
4
+ #
5
+ # attribute :id, Integer
6
+ # attribute :name, String
7
+ # end
@@ -0,0 +1,3 @@
1
+ architecture=app
2
+ test=<%= config[:test] %>
3
+ template=erb
@@ -0,0 +1,2 @@
1
+ --color
2
+ --require spec_helper
@@ -0,0 +1,7 @@
1
+ # Require this file for unit tests
2
+ ENV['LOTUS_ENV'] ||= 'test'
3
+
4
+ require_relative '../config/environment'
5
+ require 'minitest/autorun'
6
+
7
+ Lotus::Application.preload!
@@ -0,0 +1,100 @@
1
+ # Require this file for unit tests
2
+ ENV['LOTUS_ENV'] ||= 'test'
3
+
4
+ require_relative '../config/environment'
5
+ Lotus::Application.preload!
6
+
7
+ Dir[__dir__ + '/support/**/*.rb'].each { |f| require f }
8
+
9
+ # This file was generated by the `rspec --init` command. Conventionally, all
10
+ # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
11
+ # The generated `.rspec` file contains `--require spec_helper` which will cause
12
+ # this file to always be loaded, without a need to explicitly require it in any
13
+ # files.
14
+ #
15
+ # Given that it is always loaded, you are encouraged to keep this file as
16
+ # light-weight as possible. Requiring heavyweight dependencies from this file
17
+ # will add to the boot time of your test suite on EVERY test run, even for an
18
+ # individual file that may not need all of that loaded. Instead, consider making
19
+ # a separate helper file that requires the additional dependencies and performs
20
+ # the additional setup, and require it from the spec files that actually need
21
+ # it.
22
+ #
23
+ # The `.rspec` file also contains a few flags that are not defaults but that
24
+ # users commonly want.
25
+ #
26
+ # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
27
+ RSpec.configure do |config|
28
+ # rspec-expectations config goes here. You can use an alternate
29
+ # assertion/expectation library such as wrong or the stdlib/minitest
30
+ # assertions if you prefer.
31
+ config.expect_with :rspec do |expectations|
32
+ # This option will default to `true` in RSpec 4. It makes the `description`
33
+ # and `failure_message` of custom matchers include text for helper methods
34
+ # defined using `chain`, e.g.:
35
+ # be_bigger_than(2).and_smaller_than(4).description
36
+ # # => "be bigger than 2 and smaller than 4"
37
+ # ...rather than:
38
+ # # => "be bigger than 2"
39
+ expectations.include_chain_clauses_in_custom_matcher_descriptions = true
40
+ end
41
+
42
+ # rspec-mocks config goes here. You can use an alternate test double
43
+ # library (such as bogus or mocha) by changing the `mock_with` option here.
44
+ config.mock_with :rspec do |mocks|
45
+ # Prevents you from mocking or stubbing a method that does not exist on
46
+ # a real object. This is generally recommended, and will default to
47
+ # `true` in RSpec 4.
48
+ mocks.verify_partial_doubles = true
49
+ end
50
+
51
+ # The settings below are suggested to provide a good initial experience
52
+ # with RSpec, but feel free to customize to your heart's content.
53
+ =begin
54
+ # These two settings work together to allow you to limit a spec run
55
+ # to individual examples or groups you care about by tagging them with
56
+ # `:focus` metadata. When nothing is tagged with `:focus`, all examples
57
+ # get run.
58
+ config.filter_run :focus
59
+ config.run_all_when_everything_filtered = true
60
+
61
+ # Limits the available syntax to the non-monkey patched syntax that is
62
+ # recommended. For more details, see:
63
+ # - http://myronmars.to/n/dev-blog/2012/06/rspecs-new-expectation-syntax
64
+ # - http://teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/
65
+ # - http://myronmars.to/n/dev-blog/2014/05/notable-changes-in-rspec-3#new__config_option_to_disable_rspeccore_monkey_patching
66
+ config.disable_monkey_patching!
67
+
68
+ # This setting enables warnings. It's recommended, but in some cases may
69
+ # be too noisy due to issues in dependencies.
70
+ config.warnings = true
71
+
72
+ # Many RSpec users commonly either run the entire suite or an individual
73
+ # file, and it's useful to allow more verbose output when running an
74
+ # individual spec file.
75
+ if config.files_to_run.one?
76
+ # Use the documentation formatter for detailed output,
77
+ # unless a formatter has already been configured
78
+ # (e.g. via a command-line flag).
79
+ config.default_formatter = 'doc'
80
+ end
81
+
82
+ # Print the 10 slowest examples and example groups at the
83
+ # end of the spec run, to help surface which specs are running
84
+ # particularly slow.
85
+ config.profile_examples = 10
86
+
87
+ # Run specs in random order to surface order dependencies. If you find an
88
+ # order dependency and want to debug it, you can fix the order by providing
89
+ # the seed, which is printed after each run.
90
+ # --seed 1234
91
+ config.order = :random
92
+
93
+ # Seed global randomization in this process using the `--seed` CLI option.
94
+ # Setting this allows you to use `--seed` to deterministically reproduce
95
+ # test failures related to randomization by passing the same `--seed` value
96
+ # as the one that triggered the failure.
97
+ Kernel.srand config.seed
98
+ =end
99
+ end
100
+
@@ -0,0 +1,9 @@
1
+ <!doctype HTML>
2
+ <html>
3
+ <head>
4
+ <title><%= config[:classified_app_name] %></title>
5
+ </head>
6
+ <body>
7
+ <%%= yield %>
8
+ </body>
9
+ </html>
@@ -0,0 +1,7 @@
1
+ module <%= config[:classified_app_name] %>
2
+ module Views
3
+ class ApplicationLayout
4
+ include <%= config[:classified_app_name] %>::Layout
5
+ end
6
+ end
7
+ end
@@ -13,7 +13,7 @@ module Lotus
13
13
  @lotus_head = options.fetch(:lotus_head)
14
14
  @test = options[:test]
15
15
  @database = options[:database]
16
- @lotus_model_version = '~> 0.3'
16
+ @lotus_model_version = '~> 0.4'
17
17
 
18
18
  cli.class.source_root(source)
19
19
  end
@@ -30,23 +30,28 @@ module Lotus
30
30
  }
31
31
 
32
32
  templates = {
33
- 'lotusrc.tt' => '.lotusrc',
34
- 'Gemfile.tt' => 'Gemfile',
35
- 'config.ru.tt' => 'config.ru',
36
- 'config/environment.rb.tt' => 'config/environment.rb',
37
- 'config/.env.tt' => 'config/.env',
38
- 'config/.env.development.tt' => 'config/.env.development',
39
- 'config/.env.test.tt' => 'config/.env.test',
40
- 'lib/app_name.rb.tt' => "lib/#{ app_name }.rb",
41
- 'lib/config/mapping.rb.tt' => 'lib/config/mapping.rb',
33
+ 'lotusrc.tt' => '.lotusrc',
34
+ '.env.tt' => '.env',
35
+ '.env.development.tt' => '.env.development',
36
+ '.env.test.tt' => '.env.test',
37
+ 'Gemfile.tt' => 'Gemfile',
38
+ 'config.ru.tt' => 'config.ru',
39
+ 'config/environment.rb.tt' => 'config/environment.rb',
40
+ 'lib/app_name.rb.tt' => "lib/#{ app_name }.rb",
41
+ 'lib/config/mapping.rb.tt' => 'lib/config/mapping.rb',
42
42
  }
43
43
 
44
44
  empty_directories = [
45
- "db",
46
45
  "lib/#{ app_name }/entities",
47
46
  "lib/#{ app_name }/repositories"
48
47
  ]
49
48
 
49
+ empty_directories << if sql_database?
50
+ "db/migrations"
51
+ else
52
+ "db"
53
+ end
54
+
50
55
  case options[:test]
51
56
  when 'rspec'
52
57
  templates.merge!(
@@ -64,6 +69,12 @@ module Lotus
64
69
  )
65
70
  end
66
71
 
72
+ if sql_database?
73
+ templates.merge!(
74
+ 'schema.sql.tt' => 'db/schema.sql'
75
+ )
76
+ end
77
+
67
78
  empty_directories << [
68
79
  "spec/#{ app_name }/entities",
69
80
  "spec/#{ app_name }/repositories",
@@ -123,10 +134,14 @@ module Lotus
123
134
  end
124
135
  end
125
136
 
137
+ def sql_database?
138
+ database_type == :sql
139
+ end
140
+
126
141
  def database_uri
127
142
  {
128
- development: "#{database_base_uri}_development",
129
- test: "#{database_base_uri}_test"
143
+ development: database_environment_uri(:development),
144
+ test: database_environment_uri(:test)
130
145
  }
131
146
  end
132
147
 
@@ -146,6 +161,15 @@ module Lotus
146
161
  "file:///db/#{app_name}"
147
162
  end
148
163
  end
164
+
165
+ def database_environment_uri(environment)
166
+ case @database
167
+ when 'sqlite', 'sqlite3'
168
+ "#{database_base_uri}_#{environment}.sqlite"
169
+ else
170
+ "#{database_base_uri}_#{environment}"
171
+ end
172
+ end
149
173
  end
150
174
  end
151
175
  end
@@ -0,0 +1 @@
1
+ # Define ENV variables
@@ -2,6 +2,7 @@ require 'lotus/model'
2
2
  Dir["#{ __dir__ }/<%= config[:app_name] %>/**/*.rb"].each { |file| require_relative file }
3
3
 
4
4
  Lotus::Model.configure do
5
+ ##
5
6
  # Database adapter
6
7
  #
7
8
  # Available options:
@@ -16,6 +17,14 @@ Lotus::Model.configure do
16
17
  #
17
18
  adapter type: :<%= config[:database_config][:type] %>, uri: ENV['<%= config[:app_name].to_env_s %>_DATABASE_URL']
18
19
 
20
+ <%- if config[:database_config][:type] == :sql -%>
21
+ ##
22
+ # Migrations
23
+ #
24
+ migrations 'db/migrations'
25
+ schema 'db/schema.sql'
26
+
27
+ <%- end -%>
19
28
  ##
20
29
  # Database mapping
21
30
  #
@@ -0,0 +1,58 @@
1
+ require 'lotus/generators/abstract'
2
+ require 'lotus/utils/string'
3
+
4
+ module Lotus
5
+ module Generators
6
+ # @since 0.4.0
7
+ # @api private
8
+ class Migration < Abstract
9
+ # @since 0.4.0
10
+ # @api private
11
+ #
12
+ # @example
13
+ # 20150612160502
14
+ TIMESTAMP_FORMAT = '%Y%m%d%H%M%S'.freeze
15
+
16
+ # @since 0.4.0
17
+ # @api private
18
+ #
19
+ # @example
20
+ # 20150612160502_create_books.rb
21
+ FILENAME = '%{timestamp}_%{name}.rb'.freeze
22
+
23
+ # @since 0.4.0
24
+ # @api private
25
+ def initialize(command)
26
+ super
27
+
28
+ timestamp = Time.now.utc.strftime(TIMESTAMP_FORMAT)
29
+ filename = FILENAME % { timestamp: timestamp, name: name }
30
+
31
+ env.require_application_environment
32
+ @destination = Lotus::Model.configuration.migrations.join(filename)
33
+
34
+ cli.class.source_root(source)
35
+ end
36
+
37
+ # @since 0.4.0
38
+ # @api private
39
+ def start
40
+ templates = {
41
+ 'migration.rb.tt' => @destination
42
+ }
43
+
44
+ templates.each do |src, dst|
45
+ cli.template(source.join(src), target.join(dst), {})
46
+ end
47
+ end
48
+
49
+ private
50
+
51
+ # @since 0.4.0
52
+ # @api private
53
+ def name
54
+ Utils::String.new(app_name || super).underscore
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,4 @@
1
+ Lotus::Model.migration do
2
+ change do
3
+ end
4
+ end
@@ -10,9 +10,7 @@ module Lotus
10
10
  def initialize(command)
11
11
  super
12
12
 
13
- @model = Utils::String.new(app_name).underscore
14
- @model_name = Utils::String.new(@model).classify
15
-
13
+ @model_name = Utils::String.new(name).classify
16
14
  cli.class.source_root(source)
17
15
  end
18
16
 
@@ -50,28 +48,33 @@ module Lotus
50
48
  # @since 0.3.1
51
49
  # @api private
52
50
  def _entity_path
53
- model_root.join("entities", "#{@model}.rb").to_s
51
+ model_root.join("entities", "#{ name }.rb").to_s
54
52
  end
55
53
 
56
54
  # @since 0.3.1
57
55
  # @api private
58
56
  def _repository_path
59
- model_root.join("repositories", "#{@model}_repository.rb").to_s
57
+ model_root.join("repositories", "#{ name }_repository.rb").to_s
60
58
  end
61
59
 
62
60
  # @since 0.3.1
63
61
  # @api private
64
62
  def _entity_spec_path
65
- spec_root.join(::File.basename(Dir.getwd), 'entities', "#{ @model }_spec.rb")
63
+ spec_root.join(::File.basename(Dir.getwd), 'entities', "#{ name }_spec.rb")
66
64
  end
67
65
 
68
66
  # @since 0.3.1
69
67
  # @api private
70
68
  def _repository_spec_path
71
69
  spec_root.join(::File.basename(Dir.getwd), 'repositories',
72
- "#{ @model }_repository_spec.rb")
70
+ "#{ name }_repository_spec.rb")
73
71
  end
74
72
 
73
+ # @since 0.4.0
74
+ # @api private
75
+ def name
76
+ Utils::String.new(app_name || super).underscore
77
+ end
75
78
  end
76
79
  end
77
80
  end