pineapples 0.3.34 → 0.3.345

Sign up to get free protection for your applications and to get access to all the features.
Files changed (93) hide show
  1. checksums.yaml +4 -4
  2. data/bin/pineapples +13 -13
  3. data/lib/pineapples.rb +3 -1
  4. data/lib/pineapples/actions.rb +6 -0
  5. data/lib/pineapples/actions/base/target.rb +41 -91
  6. data/lib/pineapples/actions/bundle.rb +16 -0
  7. data/lib/pineapples/actions/chmod.rb +3 -2
  8. data/lib/pineapples/actions/copy_file.rb +1 -1
  9. data/lib/pineapples/actions/empty_directory.rb +1 -1
  10. data/lib/pineapples/actions/gsub_file.rb +5 -3
  11. data/lib/pineapples/actions/inside.rb +5 -1
  12. data/lib/pineapples/actions/rails/erb_converters.rb +11 -4
  13. data/lib/pineapples/actions/rails/new_hash_syntax_converter.rb +36 -0
  14. data/lib/pineapples/actions/rails/rails.rb +1 -0
  15. data/lib/pineapples/actions/remove_file.rb +28 -28
  16. data/lib/pineapples/actions/shell.rb +43 -9
  17. data/lib/pineapples/app_generator.rb +154 -38
  18. data/lib/pineapples/helpers.rb +31 -0
  19. data/lib/pineapples/parser.rb +42 -37
  20. data/lib/pineapples/setting.rb +155 -155
  21. data/lib/pineapples/settings.rb +31 -31
  22. data/lib/pineapples/templates/.example.env.tt +15 -0
  23. data/lib/pineapples/templates/.gitignore +3 -0
  24. data/lib/pineapples/templates/.simplecov.tt +11 -0
  25. data/lib/pineapples/templates/Gemfile.tt +23 -5
  26. data/lib/pineapples/templates/Procfile +1 -1
  27. data/lib/pineapples/templates/Procfile.dev.tt +2 -0
  28. data/lib/pineapples/templates/app/assets/javascripts/libs.js +4 -2
  29. data/lib/pineapples/templates/app/assets/stylesheets/application.scss +4 -1
  30. data/lib/pineapples/templates/app/controllers/application_controller.rb.tt +0 -2
  31. data/lib/pineapples/templates/app/controllers/auth!=devise!/confirmations_controller.rb +11 -0
  32. data/lib/pineapples/templates/app/controllers/auth!=devise!/passwords_controller.rb.tt +12 -0
  33. data/lib/pineapples/templates/app/controllers/auth!=devise!/registrations_controller.rb.tt +25 -0
  34. data/lib/pineapples/templates/app/controllers/auth!=devise!/sessions_controller.rb.tt +59 -0
  35. data/lib/pineapples/templates/app/models/user!=needs_user_model!.rb.tt +7 -4
  36. data/lib/pineapples/templates/app/policies!=pundit!/application_policy.rb +49 -0
  37. data/lib/pineapples/templates/app/presenters/base_presenter.rb.tt +24 -0
  38. data/lib/pineapples/templates/app/responders/application_responder.rb +9 -0
  39. data/lib/pineapples/templates/app/services/service.rb +7 -0
  40. data/lib/pineapples/templates/app/views/common/_footer.html.erb +3 -3
  41. data/lib/pineapples/templates/app/views/common/_header.html.erb +5 -5
  42. data/lib/pineapples/templates/app/views/layouts/application.html.erb.tt +0 -1
  43. data/lib/pineapples/templates/app/views/pages/home.html.erb +0 -1
  44. data/lib/pineapples/templates/bin/nginx +4 -0
  45. data/lib/pineapples/templates/bin/rails +1 -0
  46. data/lib/pineapples/templates/bin/rspec +19 -0
  47. data/lib/pineapples/templates/bin/setup +111 -21
  48. data/lib/pineapples/templates/config.ru.tt +3 -0
  49. data/lib/pineapples/templates/config/application.rb.tt +3 -3
  50. data/lib/pineapples/templates/config/boot.rb +5 -5
  51. data/lib/pineapples/templates/config/database.yml.tt +1 -1
  52. data/lib/pineapples/templates/config/environments/{development.rb → development.rb.tt} +6 -1
  53. data/lib/pineapples/templates/config/environments/production.rb +1 -1
  54. data/lib/pineapples/templates/config/environments/test.rb +2 -2
  55. data/lib/pineapples/templates/config/i18n-tasks.yml +2 -0
  56. data/lib/pineapples/templates/config/initializers/{carrierwave.rb → carrierwave!=carrierwave!.rb} +22 -22
  57. data/lib/pineapples/templates/config/initializers/devise!=devise!.rb.tt +262 -0
  58. data/lib/pineapples/templates/config/initializers/kaminari.rb +10 -0
  59. data/lib/pineapples/templates/config/initializers/seed_migrations.rb +15 -0
  60. data/lib/pineapples/templates/config/initializers/simple_form.rb +165 -0
  61. data/lib/pineapples/templates/config/locales/devise.en.yml +60 -0
  62. data/lib/pineapples/templates/config/locales/{en.yml → en.yml.tt} +2 -0
  63. data/lib/pineapples/templates/config/locales/kaminari.en.yml +17 -0
  64. data/lib/pineapples/templates/config/locales/simple_form.en.yml +31 -0
  65. data/lib/pineapples/templates/config/nginx.conf.tt +147 -0
  66. data/lib/pineapples/templates/config/puma/development.rb.tt +27 -0
  67. data/lib/pineapples/templates/config/{puma.rb → puma/production.rb} +5 -5
  68. data/lib/pineapples/templates/config/routes.rb.tt +4 -0
  69. data/lib/pineapples/templates/config/spring.rb +4 -0
  70. data/lib/pineapples/templates/lib/devise!=devise!/{ajax_failure.rb → ajax_failure!=ajax_login!.rb} +0 -0
  71. data/lib/pineapples/templates/lib/logging/custom_rack_logger.rb +7 -9
  72. data/lib/pineapples/templates/lib/logging/custom_request_logger.rb +46 -48
  73. data/lib/pineapples/templates/lib/tasks/admin!=user_role_field!.rake +18 -19
  74. data/lib/pineapples/templates/lib/templates/{erb → erb!=erb!}/scaffold/_form.html.erb +0 -0
  75. data/lib/pineapples/templates/lib/templates/haml!=haml!/scaffold/_form.html.haml +9 -0
  76. data/lib/pineapples/templates/lib/templates/slim!=slim!/scaffold/_form.html.slim +9 -0
  77. data/lib/pineapples/templates/spec/i18n_spec.rb +17 -0
  78. data/lib/pineapples/templates/spec/rails_helper.rb +30 -0
  79. data/lib/pineapples/templates/spec/spec_helper.rb +44 -0
  80. data/lib/pineapples/templates/spec/support/capybara.rb +4 -0
  81. data/lib/pineapples/templates/spec/support/database_cleaner.rb +27 -0
  82. data/lib/pineapples/templates/spec/support/email_matchers.rb +17 -0
  83. data/lib/pineapples/templates/spec/support/factory_girl.rb +14 -0
  84. data/lib/pineapples/templates/spec/support/job_helpers.rb +8 -0
  85. data/lib/pineapples/templates/spec/support/matchers.rb +10 -0
  86. data/lib/pineapples/templates/spec/support/rake_tasks.rb +8 -0
  87. data/lib/pineapples/templates/spec/support/shoulda_matchers.rb +24 -0
  88. data/lib/pineapples/version.rb +2 -2
  89. data/pineapples.gemspec +1 -3
  90. metadata +46 -12
  91. data/lib/pineapples/app_builder.rb +0 -70
  92. data/lib/pineapples/build_tasks/root_files.rb +0 -23
  93. data/lib/pineapples/templates/app/controllers/auth/confirmations_controller.rb +0 -2
