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.
- checksums.yaml +4 -4
- data/bin/pineapples +13 -13
- data/lib/pineapples.rb +3 -1
- data/lib/pineapples/actions.rb +6 -0
- data/lib/pineapples/actions/base/target.rb +41 -91
- data/lib/pineapples/actions/bundle.rb +16 -0
- data/lib/pineapples/actions/chmod.rb +3 -2
- data/lib/pineapples/actions/copy_file.rb +1 -1
- data/lib/pineapples/actions/empty_directory.rb +1 -1
- data/lib/pineapples/actions/gsub_file.rb +5 -3
- data/lib/pineapples/actions/inside.rb +5 -1
- data/lib/pineapples/actions/rails/erb_converters.rb +11 -4
- data/lib/pineapples/actions/rails/new_hash_syntax_converter.rb +36 -0
- data/lib/pineapples/actions/rails/rails.rb +1 -0
- data/lib/pineapples/actions/remove_file.rb +28 -28
- data/lib/pineapples/actions/shell.rb +43 -9
- data/lib/pineapples/app_generator.rb +154 -38
- data/lib/pineapples/helpers.rb +31 -0
- data/lib/pineapples/parser.rb +42 -37
- data/lib/pineapples/setting.rb +155 -155
- data/lib/pineapples/settings.rb +31 -31
- data/lib/pineapples/templates/.example.env.tt +15 -0
- data/lib/pineapples/templates/.gitignore +3 -0
- data/lib/pineapples/templates/.simplecov.tt +11 -0
- data/lib/pineapples/templates/Gemfile.tt +23 -5
- data/lib/pineapples/templates/Procfile +1 -1
- data/lib/pineapples/templates/Procfile.dev.tt +2 -0
- data/lib/pineapples/templates/app/assets/javascripts/libs.js +4 -2
- data/lib/pineapples/templates/app/assets/stylesheets/application.scss +4 -1
- data/lib/pineapples/templates/app/controllers/application_controller.rb.tt +0 -2
- data/lib/pineapples/templates/app/controllers/auth!=devise!/confirmations_controller.rb +11 -0
- data/lib/pineapples/templates/app/controllers/auth!=devise!/passwords_controller.rb.tt +12 -0
- data/lib/pineapples/templates/app/controllers/auth!=devise!/registrations_controller.rb.tt +25 -0
- data/lib/pineapples/templates/app/controllers/auth!=devise!/sessions_controller.rb.tt +59 -0
- data/lib/pineapples/templates/app/models/user!=needs_user_model!.rb.tt +7 -4
- data/lib/pineapples/templates/app/policies!=pundit!/application_policy.rb +49 -0
- data/lib/pineapples/templates/app/presenters/base_presenter.rb.tt +24 -0
- data/lib/pineapples/templates/app/responders/application_responder.rb +9 -0
- data/lib/pineapples/templates/app/services/service.rb +7 -0
- data/lib/pineapples/templates/app/views/common/_footer.html.erb +3 -3
- data/lib/pineapples/templates/app/views/common/_header.html.erb +5 -5
- data/lib/pineapples/templates/app/views/layouts/application.html.erb.tt +0 -1
- data/lib/pineapples/templates/app/views/pages/home.html.erb +0 -1
- data/lib/pineapples/templates/bin/nginx +4 -0
- data/lib/pineapples/templates/bin/rails +1 -0
- data/lib/pineapples/templates/bin/rspec +19 -0
- data/lib/pineapples/templates/bin/setup +111 -21
- data/lib/pineapples/templates/config.ru.tt +3 -0
- data/lib/pineapples/templates/config/application.rb.tt +3 -3
- data/lib/pineapples/templates/config/boot.rb +5 -5
- data/lib/pineapples/templates/config/database.yml.tt +1 -1
- data/lib/pineapples/templates/config/environments/{development.rb → development.rb.tt} +6 -1
- data/lib/pineapples/templates/config/environments/production.rb +1 -1
- data/lib/pineapples/templates/config/environments/test.rb +2 -2
- data/lib/pineapples/templates/config/i18n-tasks.yml +2 -0
- data/lib/pineapples/templates/config/initializers/{carrierwave.rb → carrierwave!=carrierwave!.rb} +22 -22
- data/lib/pineapples/templates/config/initializers/devise!=devise!.rb.tt +262 -0
- data/lib/pineapples/templates/config/initializers/kaminari.rb +10 -0
- data/lib/pineapples/templates/config/initializers/seed_migrations.rb +15 -0
- data/lib/pineapples/templates/config/initializers/simple_form.rb +165 -0
- data/lib/pineapples/templates/config/locales/devise.en.yml +60 -0
- data/lib/pineapples/templates/config/locales/{en.yml → en.yml.tt} +2 -0
- data/lib/pineapples/templates/config/locales/kaminari.en.yml +17 -0
- data/lib/pineapples/templates/config/locales/simple_form.en.yml +31 -0
- data/lib/pineapples/templates/config/nginx.conf.tt +147 -0
- data/lib/pineapples/templates/config/puma/development.rb.tt +27 -0
- data/lib/pineapples/templates/config/{puma.rb → puma/production.rb} +5 -5
- data/lib/pineapples/templates/config/routes.rb.tt +4 -0
- data/lib/pineapples/templates/config/spring.rb +4 -0
- data/lib/pineapples/templates/lib/devise!=devise!/{ajax_failure.rb → ajax_failure!=ajax_login!.rb} +0 -0
- data/lib/pineapples/templates/lib/logging/custom_rack_logger.rb +7 -9
- data/lib/pineapples/templates/lib/logging/custom_request_logger.rb +46 -48
- data/lib/pineapples/templates/lib/tasks/admin!=user_role_field!.rake +18 -19
- data/lib/pineapples/templates/lib/templates/{erb → erb!=erb!}/scaffold/_form.html.erb +0 -0
- data/lib/pineapples/templates/lib/templates/haml!=haml!/scaffold/_form.html.haml +9 -0
- data/lib/pineapples/templates/lib/templates/slim!=slim!/scaffold/_form.html.slim +9 -0
- data/lib/pineapples/templates/spec/i18n_spec.rb +17 -0
- data/lib/pineapples/templates/spec/rails_helper.rb +30 -0
- data/lib/pineapples/templates/spec/spec_helper.rb +44 -0
- data/lib/pineapples/templates/spec/support/capybara.rb +4 -0
- data/lib/pineapples/templates/spec/support/database_cleaner.rb +27 -0
- data/lib/pineapples/templates/spec/support/email_matchers.rb +17 -0
- data/lib/pineapples/templates/spec/support/factory_girl.rb +14 -0
- data/lib/pineapples/templates/spec/support/job_helpers.rb +8 -0
- data/lib/pineapples/templates/spec/support/matchers.rb +10 -0
- data/lib/pineapples/templates/spec/support/rake_tasks.rb +8 -0
- data/lib/pineapples/templates/spec/support/shoulda_matchers.rb +24 -0
- data/lib/pineapples/version.rb +2 -2
- data/pineapples.gemspec +1 -3
- metadata +46 -12
- data/lib/pineapples/app_builder.rb +0 -70
- data/lib/pineapples/build_tasks/root_files.rb +0 -23
- data/lib/pineapples/templates/app/controllers/auth/confirmations_controller.rb +0 -2
data/lib/pineapples/setting.rb
CHANGED
|
@@ -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
|
data/lib/pineapples/settings.rb
CHANGED
|
@@ -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
|
|
@@ -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'
|
|
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 '
|
|
79
|
-
gem '
|
|
80
|
-
gem '
|
|
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.
|