fuby 0.0.1

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 (222) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +17 -0
  3. data/.ruby-version +1 -0
  4. data/Gemfile +4 -0
  5. data/LICENSE.txt +22 -0
  6. data/README.md +29 -0
  7. data/Rakefile +8 -0
  8. data/VERSION +1 -0
  9. data/fuby.gemspec +21 -0
  10. data/lib/fuby.rb +1 -0
  11. data/lib/fuby/abbreviation.rb +20 -0
  12. data/lib/fuby/alias_method.rb +13 -0
  13. data/lib/fuby/all.rb +11 -0
  14. data/lib/fuby/and.rb +9 -0
  15. data/lib/fuby/any.rb +11 -0
  16. data/lib/fuby/attributes.rb +17 -0
  17. data/lib/fuby/bind.rb +21 -0
  18. data/lib/fuby/class_attributes.rb +39 -0
  19. data/lib/fuby/deep.rb +1 -0
  20. data/lib/fuby/deep_each.rb +14 -0
  21. data/lib/fuby/define_instance_method.rb +18 -0
  22. data/lib/fuby/define_missing_method.rb +36 -0
  23. data/lib/fuby/define_object_method.rb +18 -0
  24. data/lib/fuby/define_tok.rb +11 -0
  25. data/lib/fuby/descendants.rb +15 -0
  26. data/lib/fuby/dimension.rb +23 -0
  27. data/lib/fuby/drop.rb +20 -0
  28. data/lib/fuby/drop_until.rb +18 -0
  29. data/lib/fuby/drop_while.rb +15 -0
  30. data/lib/fuby/each.rb +2 -0
  31. data/lib/fuby/each_with_index_or_key.rb +19 -0
  32. data/lib/fuby/eql.rb +1 -0
  33. data/lib/fuby/eql_componentwise.rb +13 -0
  34. data/lib/fuby/equivalence.rb +13 -0
  35. data/lib/fuby/eval.rb +54 -0
  36. data/lib/fuby/extend.rb +13 -0
  37. data/lib/fuby/format.rb +9 -0
  38. data/lib/fuby/include.rb +13 -0
  39. data/lib/fuby/index_or_key.rb +19 -0
  40. data/lib/fuby/instance_attributes.rb +39 -0
  41. data/lib/fuby/intercept.rb +27 -0
  42. data/lib/fuby/invert.rb +16 -0
  43. data/lib/fuby/longest_common.rb +16 -0
  44. data/lib/fuby/matches.rb +11 -0
  45. data/lib/fuby/matches_componentwise.rb +11 -0
  46. data/lib/fuby/matches_part_of.rb +16 -0
  47. data/lib/fuby/matches_prefix_of.rb +11 -0
  48. data/lib/fuby/matches_suffix_of.rb +13 -0
  49. data/lib/fuby/member.rb +11 -0
  50. data/lib/fuby/merge.rb +20 -0
  51. data/lib/fuby/merge_css.rb +32 -0
  52. data/lib/fuby/method_added_as.rb +1 -0
  53. data/lib/fuby/method_added_as_binary_operator.rb +16 -0
  54. data/lib/fuby/method_added_as_filter.rb +19 -0
  55. data/lib/fuby/new.rb +16 -0
  56. data/lib/fuby/not.rb +25 -0
  57. data/lib/fuby/opposite.rb +29 -0
  58. data/lib/fuby/or.rb +9 -0
  59. data/lib/fuby/otherwise.rb +18 -0
  60. data/lib/fuby/part_of.rb +16 -0
  61. data/lib/fuby/plus.rb +10 -0
  62. data/lib/fuby/pop.rb +11 -0
  63. data/lib/fuby/pop_if.rb +15 -0
  64. data/lib/fuby/pop_options.rb +15 -0
  65. data/lib/fuby/pop_unless.rb +11 -0
  66. data/lib/fuby/pop_until.rb +11 -0
  67. data/lib/fuby/pop_while.rb +11 -0
  68. data/lib/fuby/prefix_of.rb +14 -0
  69. data/lib/fuby/prefixes.rb +11 -0
  70. data/lib/fuby/prepend.rb +11 -0
  71. data/lib/fuby/private.rb +11 -0
  72. data/lib/fuby/protected.rb +11 -0
  73. data/lib/fuby/public.rb +11 -0
  74. data/lib/fuby/push.rb +1 -0
  75. data/lib/fuby/push_options.rb +9 -0
  76. data/lib/fuby/random.rb +31 -0
  77. data/lib/fuby/self_and_descendants.rb +15 -0
  78. data/lib/fuby/shift.rb +11 -0
  79. data/lib/fuby/shift_if.rb +12 -0
  80. data/lib/fuby/shift_options.rb +11 -0
  81. data/lib/fuby/shift_unless.rb +12 -0
  82. data/lib/fuby/shift_until.rb +12 -0
  83. data/lib/fuby/shift_while.rb +16 -0
  84. data/lib/fuby/splat.rb +11 -0
  85. data/lib/fuby/strip.rb +24 -0
  86. data/lib/fuby/subclass.rb +22 -0
  87. data/lib/fuby/submodule.rb +22 -0
  88. data/lib/fuby/suffix_of.rb +19 -0
  89. data/lib/fuby/suffixes.rb +11 -0
  90. data/lib/fuby/take.rb +20 -0
  91. data/lib/fuby/take_until.rb +17 -0
  92. data/lib/fuby/take_while.rb +14 -0
  93. data/lib/fuby/tap.rb +28 -0
  94. data/lib/fuby/to.rb +1 -0
  95. data/lib/fuby/to_boolean.rb +32 -0
  96. data/lib/fuby/to_camel_case.rb +32 -0
  97. data/lib/fuby/to_case.rb +1 -0
  98. data/lib/fuby/to_components.rb +33 -0
  99. data/lib/fuby/to_dash_case.rb +28 -0
  100. data/lib/fuby/to_hash.rb +25 -0
  101. data/lib/fuby/to_pred.rb +7 -0
  102. data/lib/fuby/to_proc.rb +45 -0
  103. data/lib/fuby/to_regexp.rb +38 -0
  104. data/lib/fuby/to_snake_case.rb +28 -0
  105. data/lib/fuby/to_tok.rb +27 -0
  106. data/lib/fuby/tok.rb +2 -0
  107. data/lib/fuby/tok_arity.rb +18 -0
  108. data/lib/fuby/tok_direction.rb +16 -0
  109. data/lib/fuby/tok_parity.rb +11 -0
  110. data/lib/fuby/tok_side.rb +11 -0
  111. data/lib/fuby/try.rb +73 -0
  112. data/lib/fuby/try_each.rb +25 -0
  113. data/lib/fuby/try_eval.rb +19 -0
  114. data/lib/fuby/try_exec.rb +15 -0
  115. data/lib/fuby/unabbreviation.rb +17 -0
  116. data/lib/fuby/unshift.rb +1 -0
  117. data/lib/fuby/unshift_options.rb +11 -0
  118. data/lib/fuby/uuid.rb +28 -0
  119. data/test/fuby/abbreviation.rb +25 -0
  120. data/test/fuby/alias_method.rb +29 -0
  121. data/test/fuby/all.rb +15 -0
  122. data/test/fuby/and.rb +14 -0
  123. data/test/fuby/any.rb +15 -0
  124. data/test/fuby/attributes.rb +0 -0
  125. data/test/fuby/bind.rb +17 -0
  126. data/test/fuby/class_attributes.rb +0 -0
  127. data/test/fuby/deep.rb +0 -0
  128. data/test/fuby/deep_each.rb +0 -0
  129. data/test/fuby/define_missing_method.rb +33 -0
  130. data/test/fuby/define_tok.rb +0 -0
  131. data/test/fuby/descendants.rb +0 -0
  132. data/test/fuby/dimension.rb +0 -0
  133. data/test/fuby/drop.rb +28 -0
  134. data/test/fuby/drop_until.rb +26 -0
  135. data/test/fuby/drop_while.rb +26 -0
  136. data/test/fuby/each.rb +0 -0
  137. data/test/fuby/each_with_index_or_key.rb +22 -0
  138. data/test/fuby/eql.rb +0 -0
  139. data/test/fuby/eql_componentwise.rb +0 -0
  140. data/test/fuby/equivalence.rb +0 -0
  141. data/test/fuby/eval.rb +0 -0
  142. data/test/fuby/extend.rb +20 -0
  143. data/test/fuby/format.rb +0 -0
  144. data/test/fuby/include.rb +20 -0
  145. data/test/fuby/index_or_key.rb +0 -0
  146. data/test/fuby/instance_attributes.rb +0 -0
  147. data/test/fuby/intercept.rb +16 -0
  148. data/test/fuby/invert.rb +0 -0
  149. data/test/fuby/longest_common.rb +0 -0
  150. data/test/fuby/matches.rb +0 -0
  151. data/test/fuby/matches_componentwise.rb +0 -0
  152. data/test/fuby/matches_prefix_of.rb +0 -0
  153. data/test/fuby/matches_suffix_of.rb +0 -0
  154. data/test/fuby/member.rb +0 -0
  155. data/test/fuby/merge.rb +0 -0
  156. data/test/fuby/merge_css.rb +0 -0
  157. data/test/fuby/method_added_as.rb +0 -0
  158. data/test/fuby/method_added_as_binary_operator.rb +20 -0
  159. data/test/fuby/method_added_as_filter.rb +28 -0
  160. data/test/fuby/new.rb +3 -0
  161. data/test/fuby/not.rb +0 -0
  162. data/test/fuby/opposite.rb +0 -0
  163. data/test/fuby/or.rb +19 -0
  164. data/test/fuby/otherwise.rb +30 -0
  165. data/test/fuby/part_of.rb +0 -0
  166. data/test/fuby/plus.rb +0 -0
  167. data/test/fuby/pop.rb +0 -0
  168. data/test/fuby/pop_if.rb +31 -0
  169. data/test/fuby/pop_options.rb +31 -0
  170. data/test/fuby/pop_unless.rb +0 -0
  171. data/test/fuby/pop_until.rb +0 -0
  172. data/test/fuby/pop_while.rb +0 -0
  173. data/test/fuby/prefix_of.rb +0 -0
  174. data/test/fuby/prefixes.rb +13 -0
  175. data/test/fuby/prepend.rb +34 -0
  176. data/test/fuby/private.rb +0 -0
  177. data/test/fuby/protected.rb +0 -0
  178. data/test/fuby/public.rb +0 -0
  179. data/test/fuby/push.rb +0 -0
  180. data/test/fuby/push_options.rb +32 -0
  181. data/test/fuby/random.rb +0 -0
  182. data/test/fuby/self_and_descendants.rb +0 -0
  183. data/test/fuby/shift.rb +0 -0
  184. data/test/fuby/shift_if.rb +0 -0
  185. data/test/fuby/shift_options.rb +0 -0
  186. data/test/fuby/shift_unless.rb +0 -0
  187. data/test/fuby/shift_until.rb +0 -0
  188. data/test/fuby/shift_while.rb +0 -0
  189. data/test/fuby/splat.rb +0 -0
  190. data/test/fuby/strip.rb +0 -0
  191. data/test/fuby/submodule.rb +15 -0
  192. data/test/fuby/suffix_of.rb +0 -0
  193. data/test/fuby/suffixes.rb +13 -0
  194. data/test/fuby/take.rb +0 -0
  195. data/test/fuby/take_until.rb +0 -0
  196. data/test/fuby/take_while.rb +0 -0
  197. data/test/fuby/tap.rb +58 -0
  198. data/test/fuby/to_boolean.rb +31 -0
  199. data/test/fuby/to_camel_case.rb +15 -0
  200. data/test/fuby/to_components.rb +0 -0
  201. data/test/fuby/to_dash_case.rb +15 -0
  202. data/test/fuby/to_hash.rb +23 -0
  203. data/test/fuby/to_pred.rb +25 -0
  204. data/test/fuby/to_proc.rb +56 -0
  205. data/test/fuby/to_regexp.rb +38 -0
  206. data/test/fuby/to_snake_case.rb +15 -0
  207. data/test/fuby/to_tok.rb +0 -0
  208. data/test/fuby/tok.rb +0 -0
  209. data/test/fuby/tok_arity.rb +0 -0
  210. data/test/fuby/tok_direction.rb +0 -0
  211. data/test/fuby/tok_parity.rb +0 -0
  212. data/test/fuby/tok_side.rb +0 -0
  213. data/test/fuby/try.rb +52 -0
  214. data/test/fuby/try_each.rb +30 -0
  215. data/test/fuby/try_eval.rb +34 -0
  216. data/test/fuby/try_exec.rb +0 -0
  217. data/test/fuby/unabbreviation.rb +25 -0
  218. data/test/fuby/unshift.rb +0 -0
  219. data/test/fuby/unshift_options.rb +0 -0
  220. data/test/fuby/uuid.rb +31 -0
  221. data/test/fuby/version.rb +0 -0
  222. metadata +369 -0