@@ -1,155 +1,155 @@
1
- module Pineapples
2
- class Setting
3
- attr_reader :name, :type, :default, :question, :options
4
- attr_accessor :value
5
-
6
- VALID_TYPES = [:boolean, :numeric, :string, :symbol]
7
-
8
- def initialize(name, options = {})
9
- raise ArgumentError, "option name can't be nil" if name.nil?
10
- raise ArgumentError, "type can't be nil" if options[:type].nil?
11
-
12
- type = options[:type].to_sym
13
-
14
- raise ArgumentError, "Type :#{type} is not valid for options." if type && !valid_type?(type)
15
-
16
- @name = name
17
- @type = type || :string
18
- @default = options[:default]
19
- @value = @default if @default
20
- @question = options[:prompt]
21
- @options = Array(options[:options])
22
-
23
- validate_options_type!
24
- validate_type!(default)
25
- validate_value_in_options!(default)
26
- end
27
-
28
- def value=(setting)
29
- validate_type!(setting)
30
- validate_value_in_options!(setting)
31
- @value = setting
32
- end
33
-
34
- def valid_type?(type)
35
- VALID_TYPES.include?(type)
36
- end
37
-
38
- def has_default?
39
- @default || (@default == false)
40
- end
41
-
42
- def has_options?
43
- @options.present?
44
- end
45
-
46
- VALID_TYPES.each do |type|
47
- define_method :"#{type}?" do
48
- self.type == type
49
- end
50
- end
51
-
52
- def ask_setting
53
- if has_options?
54
- ask_with_options
55
- else
56
- if boolean?
57
- ask_boolean
58
- else
59
- ask
60
- end
61
- end
62
- end
63
-
64
- private
65
-
66
- def ask_with_options
67
- puts
68
- index = Ask.list(question_string, options_with_color, inquirer_options)
69
- puts
70
- answer = options[index]
71
- self.value = cast_to_type(answer)
72
- end
73
-
74
- def ask_boolean
75
- puts
76
- answer = Ask.confirm(question_string, inquirer_options)
77
- puts
78
- self.value = cast_to_type(answer)
79
- end
80
-
81
- def ask
82
- puts
83
- answer = Ask.input(question_string, inquirer_options)
84
- puts
85
-
86
- self.value = cast_to_type(answer)
87
- end
88
-
89
- def question_string
90
- result = ' ' * $terminal.indent_size
91
- result << question.light_yellow
92
- result << default_string if has_default?
93
- end
94
-
95
- def options_with_color
96
- options.map{ |option| option.to_s.light_blue }
97
- end
98
-
99
- def default_string
100
- " (default: #{default})".light_green
101
- end
102
-
103
- def cast_to_type(setting)
104
- case type
105
- when :numeric
106
- setting.to_f
107
- when :string
108
- setting.to_s
109
- when :symbol
110
- setting.to_sym
111
- else
112
- setting
113
- end
114
- end
115
-
116
- def validate_type(setting)
117
- value_type = case setting
118
- when nil
119
- return true
120
- when TrueClass, FalseClass
121
- :boolean
122
- when Numeric, Hash, Array, String, Symbol
123
- setting.class.name.downcase.to_sym
124
- end
125
- type == value_type
126
- end
127
-
128
- def validate_type!(setting)
129
- if !validate_type(setting)
130
- raise ArgumentError, "Setting's value must match its type."
131
- end
132
- end
133
-
134
- def validate_value_in_options!(setting)
135
- if has_options? && !options.include?(setting)
136
- raise ArgumentError, "New setting value must be one of the options"
137
- end
138
- end
139
-
140
- def validate_options_type!
141
- if options.any?{ |option| !validate_type(option) }
142
- raise ArgumentError, "Option #{option} value doesn't match setting type"
143
- end
144
- end
145
-
146
- def get_type_class
147
- Object.const_get(type.to_s.capitalize)
148
- end
149
-
150
- def inquirer_options
151
- {clear: false, response: false}
152
- end
153
-
154
- end
155
- end
1
+ module Pineapples
2
+ class Setting
3
+ attr_reader :name, :type, :default, :question, :options
4
+ attr_accessor :value
5
+
6
+ VALID_TYPES = [:boolean, :numeric, :string, :symbol]
7
+
8
+ def initialize(name, options = {})
9
+ raise ArgumentError, "option name can't be nil" if name.nil?
10
+ raise ArgumentError, "type can't be nil" if options[:type].nil?
11
+
12
+ type = options[:type].to_sym
13
+
14
+ raise ArgumentError, "Type :#{type} is not valid for options." if type && !valid_type?(type)
15
+
16
+ @name = name
17
+ @type = type || :string
18
+ @default = options[:default]
19
+ @value = @default if @default
20
+ @question = options[:prompt]
21
+ @options = Array(options[:options])
22
+
23
+ validate_options_type!
24
+ validate_type!(default)
25
+ validate_value_in_options!(default)
26
+ end
27
+
28
+ def value=(setting)
29
+ validate_type!(setting)
30
+ validate_value_in_options!(setting)
31
+ @value = setting
32
+ end
33
+
34
+ def valid_type?(type)
35
+ VALID_TYPES.include?(type)
36
+ end
37
+
38
+ def has_default?
39
+ @default || (@default == false)
40
+ end
41
+
42
+ def has_options?
43
+ @options.present?
44
+ end
45
+
46
+ VALID_TYPES.each do |type|
47
+ define_method :"#{type}?" do
48
+ self.type == type
49
+ end
50
+ end
51
+
52
+ def ask_setting
53
+ if has_options?
54
+ ask_with_options
55
+ else
56
+ if boolean?
57
+ ask_boolean
58
+ else
59
+ ask
60
+ end
61
+ end
62
+ end
63
+
64
+ private
65
+
66
+ def ask_with_options
67
+ puts
68
+ index = Ask.list(question_string, options_with_color, inquirer_options)
69
+ puts
70
+ answer = options[index]
71
+ self.value = cast_to_type(answer)
72
+ end
73
+
74
+ def ask_boolean
75
+ puts
76
+ answer = Ask.confirm(question_string, inquirer_options)
77
+ puts
78
+ self.value = cast_to_type(answer)
79
+ end
80
+
81
+ def ask
82
+ puts
83
+ answer = Ask.input(question_string, inquirer_options)
84
+ puts
85
+
86
+ self.value = cast_to_type(answer)
87
+ end
88
+
89
+ def question_string
90
+ result = ' ' * $terminal.indent_size
91
+ result << question.light_yellow
92
+ result << default_string if has_default?
93
+ end
94
+
95
+ def options_with_color
96
+ options.map{ |option| option.to_s.light_blue }
97
+ end
98
+
99
+ def default_string
100
+ " (default: #{default})".light_green
101
+ end
102
+
103
+ def cast_to_type(setting)
104
+ case type
105
+ when :numeric
106
+ setting.to_f
107
+ when :string
108
+ setting.to_s
109
+ when :symbol
110
+ setting.to_sym
111
+ else
112
+ setting
113
+ end
114
+ end
115
+
116
+ def validate_type(setting)
117
+ value_type = case setting
118
+ when nil
119
+ return true
120
+ when TrueClass, FalseClass
121
+ :boolean
122
+ when Numeric, Hash, Array, String, Symbol
123
+ setting.class.name.downcase.to_sym
124
+ end
125
+ type == value_type
126
+ end
127
+
128
+ def validate_type!(setting)
129
+ if !validate_type(setting)
130
+ raise ArgumentError, "Setting's value must match its type."
131
+ end
132
+ end
133
+
134
+ def validate_value_in_options!(setting)
135
+ if has_options? && !options.include?(setting)
136
+ raise ArgumentError, "New setting value must be one of the options"
137
+ end
138
+ end
139
+
140
+ def validate_options_type!
141
+ if options.any?{ |option| !validate_type(option) }
142
+ raise ArgumentError, "Option #{option} value doesn't match setting type"
143
+ end
144
+ end
145
+
146
+ def get_type_class
147
+ Object.const_get(type.to_s.capitalize)
148
+ end
149
+
150
+ def inquirer_options
151
+ {clear: false, response: false}
152
+ end
153
+
154
+ end
155
+ end
@@ -1,31 +1,31 @@
1
- require 'pineapples/setting'
2
-
3
- module Pineapples
4
- module Settings
5
- def settings
6
- @settings
7
- end
8
-
9
- def setting(name, opts)
10
- raw_setting = Pineapples::Setting.new(name, opts)
11
-
12
- @settings ||= {}
13
-
14
- self.settings[name] = raw_setting
15
-
16
- define_method name do
17
- self.settings[name].value
18
- end
19
-
20
- define_method :"#{name}=" do |value|
21
- self.settings[name].value = value
22
- end
23
-
24
- define_method :"#{name}?" do
25
- value = self.send(name)
26
- value.present?
27
- end
28
- end
29
-
30
- end
31
- end
1
+ require 'pineapples/setting'
2
+
3
+ module Pineapples
4
+ module Settings
5
+ def settings
6
+ @settings
7
+ end
8
+
9
+ def setting(name, opts)
10
+ raw_setting = Pineapples::Setting.new(name, opts)
11
+
12
+ @settings ||= {}
13
+
14
+ self.settings[name] = raw_setting
15
+
16
+ define_method name do
17
+ self.settings[name].value
18
+ end
19
+
20
+ define_method :"#{name}=" do |value|
21
+ self.settings[name].value = value
22
+ end
23
+
24
+ define_method :"#{name}?" do
25
+ value = self.send(name)
26
+ value.present?
27
+ end
28
+ end
29
+
30
+ end
31
+ end
@@ -6,6 +6,21 @@
6
6
  # For more information, see: https://github.com/bkeepers/dotenv
