padrino-support 0.13.3.1 → 0.13.3.2
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
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ac419de645c2f3f52edf81364c8b170975b5e374
|
4
|
+
data.tar.gz: dbdec2f4d9e8f5adbbf1025ab416deb14040091f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 748ed677b332883f78061f4485dc28c5026055ad3b7af3c7abc747f2581d7b36bc3fbe77e0e5b5b00d86f6e347fa9335bface9ed5e8dd45fc61becf334312283
|
7
|
+
data.tar.gz: 586a56f27ab351fbaad2430900de3b87a9b107530cb82e169b5683420bdf27d191ed7c32722f18ad45238ad223774ec9e2665169201f988a2f82b43801795e43
|
data/lib/padrino-support.rb
CHANGED
@@ -0,0 +1,49 @@
|
|
1
|
+
##
|
2
|
+
# This module is based on Sequel 4.27.0
|
3
|
+
# sequel-4.27.0/lib/sequel/model/default_inflections.rb
|
4
|
+
#
|
5
|
+
module Padrino
|
6
|
+
# Proc that is instance evaled to create the default inflections for both the
|
7
|
+
# model inflector and the inflector extension.
|
8
|
+
DEFAULT_INFLECTIONS_PROC = proc do
|
9
|
+
plural(/$/, 's')
|
10
|
+
plural(/s$/i, 's')
|
11
|
+
plural(/(alias|(?:stat|octop|vir|b)us)$/i, '\1es')
|
12
|
+
plural(/(buffal|tomat)o$/i, '\1oes')
|
13
|
+
plural(/([ti])um$/i, '\1a')
|
14
|
+
plural(/sis$/i, 'ses')
|
15
|
+
plural(/(?:([^f])fe|([lr])f)$/i, '\1\2ves')
|
16
|
+
plural(/(hive)$/i, '\1s')
|
17
|
+
plural(/([^aeiouy]|qu)y$/i, '\1ies')
|
18
|
+
plural(/(x|ch|ss|sh)$/i, '\1es')
|
19
|
+
plural(/(matr|vert|ind)ix|ex$/i, '\1ices')
|
20
|
+
plural(/([m|l])ouse$/i, '\1ice')
|
21
|
+
|
22
|
+
singular(/s$/i, '')
|
23
|
+
singular(/([ti])a$/i, '\1um')
|
24
|
+
singular(/(analy|ba|cri|diagno|parenthe|progno|synop|the)ses$/i, '\1sis')
|
25
|
+
singular(/([^f])ves$/i, '\1fe')
|
26
|
+
singular(/([h|t]ive)s$/i, '\1')
|
27
|
+
singular(/([lr])ves$/i, '\1f')
|
28
|
+
singular(/([^aeiouy]|qu)ies$/i, '\1y')
|
29
|
+
singular(/(m)ovies$/i, '\1ovie')
|
30
|
+
singular(/(x|ch|ss|sh)es$/i, '\1')
|
31
|
+
singular(/([m|l])ice$/i, '\1ouse')
|
32
|
+
singular(/buses$/i, 'bus')
|
33
|
+
singular(/oes$/i, 'o')
|
34
|
+
singular(/shoes$/i, 'shoe')
|
35
|
+
singular(/(alias|(?:stat|octop|vir|b)us)es$/i, '\1')
|
36
|
+
singular(/(vert|ind)ices$/i, '\1ex')
|
37
|
+
singular(/matrices$/i, 'matrix')
|
38
|
+
|
39
|
+
irregular('person', 'people')
|
40
|
+
irregular('man', 'men')
|
41
|
+
irregular('child', 'children')
|
42
|
+
irregular('sex', 'sexes')
|
43
|
+
irregular('move', 'moves')
|
44
|
+
irregular('quiz', 'quizzes')
|
45
|
+
irregular('testis', 'testes')
|
46
|
+
|
47
|
+
uncountable(%w(equipment information rice money species series fish sheep news))
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,179 @@
|
|
1
|
+
##
|
2
|
+
# This module is based on Sequel 4.27.0
|
3
|
+
# sequel-4.27.0/lib/sequel/model/inflections.rb
|
4
|
+
#
|
5
|
+
require 'padrino-support/default_inflections'
|
6
|
+
|
7
|
+
module Padrino
|
8
|
+
# This module acts as a singleton returned/yielded by Sequel.inflections,
|
9
|
+
# which is used to override or specify additional inflection rules
|
10
|
+
# for Sequel. Examples:
|
11
|
+
#
|
12
|
+
# Sequel.inflections do |inflect|
|
13
|
+
# inflect.plural /^(ox)$/i, '\1\2en'
|
14
|
+
# inflect.singular /^(ox)en/i, '\1'
|
15
|
+
#
|
16
|
+
# inflect.irregular 'octopus', 'octopi'
|
17
|
+
#
|
18
|
+
# inflect.uncountable "equipment"
|
19
|
+
# end
|
20
|
+
#
|
21
|
+
# New rules are added at the top. So in the example above, the irregular rule for octopus will now be the first of the
|
22
|
+
# pluralization and singularization rules that is runs. This guarantees that your rules run before any of the rules that may
|
23
|
+
# already have been loaded.
|
24
|
+
module Inflections
|
25
|
+
CAMELIZE_CONVERT_REGEXP = /(^|_)(.)/.freeze
|
26
|
+
CAMELIZE_MODULE_REGEXP = /\/(.?)/.freeze
|
27
|
+
DASH = '-'.freeze
|
28
|
+
DEMODULIZE_CONVERT_REGEXP = /^.*::/.freeze
|
29
|
+
EMPTY_STRING= ''.freeze
|
30
|
+
SLASH = '/'.freeze
|
31
|
+
VALID_CONSTANT_NAME_REGEXP = /\A(?:::)?([A-Z]\w*(?:::[A-Z]\w*)*)\z/.freeze
|
32
|
+
UNDERSCORE = '_'.freeze
|
33
|
+
UNDERSCORE_CONVERT_REGEXP1 = /([A-Z]+)([A-Z][a-z])/.freeze
|
34
|
+
UNDERSCORE_CONVERT_REGEXP2 = /([a-z\d])([A-Z])/.freeze
|
35
|
+
UNDERSCORE_CONVERT_REPLACE = '\1_\2'.freeze
|
36
|
+
UNDERSCORE_MODULE_REGEXP = /::/.freeze
|
37
|
+
|
38
|
+
@plurals, @singulars, @uncountables = [], [], []
|
39
|
+
|
40
|
+
class << self
|
41
|
+
# Array of two element arrays, first containing a regex, and the second containing a substitution pattern, used for plurization.
|
42
|
+
attr_reader :plurals
|
43
|
+
|
44
|
+
# Array of two element arrays, first containing a regex, and the second containing a substitution pattern, used for singularization.
|
45
|
+
attr_reader :singulars
|
46
|
+
|
47
|
+
# Array of strings for words were the singular form is the same as the plural form
|
48
|
+
attr_reader :uncountables
|
49
|
+
end
|
50
|
+
|
51
|
+
# Clears the loaded inflections within a given scope (default is :all). Give the scope as a symbol of the inflection type,
|
52
|
+
# the options are: :plurals, :singulars, :uncountables
|
53
|
+
#
|
54
|
+
# Examples:
|
55
|
+
# clear :all
|
56
|
+
# clear :plurals
|
57
|
+
def self.clear(scope = :all)
|
58
|
+
case scope
|
59
|
+
when :all
|
60
|
+
@plurals, @singulars, @uncountables = [], [], []
|
61
|
+
else
|
62
|
+
instance_variable_set("@#{scope}", [])
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
# Specifies a new irregular that applies to both pluralization and singularization at the same time. This can only be used
|
67
|
+
# for strings, not regular expressions. You simply pass the irregular in singular and plural form.
|
68
|
+
#
|
69
|
+
# Examples:
|
70
|
+
# irregular 'octopus', 'octopi'
|
71
|
+
# irregular 'person', 'people'
|
72
|
+
def self.irregular(singular, plural)
|
73
|
+
plural(Regexp.new("(#{singular[0,1]})#{singular[1..-1]}$", "i"), '\1' + plural[1..-1])
|
74
|
+
singular(Regexp.new("(#{plural[0,1]})#{plural[1..-1]}$", "i"), '\1' + singular[1..-1])
|
75
|
+
end
|
76
|
+
|
77
|
+
# Specifies a new pluralization rule and its replacement. The rule can either be a string or a regular expression.
|
78
|
+
# The replacement should always be a string that may include references to the matched data from the rule.
|
79
|
+
#
|
80
|
+
# Example:
|
81
|
+
# plural(/(x|ch|ss|sh)$/i, '\1es')
|
82
|
+
def self.plural(rule, replacement)
|
83
|
+
@plurals.insert(0, [rule, replacement])
|
84
|
+
end
|
85
|
+
|
86
|
+
# Specifies a new singularization rule and its replacement. The rule can either be a string or a regular expression.
|
87
|
+
# The replacement should always be a string that may include references to the matched data from the rule.
|
88
|
+
#
|
89
|
+
# Example:
|
90
|
+
# singular(/([^aeiouy]|qu)ies$/i, '\1y')
|
91
|
+
def self.singular(rule, replacement)
|
92
|
+
@singulars.insert(0, [rule, replacement])
|
93
|
+
end
|
94
|
+
|
95
|
+
# Add uncountable words that shouldn't be attempted inflected.
|
96
|
+
#
|
97
|
+
# Examples:
|
98
|
+
# uncountable "money"
|
99
|
+
# uncountable "money", "information"
|
100
|
+
# uncountable %w( money information rice )
|
101
|
+
def self.uncountable(*words)
|
102
|
+
(@uncountables << words).flatten!
|
103
|
+
end
|
104
|
+
|
105
|
+
instance_eval(&DEFAULT_INFLECTIONS_PROC)
|
106
|
+
|
107
|
+
extend self
|
108
|
+
|
109
|
+
# Convert the given string to CamelCase. Will also convert '/' to '::' which is useful for converting paths to namespaces.
|
110
|
+
def camelize(s)
|
111
|
+
s = s.to_s
|
112
|
+
return s.camelize if s.respond_to?(:camelize)
|
113
|
+
s = s.gsub(CAMELIZE_MODULE_REGEXP){|x| "::#{x[-1..-1].upcase unless x == SLASH}"}.gsub(CAMELIZE_CONVERT_REGEXP){|x| x[-1..-1].upcase}
|
114
|
+
s
|
115
|
+
end
|
116
|
+
|
117
|
+
# Tries to find a declared constant with the name specified
|
118
|
+
# in the string. It raises a NameError when the name is not in CamelCase
|
119
|
+
# or is not initialized.
|
120
|
+
def constantize(s)
|
121
|
+
s = s.to_s
|
122
|
+
return s.constantize if s.respond_to?(:constantize)
|
123
|
+
raise(NameError, "#{s.inspect} is not a valid constant name!") unless m = VALID_CONSTANT_NAME_REGEXP.match(s)
|
124
|
+
Object.module_eval("::#{m[1]}", __FILE__, __LINE__)
|
125
|
+
end
|
126
|
+
|
127
|
+
# Removes the module part from the expression in the string
|
128
|
+
def demodulize(s)
|
129
|
+
s = s.to_s
|
130
|
+
return s.demodulize if s.respond_to?(:demodulize)
|
131
|
+
s.gsub(DEMODULIZE_CONVERT_REGEXP, EMPTY_STRING)
|
132
|
+
end
|
133
|
+
|
134
|
+
# Returns the plural form of the word in the string.
|
135
|
+
def pluralize(s)
|
136
|
+
s = s.to_s
|
137
|
+
return s.pluralize if s.respond_to?(:pluralize)
|
138
|
+
result = s.dup
|
139
|
+
Inflections.plurals.each{|(rule, replacement)| break if result.gsub!(rule, replacement)} unless Inflections.uncountables.include?(s.downcase)
|
140
|
+
result
|
141
|
+
end
|
142
|
+
|
143
|
+
# The reverse of pluralize, returns the singular form of a word in a string.
|
144
|
+
def singularize(s)
|
145
|
+
s = s.to_s
|
146
|
+
return s.singularize if s.respond_to?(:singularize)
|
147
|
+
result = s.dup
|
148
|
+
Inflections.singulars.each{|(rule, replacement)| break if result.gsub!(rule, replacement)} unless Inflections.uncountables.include?(s.downcase)
|
149
|
+
result
|
150
|
+
end
|
151
|
+
|
152
|
+
# The reverse of camelize. Makes an underscored form from the expression in the string.
|
153
|
+
# Also changes '::' to '/' to convert namespaces to paths.
|
154
|
+
def underscore(s)
|
155
|
+
s = s.to_s
|
156
|
+
return s.underscore if s.respond_to?(:underscore)
|
157
|
+
s.gsub(UNDERSCORE_MODULE_REGEXP, SLASH).gsub(UNDERSCORE_CONVERT_REGEXP1, UNDERSCORE_CONVERT_REPLACE).
|
158
|
+
gsub(UNDERSCORE_CONVERT_REGEXP2, UNDERSCORE_CONVERT_REPLACE).tr(DASH, UNDERSCORE).downcase
|
159
|
+
end
|
160
|
+
|
161
|
+
##
|
162
|
+
# Capitalizes the first word, turns underscores into spaces, and strips a trailing '_id' if present.
|
163
|
+
#
|
164
|
+
def humanize(s)
|
165
|
+
s = s.to_s
|
166
|
+
return s.humanize if s.respond_to?(:humanize)
|
167
|
+
s.gsub(/_id$/, '').tr('_', ' ').capitalize
|
168
|
+
end
|
169
|
+
|
170
|
+
##
|
171
|
+
# Create a class name from a plural table name like Rails does for table names to models.
|
172
|
+
#
|
173
|
+
def classify(s)
|
174
|
+
s = s.to_s
|
175
|
+
return s.classify if s.respond_to?(:classify)
|
176
|
+
camelize(singularize(s.sub(/.*\./, '')))
|
177
|
+
end
|
178
|
+
end
|
179
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: padrino-support
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.13.3.
|
4
|
+
version: 0.13.3.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Padrino Team
|
@@ -12,7 +12,7 @@ authors:
|
|
12
12
|
autorequire:
|
13
13
|
bindir: bin
|
14
14
|
cert_chain: []
|
15
|
-
date: 2016-
|
15
|
+
date: 2016-09-06 00:00:00.000000000 Z
|
16
16
|
dependencies:
|
17
17
|
- !ruby/object:Gem::Dependency
|
18
18
|
name: activesupport
|
@@ -42,8 +42,9 @@ files:
|
|
42
42
|
- lib/padrino-support.rb
|
43
43
|
- lib/padrino-support/core_ext/object_space.rb
|
44
44
|
- lib/padrino-support/core_ext/string/colorize.rb
|
45
|
-
- lib/padrino-support/
|
45
|
+
- lib/padrino-support/default_inflections.rb
|
46
46
|
- lib/padrino-support/file_set.rb
|
47
|
+
- lib/padrino-support/inflections.rb
|
47
48
|
- lib/padrino-support/locale/cs.yml
|
48
49
|
- lib/padrino-support/locale/da.yml
|
49
50
|
- lib/padrino-support/locale/de.yml
|
@@ -1,118 +0,0 @@
|
|
1
|
-
require 'active_support/inflections' # load default inflections
|
2
|
-
require 'active_support/inflector/methods' # constantize
|
3
|
-
require 'active_support/inflector/inflections' # pluralize
|
4
|
-
|
5
|
-
##
|
6
|
-
# This is an adapted version of active_support/core_ext/string/inflections.rb
|
7
|
-
# to prevent loading several dependencies including I18n gem.
|
8
|
-
#
|
9
|
-
# Issue: https://github.com/rails/rails/issues/1526
|
10
|
-
#
|
11
|
-
class String
|
12
|
-
##
|
13
|
-
# Returns the plural form of the word in the string.
|
14
|
-
#
|
15
|
-
# "post".pluralize # => "posts"
|
16
|
-
# "octopus".pluralize # => "octopi"
|
17
|
-
# "sheep".pluralize # => "sheep"
|
18
|
-
# "words".pluralize # => "words"
|
19
|
-
# "the blue mailman".pluralize # => "the blue mailmen"
|
20
|
-
# "CamelOctopus".pluralize # => "CamelOctopi"
|
21
|
-
#
|
22
|
-
def pluralize
|
23
|
-
ActiveSupport::Inflector.pluralize(self)
|
24
|
-
end
|
25
|
-
|
26
|
-
##
|
27
|
-
# Returns the singular form of the word in the string.
|
28
|
-
#
|
29
|
-
# "posts".singularize # => "post"
|
30
|
-
# "octopi".singularize # => "octopus"
|
31
|
-
# "sheep".singularize # => "sheep"
|
32
|
-
# "words".singularize # => "word"
|
33
|
-
# "the blue mailmen".singularize # => "the blue mailman"
|
34
|
-
# "CamelOctopi".singularize # => "CamelOctopus"
|
35
|
-
#
|
36
|
-
def singularize
|
37
|
-
ActiveSupport::Inflector.singularize(self)
|
38
|
-
end
|
39
|
-
|
40
|
-
##
|
41
|
-
# +constantize+ tries to find a declared constant with the name specified
|
42
|
-
# in the string. It raises a NameError when the name is not in CamelCase
|
43
|
-
# or is not initialized.
|
44
|
-
#
|
45
|
-
# "Module".constantize # => Module
|
46
|
-
# "Class".constantize # => Class
|
47
|
-
#
|
48
|
-
def constantize
|
49
|
-
ActiveSupport::Inflector.constantize(self)
|
50
|
-
end
|
51
|
-
|
52
|
-
##
|
53
|
-
# The reverse of +camelize+. Makes an underscored, lowercase form from the expression in the string.
|
54
|
-
#
|
55
|
-
# +underscore+ will also change '::' to '/' to convert namespaces to paths.
|
56
|
-
#
|
57
|
-
# "ActiveRecord".underscore # => "active_record"
|
58
|
-
# "ActiveRecord::Errors".underscore # => active_record/errors
|
59
|
-
#
|
60
|
-
def underscore
|
61
|
-
ActiveSupport::Inflector.underscore(self)
|
62
|
-
end
|
63
|
-
|
64
|
-
##
|
65
|
-
# By default, +camelize+ converts strings to UpperCamelCase. If the argument to camelize
|
66
|
-
# is set to <tt>:lower</tt> then camelize produces lowerCamelCase.
|
67
|
-
#
|
68
|
-
# +camelize+ will also convert '/' to '::' which is useful for converting paths to namespaces.
|
69
|
-
#
|
70
|
-
# "active_record".camelize # => "ActiveRecord"
|
71
|
-
# "active_record".camelize(:lower) # => "activeRecord"
|
72
|
-
# "active_record/errors".camelize # => "ActiveRecord::Errors"
|
73
|
-
# "active_record/errors".camelize(:lower) # => "activeRecord::Errors"
|
74
|
-
#
|
75
|
-
def camelize(first_letter = :upper)
|
76
|
-
case first_letter
|
77
|
-
when :upper then ActiveSupport::Inflector.camelize(self, true)
|
78
|
-
when :lower then ActiveSupport::Inflector.camelize(self, false)
|
79
|
-
end
|
80
|
-
end
|
81
|
-
alias_method :camelcase, :camelize
|
82
|
-
|
83
|
-
##
|
84
|
-
# Create a class name from a plural table name like Rails does for table names to models.
|
85
|
-
# Note that this returns a string and not a class. (To convert to an actual class
|
86
|
-
# follow +classify+ with +constantize+.)
|
87
|
-
#
|
88
|
-
# "egg_and_hams".classify # => "EggAndHam"
|
89
|
-
# "posts".classify # => "Post"
|
90
|
-
#
|
91
|
-
# Singular names are not handled correctly.
|
92
|
-
#
|
93
|
-
# "business".classify # => "Busines"
|
94
|
-
#
|
95
|
-
def classify
|
96
|
-
ActiveSupport::Inflector.classify(self)
|
97
|
-
end
|
98
|
-
|
99
|
-
##
|
100
|
-
# Capitalizes the first word, turns underscores into spaces, and strips a trailing '_id' if present.
|
101
|
-
#
|
102
|
-
if ActiveSupport::Inflector.method(:humanize).arity == 1
|
103
|
-
def humanize
|
104
|
-
ActiveSupport::Inflector.humanize(self)
|
105
|
-
end
|
106
|
-
else
|
107
|
-
def humanize(options = {})
|
108
|
-
ActiveSupport::Inflector.humanize(self, options)
|
109
|
-
end
|
110
|
-
end
|
111
|
-
|
112
|
-
##
|
113
|
-
# Replaces underscores with dashes in the string.
|
114
|
-
#
|
115
|
-
def dasherize
|
116
|
-
ActiveSupport::Inflector.dasherize(self)
|
117
|
-
end
|
118
|
-
end
|