@@ -0,0 +1,38 @@
1
+ module Fuby
2
+ refine ::Regexp do
3
+
4
+ def to_regexp
5
+ dup
6
+ end
7
+
8
+ alias_method :to_re, :to_regexp
9
+
10
+ end
11
+ refine ::Array do
12
+
13
+ def to_regexp
14
+ ::Regexp.new map { |term| term.to_regexp.source }.join '|'
15
+ end
16
+
17
+ alias_method :to_re, :to_regexp
18
+
19
+ end
20
+ refine ::String do
21
+
22
+ def to_regexp
23
+ ::Regexp.new "(_|\\b|[^A-z])#{ ::Regexp.escape self }(_|\\b|[^A-z])"
24
+ end
25
+
26
+ alias_method :to_re, :to_regexp
27
+
28
+ end
29
+ refine ::Symbol do
30
+
31
+ def to_regexp
32
+ to_s.to_re
33
+ end
34
+
35
+ alias_method :to_re, :to_regexp
36
+
37
+ end
38
+ end
@@ -0,0 +1,28 @@
1
+ require_relative 'to_components'
2
+
3
+ using Fuby
4
+
5
+ module Fuby
6
+ refine ::String do
7
+
8
+ def to_snake_case
9
+ to_components.join('_').downcase
10
+ end
11
+
12
+ def to_SNAKE_CASE
13
+ to_components.join('_').upcase
14
+ end
15
+
16
+ end
17
+ refine ::Symbol do
18
+
19
+ def to_snake_case
20
+ @to_snake_case ||= to_s.to_snake_case.to_sym
21
+ end
22
+
23
+ def to_SNAKE_CASE
24
+ @to_SNAKE_CASE ||= to_s.to_SNAKE_CASE.to_sym
25
+ end
26
+
27
+ end
28
+ end
@@ -0,0 +1,27 @@
1
+
2
+ module Fuby
3
+ module ::Enumerable # can't refine Module
4
+
5
+ def to_tok
6
+ ::Proc.new &method(:[])
7
+ end
8
+
9
+ end
10
+ refine ::Hash do
11
+
12
+ def to_tok
13
+ invert.to_proc
14
+ end
15
+
16
+ end
17
+ refine ::Regexp do
18
+
19
+ def to_tok
20
+ proc do |str|
21
+ match = str.match self
22
+ match.names[ match.captures.index &:just? ].to_sym
23
+ end
24
+ end
25
+
26
+ end
27
+ end
data/lib/fuby/tok.rb ADDED
@@ -0,0 +1,2 @@
1
+ Dir.glob "#{ __FILE__.chomp ".rb" }_*.rb", &method(:require)
2
+
@@ -0,0 +1,18 @@
1
+ module Fuby
2
+ refine ::Proc do
3
+
4
+ def tok_arity
5
+ arity.tok_arity
6
+ end
7
+
8
+ end
9
+ refine ::Integer do
10
+
11
+ TOK_ARITY = [ :nullary, :unary, :binary, :ternary, :quaternary ].freeze
12
+
13
+ def tok_arity
14
+ TOK_ARITY[ self ]
15
+ end
16
+
17
+ end
18
+ end
@@ -0,0 +1,16 @@
1
+ require_relative 'define_tok'
2
+
3
+ module Fuby
4
+ refine ::String do
5
+
6
+ define_tok :tok_direction, up: /^u/i,
7
+ down: /^d/i,
8
+ left: /^l/i,
9
+ right: /^r/i,
10
+ ascending: /^ascending/i,
11
+ asc: /^asc/i,
12
+ descending: /^descending/i,
13
+ desc: /^desc/i
14
+
15
+ end
16
+ end
@@ -0,0 +1,11 @@
1
+ module Fuby
2
+ refine ::Integer do
3
+
4
+ TOK_PARITY = [ :even, :odd ].freeze
5
+
6
+ def tok_parity
7
+ TOK_PARITY[ self % 2 ]
8
+ end
9
+
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ require_relative 'define_tok'
2
+
3
+ module Fuby
4
+ refine ::String do
5
+
6
+ define_tok :tok_side, top: /^t/i,
7
+ left: /^l/i,
8
+ right: /^r/i,
9
+ bottom: /^b/i
10
+ end
11
+ end
data/lib/fuby/try.rb ADDED
@@ -0,0 +1,73 @@
1
+ module Fuby
2
+ refine ::Object do
3
+
4
+ def try *sig, &blk
5
+ if sig.empty?
6
+ if block_given?
7
+ result = yield Try::Many.new self
8
+ return result.__unwrap__ if Try::Base === result
9
+ return result
10
+ end
11
+ return Try::Once.new self
12
+ else
13
+ return send *sig, &blk if respond_to? sig.first
14
+ return nil
15
+ end
16
+ end
17
+
18
+ def try? *sig, &blk
19
+ if sig.empty?
20
+ if block_given?
21
+ result = yield Try::Many.new self, self
22
+ return result.__unwrap__ if Try::Base === result
23
+ return result
24
+ end
25
+ return Try::Once.new self, self
26
+ else
27
+ return send *sig, &blk if respond_to? sig.first
28
+ return self
29
+ end
30
+ end
31
+
32
+ end
33
+ module Try
34
+
35
+ class Base < BasicObject
36
+
37
+ def initialize object, maybe = nil
38
+ @object = object
39
+ @maybe = maybe
40
+ @class = (class << self; self end).superclass
41
+ end
42
+
43
+ def method_missing key, *sig, &blk
44
+ return __wrap__ @object.send key, *sig, &blk if @object.respond_to? key
45
+ return __wrap__ nil
46
+ end
47
+
48
+ def __unwrap__
49
+ @object.nil? ? @maybe : @object
50
+ end
51
+
52
+ def __wrap__ result
53
+ @class.new result, @maybe
54
+ end
55
+
56
+ end
57
+
58
+ class Once < Base
59
+
60
+ def __wrap__ result
61
+ super.__unwrap__
62
+ end
63
+
64
+ end
65
+
66
+ class Many < Base
67
+ end
68
+
69
+ end
70
+ end
71
+
72
+ Dir.glob "#{ __FILE__.chomp ".rb" }_*.rb", &method(:require)
73
+
@@ -0,0 +1,25 @@
1
+ require_relative 'try'
2
+
3
+ using Fuby
4
+
5
+ module Fuby
6
+ refine ::Object do
7
+
8
+ def try_each *sig, &blk
9
+ return Try::Each.new self if sig.empty? && !blk
10
+ return each { |arg| arg.try *sig, &blk }
11
+ end
12
+
13
+ end
14
+ module Try
15
+
16
+ class Each < Base
17
+
18
+ def method_missing *sig, &blk
19
+ @object.each { |arg| arg.try *sig, &blk }
20
+ end
21
+
22
+ end
23
+
24
+ end
25
+ end
@@ -0,0 +1,19 @@
1
+ require 'fuby/try'
2
+
3
+ module Fuby
4
+ refine ::Object do
5
+
6
+ def try_eval &blk
7
+ result = (Try::Many.new self).instance_eval &blk
8
+ return result.__unwrap__ if Try::Base === result
9
+ return result
10
+ end
11
+
12
+ def try_eval? &blk
13
+ result = (Try::Many.new self, self).instance_eval &blk
14
+ return result.__unwrap__ if Try::Base === result
15
+ return result
16
+ end
17
+
18
+ end
19
+ end
@@ -0,0 +1,15 @@
1
+ require_relative 'try_eval'
2
+
3
+ module Fuby
4
+ refine ::Object do
5
+
6
+ def try_exec &blk
7
+ try_eval &blk
8
+ end
9
+
10
+ def try_exec? &blk
11
+ try_eval? &blk
12
+ end
13
+
14
+ end
15
+ end
@@ -0,0 +1,17 @@
1
+ require 'fuby/abbreviation'
2
+
3
+ module Fuby
4
+ refine ::Symbol do
5
+
6
+ attr_reader :unabbreviation
7
+ alias_method :unabbr, :unabbreviation
8
+
9
+ def unabbreviation= sym
10
+ raise ArgumentError, "`unabbreviation` of a Symbol must be a Symbol, found #{ sym.class }: #{ sym }" unless Symbol === sym
11
+ raise ArgumentError, "`unabbreviation` of :#{ self } already :#{ unabbreviation }, found #{ sym }" unless @unabbreviation.nil? || @unabbreviation == sym
12
+ return if @unabbreviation == sym
13
+ @unabbreviation = sym and sym.abbreviation = self
14
+ end
15
+
16
+ end
17
+ end
@@ -0,0 +1 @@
1
+ Dir.glob "#{ __FILE__.chomp ".rb" }_*.rb", &method(:require)
@@ -0,0 +1,11 @@
1
+ require_relative 'shift_options'
2
+
3
+ module Fuby
4
+ refine ::Array do
5
+
6
+ def unshift_options *defaults
7
+ shift_options(*defaults).tap { |opt| push opt }
8
+ end
9
+
10
+ end
11
+ end
data/lib/fuby/uuid.rb ADDED
@@ -0,0 +1,28 @@
1
+ require_relative 'format'
2
+
3
+ require 'securerandom'
4
+
5
+ module Fuby
6
+ refine ::String.singleton_class do
7
+
8
+ def uuid
9
+ ::SecureRandom.uuid.gsub '-', '_'
10
+ end
11
+
12
+ end
13
+ refine ::Symbol.singleton_class do
14
+
15
+ def uuid
16
+ ::String.uuid.to_sym
17
+ end
18
+
19
+ def __uuid
20
+ :"__%s" % ::String.uuid
21
+ end
22
+
23
+ def __uuid__
24
+ :"__%s__" % ::String.uuid
25
+ end
26
+
27
+ end
28
+ end
@@ -0,0 +1,25 @@
1
+ require 'fuby/abbreviation'
2
+
3
+ using Fuby
4
+
5
+ describe Symbol do
6
+ describe "abbreviation" do
7
+ it "gets the abbreviation for the receiver" do
8
+
9
+ :ascending.abbreviation = :asc
10
+ :ascending.abbreviation.must_equal :asc
11
+
12
+ :desc.unabbreviation = :descending
13
+ :descending.abbreviation.must_equal :desc
14
+
15
+ end
16
+ end
17
+ describe "abbreviation=" do
18
+ it "results in an error if the abbreviation is set twice" do
19
+
20
+ :ascending.abbreviation = :asc
21
+ -> { :ascending.abbreviation = :a }.must_raise ArgumentError
22
+
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,29 @@
1
+ require 'fuby/alias_method'
2
+
3
+ using Fuby
4
+
5
+ describe Module do
6
+ describe "alias_method! existing_method_name" do
7
+ it "creates and returns a new symbol that aliases the existing_method_name" do
8
+
9
+ class A
10
+
11
+ def foo
12
+ 5
13
+ end
14
+
15
+ eval %{
16
+
17
+ def foo
18
+ #{ alias_method! :foo } * 10
19
+ end
20
+
21
+ }
22
+
23
+ end
24
+
25
+ A.new.foo.must_equal 50
26
+
27
+ end
28
+ end
29
+ end
data/test/fuby/all.rb ADDED
@@ -0,0 +1,15 @@
1
+ require 'fuby/all'
2
+
3
+ using Fuby
4
+
5
+ describe Enumerable do
6
+ describe "all?" do
7
+ it "the behaviour of `all?` is modified in order to allow object (as well as Proc) arguments" do
8
+
9
+ [1, 2, 3].all?.must_be_instance_of Method
10
+ [1, 2, 3].all?.call(String).must_equal false
11
+ [1, 2, 3].all?(Integer).must_equal true
12
+
13
+ end
14
+ end
15
+ end