peak_flow_utils 0.0.1 → 0.1.6
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 +5 -5
- data/{LICENSE.txt → MIT-LICENSE} +1 -1
- data/README.md +22 -13
- data/Rakefile +20 -30
- data/app/assets/config/peak_flow_utils_manifest.js +2 -0
- data/app/assets/javascripts/peak_flow_utils/application.js +14 -0
- data/app/assets/stylesheets/peak_flow_utils/application.css +15 -0
- data/app/controllers/peak_flow_utils/application_controller.rb +13 -0
- data/app/controllers/peak_flow_utils/pings/sidekiq_pings_controller.rb +10 -0
- data/app/handlers/peak_flow_utils/application_handler.rb +36 -0
- data/app/handlers/peak_flow_utils/devise_handler.rb +126 -0
- data/app/handlers/peak_flow_utils/file_handler.rb +42 -0
- data/app/handlers/peak_flow_utils/model_handler.rb +123 -0
- data/app/handlers/peak_flow_utils/rails_handler.rb +206 -0
- data/app/handlers/peak_flow_utils/simple_form_handler.rb +76 -0
- data/app/handlers/peak_flow_utils/validations_handler.rb +85 -0
- data/app/handlers/peak_flow_utils/will_paginate_handler.rb +59 -0
- data/app/helpers/peak_flow_utils/application_helper.rb +2 -0
- data/app/jobs/peak_flow_utils/application_job.rb +2 -0
- data/app/mailers/peak_flow_utils/application_mailer.rb +4 -0
- data/app/migrations/20150902155200_create_translation_keys.rb +8 -0
- data/app/migrations/20150907070909_create_groups.rb +12 -0
- data/app/migrations/20150907090900_create_handlers.rb +9 -0
- data/app/migrations/20150908085500_create_translation_values.rb +13 -0
- data/app/migrations/20150908090800_create_handler_texts.rb +22 -0
- data/app/migrations/20160411190500_create_scanned_files.rb +10 -0
- data/app/migrations/peak_flow_utils/application_migration.rb +5 -0
- data/app/models/peak_flow_utils/application_record.rb +9 -0
- data/app/models/peak_flow_utils/group.rb +22 -0
- data/app/models/peak_flow_utils/handler.rb +14 -0
- data/app/models/peak_flow_utils/handler_text.rb +46 -0
- data/app/models/peak_flow_utils/scanned_file.rb +2 -0
- data/app/models/peak_flow_utils/translation_key.rb +8 -0
- data/app/models/peak_flow_utils/translation_value.rb +24 -0
- data/app/services/peak_flow_utils/application_service.rb +2 -0
- data/app/services/peak_flow_utils/attribute_service.rb +32 -0
- data/app/services/peak_flow_utils/configuration_service.rb +11 -0
- data/app/services/peak_flow_utils/database_initializer_service.rb +39 -0
- data/app/services/peak_flow_utils/erb_inspector.rb +71 -0
- data/app/services/peak_flow_utils/erb_inspector/file_inspector.rb +137 -0
- data/app/services/peak_flow_utils/erb_inspector/translation_inspector.rb +100 -0
- data/app/services/peak_flow_utils/group_service.rb +50 -0
- data/app/services/peak_flow_utils/handlers_finder_service.rb +25 -0
- data/app/services/peak_flow_utils/model_inspector.rb +133 -0
- data/app/services/peak_flow_utils/translation_service.rb +138 -0
- data/app/services/peak_flow_utils/translations_parser_service.rb +211 -0
- data/app/views/layouts/peak_flow_utils/application.html.erb +14 -0
- data/bin/peak_flow_rspec_files +4 -2
- data/config/routes.rb +2 -0
- data/lib/peak_flow_utils.rb +10 -2
- data/lib/peak_flow_utils/engine.rb +7 -0
- data/lib/peak_flow_utils/handler_helper.rb +39 -0
- data/lib/peak_flow_utils/rspec_helper.rb +162 -25
- data/lib/peak_flow_utils/version.rb +3 -0
- data/lib/tasks/peak_flow_utils_tasks.rake +6 -0
- metadata +121 -42
- data/.document +0 -5
- data/.rspec +0 -1
- data/.rubocop.yml +0 -83
- data/Gemfile +0 -20
- data/Gemfile.lock +0 -93
- data/VERSION +0 -1
- data/peak_flow_utils.gemspec +0 -65
- data/spec/peak_flow_utils_spec.rb +0 -7
- data/spec/spec_helper.rb +0 -12
@@ -0,0 +1,206 @@
|
|
1
|
+
class PeakFlowUtils::RailsHandler < PeakFlowUtils::ApplicationHandler
|
2
|
+
def groups
|
3
|
+
ArrayEnumerator.new do |yielder|
|
4
|
+
groups = %w[date_time errors helpers numbers support]
|
5
|
+
|
6
|
+
groups.each do |group|
|
7
|
+
yielder << PeakFlowUtils::GroupService.new(
|
8
|
+
id: group,
|
9
|
+
handler: self,
|
10
|
+
data: {
|
11
|
+
name: group.humanize
|
12
|
+
}
|
13
|
+
)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def translations_for_group(group)
|
19
|
+
ArrayEnumerator.new do |yielder|
|
20
|
+
dir = Rails.root.join("config", "locales", "awesome_translations", group.id).to_s
|
21
|
+
__send__("translations_for_#{group.id}", dir, group, yielder)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def translations_for_errors(dir, group, yielder) # rubocop:disable Metrics/MethodLength
|
28
|
+
add_translations_for_hash(
|
29
|
+
dir,
|
30
|
+
group,
|
31
|
+
yielder,
|
32
|
+
translations: {
|
33
|
+
errors: {
|
34
|
+
format: "%{attribute} %{message}",
|
35
|
+
messages: {
|
36
|
+
accepted: "must be accepted",
|
37
|
+
blank: "can't be blank",
|
38
|
+
confirmation: "doesn't match %{attribute}",
|
39
|
+
empty: "can't be empty",
|
40
|
+
equal_to: "must be equal to %{count}",
|
41
|
+
even: "must be even",
|
42
|
+
exclusion: "is reserved",
|
43
|
+
greater_than: "must be greater than %{count}",
|
44
|
+
greater_than_or_equal_to: "must be greater than or equal to %{count}",
|
45
|
+
inclusion: "is not included in the list",
|
46
|
+
invalid: "is invalid",
|
47
|
+
less_than: "must be less than %{count}",
|
48
|
+
less_than_or_equal_to: "must be less than or equal to %{count}",
|
49
|
+
not_a_number: "is not a number",
|
50
|
+
not_an_integer: "must be an integer",
|
51
|
+
odd: "must be odd",
|
52
|
+
record_invalid: "Validation failed: %{errors}",
|
53
|
+
restrict_dependent_destroy: {
|
54
|
+
one: "Cannot delete record because a dependent %{record} exists",
|
55
|
+
other: "Cannot delete record because dependent %{record} exist"
|
56
|
+
},
|
57
|
+
taken: "has already been taken",
|
58
|
+
too_long: {
|
59
|
+
one: "is too long (maximum is 1 character)",
|
60
|
+
other: "is too long (maximum is %{count} characters)"
|
61
|
+
},
|
62
|
+
too_short: {
|
63
|
+
one: "is too short (minimum is 1 character)",
|
64
|
+
other: "is too short (minimum is %{count} characters)"
|
65
|
+
},
|
66
|
+
wrong_length: {
|
67
|
+
one: "is the wrong length (should be 1 character)",
|
68
|
+
other: "is the wrong length (should be %{count} characters)"
|
69
|
+
}
|
70
|
+
},
|
71
|
+
template: {
|
72
|
+
body: "There were problems with the following fields:",
|
73
|
+
header: {
|
74
|
+
one: "1 error prohibited this %{model} from being saved",
|
75
|
+
other: "%{count} errors prohibited this %{model} from being saved"
|
76
|
+
}
|
77
|
+
}
|
78
|
+
}
|
79
|
+
}
|
80
|
+
)
|
81
|
+
end
|
82
|
+
|
83
|
+
def translations_for_date_time(dir, group, yielder)
|
84
|
+
add_translations_for_hash(
|
85
|
+
dir,
|
86
|
+
group,
|
87
|
+
yielder,
|
88
|
+
translations: {
|
89
|
+
date: {
|
90
|
+
formats: {
|
91
|
+
default: "%Y-%m-%d",
|
92
|
+
short: "%b %d",
|
93
|
+
long: "%B %d, %Y"
|
94
|
+
},
|
95
|
+
day_names: [0, 1, 2, 3, 4, 5, 6],
|
96
|
+
abbr_day_names: [0, 1, 2, 3, 4, 5, 6],
|
97
|
+
month_names: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],
|
98
|
+
abbr_month_names: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],
|
99
|
+
order: [0, 1, 2]
|
100
|
+
},
|
101
|
+
time: {
|
102
|
+
formats: {
|
103
|
+
default: "%a, %d %b %Y %H:%M:%S %z",
|
104
|
+
short: "%d %b %H:%M",
|
105
|
+
long: "%B %d, %Y %H:%M"
|
106
|
+
},
|
107
|
+
am: "am",
|
108
|
+
pm: "pm"
|
109
|
+
}
|
110
|
+
}
|
111
|
+
)
|
112
|
+
end
|
113
|
+
|
114
|
+
def translations_for_helpers(dir, group, yielder)
|
115
|
+
add_translations_for_hash(
|
116
|
+
dir,
|
117
|
+
group,
|
118
|
+
yielder,
|
119
|
+
translations: {
|
120
|
+
helpers: {
|
121
|
+
select: {
|
122
|
+
prompt: "Please select"
|
123
|
+
},
|
124
|
+
submit: {
|
125
|
+
create: "Create %{model}",
|
126
|
+
submit: "Save %{model}",
|
127
|
+
update: "Update %{model}"
|
128
|
+
}
|
129
|
+
}
|
130
|
+
}
|
131
|
+
)
|
132
|
+
end
|
133
|
+
|
134
|
+
def translations_for_support(dir, group, yielder)
|
135
|
+
add_translations_for_hash(
|
136
|
+
dir,
|
137
|
+
group,
|
138
|
+
yielder,
|
139
|
+
translations: {
|
140
|
+
array: {
|
141
|
+
last_word_connector: " and ",
|
142
|
+
two_words_connector: " and ",
|
143
|
+
word_connector: ", "
|
144
|
+
}
|
145
|
+
}
|
146
|
+
)
|
147
|
+
end
|
148
|
+
|
149
|
+
def translations_for_numbers(dir, group, yielder) # rubocop:disable Metrics/MethodLength
|
150
|
+
add_translations_for_hash(
|
151
|
+
dir,
|
152
|
+
group,
|
153
|
+
yielder,
|
154
|
+
translations: {
|
155
|
+
number: {
|
156
|
+
currency: {
|
157
|
+
format: {
|
158
|
+
delimiter: ",",
|
159
|
+
format: "%n %u",
|
160
|
+
separator: ".",
|
161
|
+
unit: "$"
|
162
|
+
}
|
163
|
+
},
|
164
|
+
format: {
|
165
|
+
delimiter: ",",
|
166
|
+
separator: "."
|
167
|
+
},
|
168
|
+
human: {
|
169
|
+
decimal_units: {
|
170
|
+
format: "%n %u",
|
171
|
+
units: {
|
172
|
+
billion: "Billion",
|
173
|
+
million: "Million",
|
174
|
+
quadrillion: "Quadrillion",
|
175
|
+
thousand: "Thousand",
|
176
|
+
trillion: "Trillion",
|
177
|
+
unit: ""
|
178
|
+
}
|
179
|
+
},
|
180
|
+
format: {
|
181
|
+
delimiter: ""
|
182
|
+
},
|
183
|
+
storage_units: {
|
184
|
+
format: "%n %u",
|
185
|
+
units: {
|
186
|
+
byte: {
|
187
|
+
one: "Byte",
|
188
|
+
other: "Bytes"
|
189
|
+
},
|
190
|
+
gb: "GB",
|
191
|
+
kb: "KB",
|
192
|
+
mb: "MB",
|
193
|
+
tb: "TB"
|
194
|
+
}
|
195
|
+
}
|
196
|
+
},
|
197
|
+
percentage: {
|
198
|
+
format: {
|
199
|
+
delimiter: ""
|
200
|
+
}
|
201
|
+
}
|
202
|
+
}
|
203
|
+
}
|
204
|
+
)
|
205
|
+
end
|
206
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
class PeakFlowUtils::SimpleFormHandler < PeakFlowUtils::ApplicationHandler
|
2
|
+
def enabled?
|
3
|
+
::Object.const_defined?(:SimpleForm)
|
4
|
+
end
|
5
|
+
|
6
|
+
def groups
|
7
|
+
ArrayEnumerator.new do |yielder|
|
8
|
+
PeakFlowUtils::ModelInspector.model_classes.each do |model_inspector|
|
9
|
+
yielder << PeakFlowUtils::GroupService.new(
|
10
|
+
id: model_inspector.clazz.name,
|
11
|
+
handler: self
|
12
|
+
)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def translations_for_group(group)
|
18
|
+
ArrayEnumerator.new do |yielder|
|
19
|
+
model_inspector = PeakFlowUtils::ModelInspector.model_classes.find { |model_inspector_i| model_inspector_i.clazz.name == group.name }
|
20
|
+
raise "No inspector by that name: #{group.name}" unless model_inspector
|
21
|
+
|
22
|
+
simple_form_translations(model_inspector).each { |translation| yielder << translation }
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def dir_path(model_inspector)
|
29
|
+
class_name = model_inspector.clazz.name
|
30
|
+
class_name = class_name.gsub("::", "_")
|
31
|
+
class_name = class_name.underscore
|
32
|
+
|
33
|
+
dir_path = Rails.root.join("config", "locales", "awesome_translations", "simple_form", class_name)
|
34
|
+
dir_path.to_s
|
35
|
+
end
|
36
|
+
|
37
|
+
def simple_form_translations(model_inspector)
|
38
|
+
result = []
|
39
|
+
|
40
|
+
model_inspector.attributes.each do |attribute|
|
41
|
+
translations = {}
|
42
|
+
|
43
|
+
I18n.available_locales.each do |locale|
|
44
|
+
translations[locale] = I18n.t(attribute.i18n_key, locale: locale)
|
45
|
+
end
|
46
|
+
|
47
|
+
result << PeakFlowUtils::TranslationService.new(
|
48
|
+
key: attribute.simple_form_label_key,
|
49
|
+
key_show: "#{attribute.name}.label",
|
50
|
+
dir: dir_path(model_inspector)
|
51
|
+
)
|
52
|
+
result << PeakFlowUtils::TranslationService.new(
|
53
|
+
key: attribute.simple_form_hint_key,
|
54
|
+
key_show: "#{attribute.name}.hint",
|
55
|
+
dir: dir_path(model_inspector)
|
56
|
+
)
|
57
|
+
result << PeakFlowUtils::TranslationService.new(
|
58
|
+
key: attribute.simple_form_placeholder_key,
|
59
|
+
key_show: "#{attribute.name}.placeholder",
|
60
|
+
dir: dir_path(model_inspector)
|
61
|
+
)
|
62
|
+
result << PeakFlowUtils::TranslationService.new(
|
63
|
+
key: attribute.simple_form_include_blank_key,
|
64
|
+
key_show: "#{attribute.name}.include_blank",
|
65
|
+
dir: dir_path(model_inspector)
|
66
|
+
)
|
67
|
+
result << PeakFlowUtils::TranslationService.new(
|
68
|
+
key: attribute.simple_form_prompt_key,
|
69
|
+
key_show: "#{attribute.name}.prompt",
|
70
|
+
dir: dir_path(model_inspector)
|
71
|
+
)
|
72
|
+
end
|
73
|
+
|
74
|
+
result
|
75
|
+
end
|
76
|
+
end
|
@@ -0,0 +1,85 @@
|
|
1
|
+
class PeakFlowUtils::ValidationsHandler < PeakFlowUtils::ApplicationHandler
|
2
|
+
def groups
|
3
|
+
ArrayEnumerator.new do |yielder|
|
4
|
+
PeakFlowUtils::ModelInspector.model_classes.each do |model_inspector|
|
5
|
+
yielder << PeakFlowUtils::GroupService.new(
|
6
|
+
id: model_inspector.clazz.name,
|
7
|
+
handler: self
|
8
|
+
)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def translations_for_group(group)
|
14
|
+
ArrayEnumerator.new do |yielder|
|
15
|
+
model_inspector = PeakFlowUtils::ModelInspector.model_classes.find { |model_inspector_i| model_inspector_i.clazz.name == group.name }
|
16
|
+
raise "No inspector by that name: #{group.name}" unless model_inspector
|
17
|
+
|
18
|
+
model_inspector.clazz._validators.each do |attribute_name, validators|
|
19
|
+
validators.each do |validator|
|
20
|
+
if validator.is_a?(ActiveModel::Validations::LengthValidator)
|
21
|
+
translations_for_length_validator(validator, model_inspector, attribute_name, yielder)
|
22
|
+
elsif validator.is_a?(ActiveModel::Validations::FormatValidator)
|
23
|
+
translations_for_format_validator(validator, model_inspector, attribute_name, yielder)
|
24
|
+
elsif validator.is_a?(ActiveRecord::Validations::UniquenessValidator)
|
25
|
+
translations_for_uniqueness_validator(validator, model_inspector, attribute_name, yielder)
|
26
|
+
elsif validator.class.name == "ActiveRecord::Validations::PresenceValidator"
|
27
|
+
translations_for_presence_validator(validator, model_inspector, attribute_name, yielder)
|
28
|
+
elsif validator.class.name == "EmailValidator"
|
29
|
+
translations_for_email_validator(validator, model_inspector, attribute_name, yielder)
|
30
|
+
elsif validator.class.name == "ActiveModel::Validations::ConfirmationValidator"
|
31
|
+
translations_for_confirmation_validator(validator, model_inspector, attribute_name, yielder)
|
32
|
+
else
|
33
|
+
Rails.logger.error "Unhandeled validator: #{validator.class.name}"
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
private
|
41
|
+
|
42
|
+
def translations_for_length_validator(validator, model_inspector, attribute_name, yielder)
|
43
|
+
if validator.options[:minimum].present?
|
44
|
+
add_translation("too_short", model_inspector, attribute_name, yielder) # "is too short. The minimum is %{count}"
|
45
|
+
end
|
46
|
+
|
47
|
+
if validator.options[:maximum].present?
|
48
|
+
add_translation("too_long", model_inspector, attribute_name, yielder) # "is too long. The maximum is %{count}"
|
49
|
+
end
|
50
|
+
|
51
|
+
if validator.options[:is].present?
|
52
|
+
add_translation("wrong_length", model_inspector, attribute_name, yielder) # "is not the correct length: %{count}"
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def translations_for_format_validator(_validator, model_inspector, attribute_name, yielder)
|
57
|
+
add_translation("invalid", model_inspector, attribute_name, yielder) # "is invalid"
|
58
|
+
end
|
59
|
+
|
60
|
+
def translations_for_uniqueness_validator(_validator, model_inspector, attribute_name, yielder)
|
61
|
+
add_translation("taken", model_inspector, attribute_name, yielder) # "has already been taken"
|
62
|
+
end
|
63
|
+
|
64
|
+
def translations_for_presence_validator(_validator, model_inspector, attribute_name, yielder)
|
65
|
+
add_translation("blank", model_inspector, attribute_name, yielder) # "cannot be blank"
|
66
|
+
end
|
67
|
+
|
68
|
+
def translations_for_email_validator(_validator, model_inspector, attribute_name, yielder)
|
69
|
+
add_translation("invalid", model_inspector, attribute_name, yielder) # "is invalid"
|
70
|
+
end
|
71
|
+
|
72
|
+
def translations_for_confirmation_validator(_validator, model_inspector, attribute_name, yielder)
|
73
|
+
add_translation("confirmation", model_inspector, "#{attribute_name}_confirmation", yielder)
|
74
|
+
end
|
75
|
+
|
76
|
+
def add_translation(key, model_inspector, attribute_name, yielder)
|
77
|
+
snake_clazz_name = model_inspector.clazz.name.underscore
|
78
|
+
|
79
|
+
yielder << PeakFlowUtils::TranslationService.new(
|
80
|
+
key: "activerecord.errors.models.#{snake_clazz_name}.attributes.#{attribute_name}.#{key}",
|
81
|
+
key_show: "#{attribute_name}.#{key}",
|
82
|
+
dir: "#{Rails.root}/config/locales/awesome_translations/models/#{snake_clazz_name}"
|
83
|
+
)
|
84
|
+
end
|
85
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
class PeakFlowUtils::WillPaginateHandler < PeakFlowUtils::ApplicationHandler
|
2
|
+
def enabled?
|
3
|
+
::Object.const_defined?(:WillPaginate)
|
4
|
+
end
|
5
|
+
|
6
|
+
def groups
|
7
|
+
ArrayEnumerator.new do |yielder|
|
8
|
+
groups = ["will_paginate"]
|
9
|
+
|
10
|
+
groups.each do |group|
|
11
|
+
yielder << PeakFlowUtils::GroupService.new(
|
12
|
+
id: group,
|
13
|
+
handler: self,
|
14
|
+
data: {
|
15
|
+
name: group.humanize
|
16
|
+
}
|
17
|
+
)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def translations_for_group(group)
|
23
|
+
ArrayEnumerator.new do |yielder|
|
24
|
+
dir = Rails.root.join("config", "locales", "awesome_translations", group.id).to_s
|
25
|
+
__send__("translations_for_#{group.id}", dir, group, yielder)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def translations_for_will_paginate(dir, group, yielder)
|
32
|
+
add_translations_for_hash(
|
33
|
+
dir,
|
34
|
+
group,
|
35
|
+
yielder,
|
36
|
+
translations: {
|
37
|
+
will_paginate: {
|
38
|
+
previous_label: "← Previous",
|
39
|
+
next_label: "Next →",
|
40
|
+
page_gap: "…",
|
41
|
+
page_entries_info: {
|
42
|
+
single_page: {
|
43
|
+
zero: "No %{model} found",
|
44
|
+
one: "Displaying 1 %{model}",
|
45
|
+
other: "Displaying all %{count} %{model}"
|
46
|
+
},
|
47
|
+
single_page_html: {
|
48
|
+
zero: "No %{model} found",
|
49
|
+
one: "Displaying <b>1</b> %{model}",
|
50
|
+
other: "Displaying <b>all %{count}</b> %{model}"
|
51
|
+
},
|
52
|
+
multi_page: "Displaying %{model} %{from} - %{to} of %{count} in total",
|
53
|
+
multi_page_html: "Displaying %{model} <b>%{from} - %{to}</b> of <b>%{count}</b> in total"
|
54
|
+
}
|
55
|
+
}
|
56
|
+
}
|
57
|
+
)
|
58
|
+
end
|
59
|
+
end
|