7
7
 
8
8
  SECRET_KEY_BASE=<%= app_secret %>
9
+
10
+ HOSTNAME=<%= app_name %>.local
11
+
12
+ REDIS_URL='redis://localhost:6379'
13
+
14
+ SMTP_AUTHENTICATION=plain
15
+ SMTP_STARTTLS=false
16
+ SMTP_ADDRESS=''
17
+ SMTP_DOMAIN=''
18
+ SMTP_PORT=587
19
+ SMTP_USERNAME=''
20
+ SMTP_PASSWORD=''
21
+
9
22
  SIDEKIQ_WEB_USERNAME=admin
10
23
  SIDEKIQ_WEB_PASSWORD=password
11
24
  LOG_ASSETS = false
25
+
26
+ COVERAGE=true
@@ -7,6 +7,9 @@
7
7
 
8
8
  /.env
9
9
  /.foreman
10
+ /Procfile.dev
11
+
12
+ /config/nginx.conf
10
13
 
11
14
  /coverage/*
12
15
 
@@ -0,0 +1,11 @@
1
+ SimpleCov.start 'rails' do
2
+ add_group 'Presenters', 'app/presenters'
3
+ <% if pundit? -%>
4
+ add_group 'Policies', 'app/policies'
5
+ <% end -%>
6
+ add_group 'Services', 'app/services'
7
+
8
+ add_filter '/spec/'
9
+ add_filter '/lib/templates/'
10
+ # any custom configs like groups and filters can be here at a central place
11
+ end
@@ -1,3 +1,7 @@
1
+ # Addressing this issue: https://rorsecurity.info/portfolio/rubygems-security
2
+ # TODO: remove when Bundler 2.0 comes
3
+ git_source(:github) { |repo| "https://github.com/#{repo.include?('/') ? repo : "#{repo}/#{repo}"}.git" }
4
+
1
5
  source 'https://rubygems.org'
2
6
 
3
7
  ruby '<%= RUBY_VERSION %>'
@@ -16,14 +20,20 @@ gem 'devise'
16
20
  <% end -%>
17
21
  gem 'email_validator'
18
22
  gem 'fast_blank'
19
- gem 'fixme', github: 'henrik/fixme'
23
+ gem 'fixme'
20
24
  <% if user_role_field? -%>
21
25
  gem 'highline', require: false
22
26
  <% end -%>
23
27
  gem 'hiredis'
28
+ gem 'i18n-tasks', '~> 0.9.0'
29
+ gem 'kaminari'
24
30
  gem 'pry-byebug'
25
31
  gem 'pry-rails'
32
+ <% if pundit? -%>
33
+ gem 'pundit'
34
+ <% end -%>
26
35
  gem 'rack-cache'
36
+ gem 'rack-canonical-host'
27
37
  gem 'redis', require: ['redis', 'redis/connection/hiredis']
28
38
  gem 'redis-rails'
29
39
  gem 'require_all'
@@ -47,6 +57,7 @@ gem 'font-awesome-rails'
47
57
  gem 'jquery-rails'
48
58
  gem 'sassc-rails'
49
59
  gem 'momentjs-rails'
60
+ gem 'remotipart', '~> 1.2'
50
61
  gem 'uglifier', '>= 1.3.0'
51
62
 
52
63
  <% if heroku? -%>
@@ -73,16 +84,23 @@ group :development do
73
84
  end
74
85
 
75
86
  group :test do
76
- gem 'capybara'
77
87
  gem 'database_cleaner'
78
- gem 'factory_girl_rails'
79
- gem 'rspec-rails', '~> 3.2'
80
- gem 'shoulda'
88
+ gem 'email_spec'
89
+ gem 'shoulda-matchers', '~> 3.0', require: false
90
+ gem 'simplecov', require: false
91
+ gem 'timecop'
92
+ gem 'webmock'
81
93
  end
82
94
 
83
95
  group :development, :test do
96
+ gem 'capybara-webkit'
97
+ gem 'factory_girl_rails'
98
+ gem 'rspec-rails', '~> 3.2'
84
99
  gem 'spring'
100
+ gem 'spring-commands-rspec'
101
+ <% if web_console? -%>
85
102
  gem 'web-console', '~> 2.0'
103
+ <% end -%>
86
104
  end
87
105
 
88
106
  # bundle exec rake doc:rails generates the API under doc/api.