british 0.2.3 → 0.3.0
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/lib/british.rb +115 -57
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0237633aac781d2eb9414af40b9ca1975ac4f99c
|
4
|
+
data.tar.gz: 5db567584c645c78ba84c2c9a13e4259bf0a04ca
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 10a7474b9c6dce19165ef13fda273f4d75dc1b05feae0db8305ac0e9e5b813d691e63ecae60ffad82d2b983e8cd3b8cb2f4a486793d904cfe28eea10db6a3f13
|
7
|
+
data.tar.gz: 04d4af10b3b0adaaa187bf5d4df8d4b4cb9c68406f260fa68227591c3b99aa0d33d35208582e22d248f5c4b273de75059a33f955e05eae4e9b6c8157ee20fbdf
|
data/lib/british.rb
CHANGED
@@ -1,53 +1,68 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
|
3
|
-
# Public: method_missing which tries to call "British" version before failing
|
4
|
-
# Could be included to the particular class or globally (monkey-patching Object)
|
3
|
+
# Public: method_missing which tries to call "British"/"American" version before failing
|
4
|
+
# Could be included/extended to/by the particular class or globally (monkey-patching Object)
|
5
5
|
#
|
6
6
|
# Examples
|
7
7
|
#
|
8
|
-
#
|
9
|
-
#
|
10
|
-
# class BritishObject
|
8
|
+
# Create classes with `initialise` constructor
|
9
|
+
# And your own British methods and attributes
|
11
10
|
# require 'british'
|
12
11
|
#
|
13
|
-
#
|
14
|
-
#
|
15
|
-
#
|
12
|
+
# class BritishObject < BlackBoxObject
|
13
|
+
# # use British::Initialisable within your classes only *1 …
|
14
|
+
# include British::Initialisable
|
16
15
|
#
|
17
|
-
#
|
16
|
+
# attr_reader :colour
|
18
17
|
#
|
19
|
-
#
|
20
|
-
#
|
21
|
-
#
|
22
|
-
#
|
18
|
+
# # works exactly like an initialize (including `super` usage)
|
19
|
+
# def initialise(test)
|
20
|
+
# @test = test
|
21
|
+
# @colour = 'red'
|
23
22
|
#
|
24
|
-
#
|
25
|
-
#
|
23
|
+
# super('black', 'box', 'arguments')
|
24
|
+
# end
|
26
25
|
#
|
27
|
-
#
|
28
|
-
#
|
26
|
+
# def magnetise(test)
|
27
|
+
# @test
|
28
|
+
# end
|
29
29
|
# end
|
30
|
-
# end
|
31
30
|
#
|
32
|
-
#
|
33
|
-
#
|
31
|
+
# british_object = BritishObject.new('Hello UK!')
|
32
|
+
# british_object.test # => 'Hello UK!'
|
33
|
+
#
|
34
|
+
# # Use American or British endings with any method or attribute
|
35
|
+
# british_object.color # => "red"
|
36
|
+
# british_object.colour # => "red"
|
37
|
+
#
|
38
|
+
# british_object.magnetize # => "Hello UK!"
|
39
|
+
# british_object.magnetise # => "Hello UK!"
|
40
|
+
#
|
41
|
+
# # *1 … patch third party or all the system Objects
|
42
|
+
# # (wouldn't really recommend to do the last one)
|
43
|
+
# String.include(British)
|
44
|
+
# 'cheers!'.capitalise # => "Cheers!"
|
45
|
+
#
|
46
|
+
# require 'active_support/inflector'
|
47
|
+
# include British
|
34
48
|
#
|
35
|
-
#
|
36
|
-
#
|
37
|
-
# british_object.magnetise # => "Hello UK!"
|
49
|
+
# 'cheers!'.capitalise # => "Cheers!"
|
50
|
+
# 'oi_ya_bloody_wanker'.camelise # => "OiYaBloodyWanker"
|
38
51
|
#
|
39
|
-
#
|
40
|
-
#
|
41
|
-
#
|
52
|
+
# # Extend an object instance to make it British
|
53
|
+
# not_british = SomeClass.new # with #color method
|
54
|
+
# refugee = SomeClass.new # with #color method
|
42
55
|
#
|
43
|
-
#
|
44
|
-
#
|
56
|
+
# # Make it British
|
57
|
+
# british = refugee.extend(British)
|
45
58
|
#
|
46
|
-
#
|
47
|
-
#
|
59
|
+
# not_british.colour # undefined method `colour'
|
60
|
+
# british.colour # works well
|
61
|
+
#
|
62
|
+
# # Use is_an?/an? with classes like an Array!
|
63
|
+
# [].is_an? Array # => true
|
64
|
+
# [].an? Array # => true
|
48
65
|
#
|
49
|
-
# 'cheers!'.capitalise # => "Cheers!"
|
50
|
-
# 'oi_ya_bloody_wanker'.camelise # => "OiYaBloodyWanker"
|
51
66
|
module British
|
52
67
|
# Public: Hash of British ↔ American words endings
|
53
68
|
ENDINGS = {
|
@@ -65,18 +80,24 @@ module British
|
|
65
80
|
}.freeze
|
66
81
|
|
67
82
|
# Public: Regexp pattern to search/replace British words endings
|
68
|
-
BRITISH_ENDING_PATTERN
|
83
|
+
BRITISH_ENDING_PATTERN = /#{Regexp.union(ENDINGS.keys)}(?=_|-|\?|\!|=|$)/
|
84
|
+
|
85
|
+
# Public: Regexp pattern to search/replace American words endings
|
86
|
+
AMERICAN_ENDING_PATTERN = /#{Regexp.union(ENDINGS.values)}(?=_|-|\?|\!|=|$)/
|
69
87
|
|
70
88
|
# Public: Submodule to be included in your own classes to use `initialise`
|
89
|
+
# and allow American methods to be called from outside
|
71
90
|
#
|
72
|
-
#
|
73
|
-
# sense to use it for third party classes.
|
91
|
+
# Warning: as far as `initialize` called automatically by a `new` method there
|
92
|
+
# is no sense to use it for third party classes. Use `include British` instead.
|
74
93
|
#
|
75
94
|
module Initialisable
|
76
|
-
# Public: On module being included do:
|
95
|
+
# Public: On British::Initialisable module being included do:
|
77
96
|
# 1. Check if it's a global include
|
78
97
|
# 2. Add and alias of the parent's `initialize` (for `super` calls)
|
79
98
|
# 3. Create your own initialize method (to be auto-called by the `new`)
|
99
|
+
# 4. Patch a class with British magic `method_missing`
|
100
|
+
# 5. Add aliases for `is_a?`
|
80
101
|
#
|
81
102
|
# Warning
|
82
103
|
# By including this module you redefine your initialiZe method.
|
@@ -107,14 +128,20 @@ module British
|
|
107
128
|
|
108
129
|
$VERBOSE = verbose
|
109
130
|
end
|
131
|
+
|
132
|
+
host_class.extend ClassMethods
|
133
|
+
host_class.class_overwrite_method_missing
|
134
|
+
|
135
|
+
alias_method(:is_an?, :is_a?)
|
136
|
+
alias_method(:an?, :is_an?)
|
110
137
|
end
|
111
138
|
end
|
112
139
|
|
113
|
-
# Public: aliases for
|
140
|
+
# Public: aliases (is_an?/an?) for is_a? method
|
114
141
|
alias is_an? is_a?
|
115
142
|
alias an? is_an?
|
116
143
|
|
117
|
-
# Hook to be called when British module being included
|
144
|
+
# Hook to be called when British module being included itself
|
118
145
|
# Add method_missing method with all the British 'magic' behaviour
|
119
146
|
# Extends a class to make it British
|
120
147
|
#
|
@@ -136,9 +163,18 @@ module British
|
|
136
163
|
host_class.extend ClassMethods
|
137
164
|
host_class.class_overwrite_method_missing
|
138
165
|
|
139
|
-
|
140
|
-
|
141
|
-
|
166
|
+
# Inject our own method_added hook to catch it when
|
167
|
+
# `method_missing` is added
|
168
|
+
if host_class.private_methods(true).include?(:method_added)
|
169
|
+
host_class.instance_eval do
|
170
|
+
def british_method_added(name)
|
171
|
+
original_method_added(name)
|
172
|
+
class_overwrite_method_missing if name == :method_missing
|
173
|
+
end
|
174
|
+
|
175
|
+
# do not mess with others :method_added
|
176
|
+
alias original_method_added method_added
|
177
|
+
alias method_added british_method_added
|
142
178
|
end
|
143
179
|
end
|
144
180
|
end
|
@@ -163,9 +199,18 @@ module British
|
|
163
199
|
host_object.extend ClassMethods
|
164
200
|
host_object.object_overwrite_method_missing
|
165
201
|
|
166
|
-
|
167
|
-
|
168
|
-
|
202
|
+
# Inject our own singleton_method_added hook to catch it when
|
203
|
+
# `method_missing` is added
|
204
|
+
if host_object.private_methods(true).include?(:singleton_method_added)
|
205
|
+
host_object.instance_eval do
|
206
|
+
def british_singleton_method_added(name)
|
207
|
+
original_singleton_method_added(name)
|
208
|
+
object_overwrite_method_missing if name == :method_missing
|
209
|
+
end
|
210
|
+
|
211
|
+
# do not mess with others :singleton_method_added
|
212
|
+
alias original_singleton_method_added singleton_method_added
|
213
|
+
alias singleton_method_added british_singleton_method_added
|
169
214
|
end
|
170
215
|
end
|
171
216
|
end
|
@@ -174,19 +219,23 @@ module British
|
|
174
219
|
# Defines an?, is_an?, method_missing
|
175
220
|
module ClassMethods
|
176
221
|
# Public: method to overwrite original method_missing with a magic one:
|
177
|
-
# this method_missing tries to translate British methods to American
|
178
|
-
#
|
179
|
-
# on a class level.
|
222
|
+
# this method_missing tries to translate British methods to American ones
|
223
|
+
# (or vice versa) before throwing NoMethodError if neither method was found.
|
224
|
+
# Works on a class level.
|
180
225
|
#
|
181
226
|
# name - original method name
|
182
227
|
# *args - original method args
|
183
228
|
#
|
184
229
|
# Example:
|
185
230
|
#
|
186
|
-
# # with any
|
231
|
+
# # with any American object
|
187
232
|
# british_object.colour # will be translated into color
|
188
233
|
# british_object.magnetise # will be translated into magnetize
|
189
234
|
#
|
235
|
+
# # with any British object
|
236
|
+
# british_object.color # will be translated into colour
|
237
|
+
# british_object.magnetize # will be translated into magnetise
|
238
|
+
#
|
190
239
|
# # all method endings are allowed
|
191
240
|
# british_object.surprize!
|
192
241
|
# british_object.surprize?
|
@@ -202,10 +251,16 @@ module British
|
|
202
251
|
class_eval do
|
203
252
|
unless method_defined?(:british_method_missing)
|
204
253
|
define_method(:british_method_missing) do |name, *args|
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
254
|
+
# When in our own British class
|
255
|
+
if self.class.include?(British::Initialisable)
|
256
|
+
# do American magic
|
257
|
+
britanised_name = name.to_s.gsub(AMERICAN_ENDING_PATTERN, ENDINGS.invert)
|
258
|
+
return send(britanised_name, *args) if respond_to?(britanised_name)
|
259
|
+
else
|
260
|
+
# do British magic
|
261
|
+
americanised_name = name.to_s.gsub(BRITISH_ENDING_PATTERN, ENDINGS)
|
262
|
+
return send(americanised_name, *args) if respond_to?(americanised_name)
|
263
|
+
end
|
209
264
|
|
210
265
|
# call original method_missing (avoid double original method calls)
|
211
266
|
return original_method_missing(name, *args) if caller[0] !~ /method_missing/ && defined?(:original_method_missing)
|
@@ -224,19 +279,23 @@ module British
|
|
224
279
|
end
|
225
280
|
|
226
281
|
# Public: method to overwrite original method_missing with a magic one:
|
227
|
-
# this method_missing tries to translate British methods to American
|
228
|
-
#
|
229
|
-
# on an instance level.
|
282
|
+
# this method_missing tries to translate British methods to American ones
|
283
|
+
# (or vice versa) before throwing NoMethodError if neither method was found.
|
284
|
+
# Works on an instance level.
|
230
285
|
#
|
231
286
|
# name - original method name
|
232
287
|
# *args - original method args
|
233
288
|
#
|
234
289
|
# Example:
|
235
290
|
#
|
236
|
-
# # with any
|
291
|
+
# # with any American object
|
237
292
|
# british_object.colour # will be translated into color
|
238
293
|
# british_object.magnetise # will be translated into magnetize
|
239
294
|
#
|
295
|
+
# # with any British object
|
296
|
+
# british_object.color # will be translated into colour
|
297
|
+
# british_object.magnetize # will be translated into magnetise
|
298
|
+
#
|
240
299
|
# # all method endings are allowed
|
241
300
|
# british_object.surprize!
|
242
301
|
# british_object.surprize?
|
@@ -252,7 +311,6 @@ module British
|
|
252
311
|
instance_eval do
|
253
312
|
unless respond_to?(:british_method_missing)
|
254
313
|
def british_method_missing(name, *args)
|
255
|
-
$stdout.flush
|
256
314
|
# do British magic
|
257
315
|
americanised_name = name.to_s.gsub(BRITISH_ENDING_PATTERN, ENDINGS)
|
258
316
|
return send(americanised_name, *args) if respond_to?(americanised_name)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: british
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Serge Bedzhyk
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-09-
|
11
|
+
date: 2016-09-29 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: 'Allows to use alternative words endings: -ise instead of -ize etc. Defines
|
14
14
|
`is_an?` as an alias of the is_a? method. Provides module to use `initialise` in
|