pineapples 0.3.34 → 0.3.345

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 (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.