gemmyrb 0.0.4 → 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +2 -3
- data/lib/gemmy/patches/array_patch.rb +28 -12
- data/lib/gemmy/patches/enumerator_patch.rb +23 -0
- data/lib/gemmy/patches/symbol_patch.rb +11 -2
- data/lib/gemmy/patches.rb +14 -4
- data/lib/gemmy/version.rb +1 -1
- data/lib/gemmy.rb +32 -0
- metadata +16 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: '0597ccc5d58c800b09db4032d7f3b4c9417a200c'
|
4
|
+
data.tar.gz: d8cf7ba24fd1e4b423d2a8bdc2accd984b441d21
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 61bd6b8d5e1ecb3735cf5da9b664aa0de07006402d386c86492c8b1ff763119895fce69758fcb04fc86cdd6b10a9e47ec805eb797ff420f21554cebf92966930
|
7
|
+
data.tar.gz: 0ce7ac19a0e282bd31f2644d032d5f334c89192af8a8f0f2765137066d1fb60f90f2de371e02fd1795bca328c69993c3b2b7e3639cb90d4fa7b4950c273993bc
|
data/README.md
CHANGED
@@ -22,9 +22,8 @@ documents:
|
|
22
22
|
- _Shell commands and other one-off processes_
|
23
23
|
- [examples/03_shell_commands.rb](./examples/03_shell_commands.rb)
|
24
24
|
|
25
|
-
**To see a full list of the patched methods
|
26
|
-
included many from facets), see the [rubydoc](http://www.rubydoc.info/gems/gemmyrb)**
|
25
|
+
**To see a full list of the patched methods, see the [rubydoc](http://www.rubydoc.info/gems/gemmyrb)**
|
27
26
|
|
28
27
|
Specifically, look at the constants defined on Gemmy::Patches. There is one
|
29
28
|
module for each of the core classes being patched. Each individual method
|
30
|
-
is also contained in its own module (
|
29
|
+
is also contained in its own module (for the sake of, well, modularity)
|
@@ -4,12 +4,24 @@ module Gemmy::Patches::ArrayPatch
|
|
4
4
|
|
5
5
|
module ClassMethods
|
6
6
|
|
7
|
+
module Wrap
|
8
|
+
using CF::Array[:wrap]
|
9
|
+
def self.autotest
|
10
|
+
Array.wrap(nil).eql?([]) &&\
|
11
|
+
Array.wrap([]).eql?([]) &&\
|
12
|
+
Array.wrap(1).eql?([1])
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
7
16
|
module Zip
|
8
17
|
# facets
|
9
18
|
def zip(*arrays)
|
10
19
|
return [] if arrays.empty?
|
11
20
|
return arrays[0].zip(*arrays[1..-1])
|
12
21
|
end
|
22
|
+
def self.autotest
|
23
|
+
Array.zip([1], [2]) == [[1,2]]
|
24
|
+
end
|
13
25
|
end
|
14
26
|
|
15
27
|
end
|
@@ -22,18 +34,24 @@ module Gemmy::Patches::ArrayPatch
|
|
22
34
|
def exclude?(x)
|
23
35
|
! include? x
|
24
36
|
end
|
37
|
+
def self.autotest
|
38
|
+
[1].exclude?(2) && ![2].exclude?(2)
|
39
|
+
end
|
25
40
|
end
|
26
41
|
|
27
42
|
module KeyBy
|
28
43
|
# facets
|
29
44
|
def key_by
|
30
45
|
return to_enum(:key_by) unless block_given?
|
31
|
-
h = {}
|
46
|
+
h = Hash.new { |h,k| h[k] = [] }
|
32
47
|
each do |v|
|
33
|
-
h[yield(v)]
|
48
|
+
h[yield(v)] << v
|
34
49
|
end
|
35
50
|
return h
|
36
51
|
end
|
52
|
+
def self.autotest
|
53
|
+
[1,2,3].key_by { |v| v % 2 } == { 1 => [1, 3], 0 => [2] }
|
54
|
+
end
|
37
55
|
end
|
38
56
|
|
39
57
|
module After
|
@@ -42,6 +60,9 @@ module Gemmy::Patches::ArrayPatch
|
|
42
60
|
return nil unless include? value
|
43
61
|
self[(index(value).to_i + 1) % length]
|
44
62
|
end
|
63
|
+
def self.autotest
|
64
|
+
[1,2].after(1).eql?(2)
|
65
|
+
end
|
45
66
|
end
|
46
67
|
|
47
68
|
module Before
|
@@ -50,6 +71,9 @@ module Gemmy::Patches::ArrayPatch
|
|
50
71
|
return nil unless include? value
|
51
72
|
self[(index(value).to_i - 1) % length]
|
52
73
|
end
|
74
|
+
def self.autotest
|
75
|
+
[1,2].before(2) == 1
|
76
|
+
end
|
53
77
|
end
|
54
78
|
|
55
79
|
module Duplicates
|
@@ -61,16 +85,8 @@ module Gemmy::Patches::ArrayPatch
|
|
61
85
|
}
|
62
86
|
h.delete_if{|_,v| v < min}.keys
|
63
87
|
end
|
64
|
-
|
65
|
-
|
66
|
-
module ExtractOptions
|
67
|
-
# facets
|
68
|
-
def extract_options!
|
69
|
-
if Hash === last && last.extractable_options?
|
70
|
-
pop
|
71
|
-
else
|
72
|
-
{}
|
73
|
-
end
|
88
|
+
def self.autotest
|
89
|
+
[1,1,2,2,3].duplicates == [1,2]
|
74
90
|
end
|
75
91
|
end
|
76
92
|
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Gemmy::Patches::EnumeratorPatch
|
2
|
+
module ClassMethods
|
3
|
+
end
|
4
|
+
module InstanceMethods
|
5
|
+
module MapBy
|
6
|
+
using CF::Enumerable::MapBy
|
7
|
+
# maps to hash
|
8
|
+
# Each iteration returns array [hash_key, hash_val]
|
9
|
+
# hash values are stored in arrays
|
10
|
+
def map_by(&blk)
|
11
|
+
clone.map_by &blk
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
module MapTo
|
16
|
+
using CF::Enumerable::MapTo
|
17
|
+
# map to <klass> instances, passing self as arg to klass constructor
|
18
|
+
def map_to(klass)
|
19
|
+
clone.map_to klass
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -5,7 +5,17 @@ module Gemmy::Patches::SymbolPatch
|
|
5
5
|
module ClassMethods
|
6
6
|
end
|
7
7
|
|
8
|
-
module InstanceMethods
|
8
|
+
module InstanceMethods
|
9
|
+
|
10
|
+
module Call
|
11
|
+
using CF::Symbol[:call]
|
12
|
+
def call(*args, &blk)
|
13
|
+
Gemmy.patch("symbol/i/call")._call self, *args, &blk
|
14
|
+
end
|
15
|
+
def self._call(sym, *args, &blk)
|
16
|
+
sym.call *args, &blk
|
17
|
+
end
|
18
|
+
end
|
9
19
|
|
10
20
|
module Variablize
|
11
21
|
# facets
|
@@ -30,5 +40,4 @@ module InstanceMethods
|
|
30
40
|
|
31
41
|
end
|
32
42
|
|
33
|
-
|
34
43
|
end
|
data/lib/gemmy/patches.rb
CHANGED
@@ -13,6 +13,17 @@
|
|
13
13
|
#
|
14
14
|
module Gemmy::Patches
|
15
15
|
|
16
|
+
# searches for the 'autotest' method on any patch modules
|
17
|
+
# and runs it, checking that the return value is true
|
18
|
+
# raises an error if it's not
|
19
|
+
def self.autotest
|
20
|
+
class_refinements.each do |patch_klass|
|
21
|
+
if patch_klass.respond_to?(:autotest)
|
22
|
+
patch_klass.autotest || raise(RuntimeError, "#{patch_klass} failed")
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
16
27
|
# The usage of this method is to load all the patches for some core classes.
|
17
28
|
# With no arguments it will include all patches
|
18
29
|
# There are two optional params (keyword arguments).
|
@@ -81,9 +92,7 @@ module Gemmy::Patches
|
|
81
92
|
end
|
82
93
|
|
83
94
|
def self.patch_as_instance_method(core_klass, patch_klass)
|
84
|
-
patch_klass.send(:refine, core_klass)
|
85
|
-
include patch_klass
|
86
|
-
end
|
95
|
+
patch_klass.send(:refine, core_klass) { include patch_klass }
|
87
96
|
end
|
88
97
|
|
89
98
|
def self.core_patches
|
@@ -99,7 +108,8 @@ module Gemmy::Patches
|
|
99
108
|
Class: Gemmy::Patches::ClassPatch,
|
100
109
|
Exception: Gemmy::Patches::ExceptionPatch,
|
101
110
|
Float: Gemmy::Patches::FloatPatch,
|
102
|
-
Proc: Gemmy::Patches::ProcPatch
|
111
|
+
Proc: Gemmy::Patches::ProcPatch,
|
112
|
+
Enumerator: Gemmy::Patches::EnumeratorPatch
|
103
113
|
}.with_indifferent_access
|
104
114
|
end
|
105
115
|
|
data/lib/gemmy/version.rb
CHANGED
data/lib/gemmy.rb
CHANGED
@@ -3,11 +3,43 @@ require 'colored'
|
|
3
3
|
require 'active_support/all'
|
4
4
|
require 'pry'
|
5
5
|
require 'colored'
|
6
|
+
require 'corefines'
|
6
7
|
|
7
8
|
# Container class for all the functionality.
|
8
9
|
#
|
9
10
|
class Gemmy
|
10
11
|
|
12
|
+
# Used by patches to get a reference to static patch classes
|
13
|
+
# Without this there would be long, unqualified constant names such as
|
14
|
+
# Gemmy::Patches::SymbolPatch::InstanceMethods::Call
|
15
|
+
#
|
16
|
+
# Usage is to pass a string like so: "<CoreClass>/<Context>/<MethodName>"
|
17
|
+
# Core class could be "symbol" for example
|
18
|
+
# Context is either "i" for instance or "c" for class
|
19
|
+
# Method name is underscored, i.e. "call" in this example:
|
20
|
+
#
|
21
|
+
# klass = Gemmy.patch "symbol/i/call"
|
22
|
+
#
|
23
|
+
# Now I can call any class methods on the klass.
|
24
|
+
#
|
25
|
+
# The utility of this might not be obvious, but it is useful
|
26
|
+
# when using another library's refinements in Gemmy's own
|
27
|
+
def self.patch(string)
|
28
|
+
parts = string.split("/")
|
29
|
+
raise ArgumentError unless parts.length == 3
|
30
|
+
core_class, context, method_name = parts
|
31
|
+
context_classname = if context.eql?("i")
|
32
|
+
"InstanceMethods"
|
33
|
+
elsif context.eql?("c")
|
34
|
+
"ClassMethods"
|
35
|
+
else
|
36
|
+
raise ArgumentError
|
37
|
+
end
|
38
|
+
Gemmy::Patches.const_get("#{core_class.capitalize}Patch")
|
39
|
+
.const_get(context_classname)
|
40
|
+
.const_get method_name.camelcase
|
41
|
+
end
|
42
|
+
|
11
43
|
# There are two main usages:
|
12
44
|
# - namespaced (using refinements and explicit include/extend calls)
|
13
45
|
# - global
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gemmyrb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- max pleaner
|
@@ -86,6 +86,20 @@ dependencies:
|
|
86
86
|
- - "~>"
|
87
87
|
- !ruby/object:Gem::Version
|
88
88
|
version: 0.19.4
|
89
|
+
- !ruby/object:Gem::Dependency
|
90
|
+
name: corefines
|
91
|
+
requirement: !ruby/object:Gem::Requirement
|
92
|
+
requirements:
|
93
|
+
- - "~>"
|
94
|
+
- !ruby/object:Gem::Version
|
95
|
+
version: 1.9.0
|
96
|
+
type: :runtime
|
97
|
+
prerelease: false
|
98
|
+
version_requirements: !ruby/object:Gem::Requirement
|
99
|
+
requirements:
|
100
|
+
- - "~>"
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: 1.9.0
|
89
103
|
description: ''
|
90
104
|
email: maxpleaner@gmail.com
|
91
105
|
executables:
|
@@ -102,6 +116,7 @@ files:
|
|
102
116
|
- lib/gemmy/patches.rb
|
103
117
|
- lib/gemmy/patches/array_patch.rb
|
104
118
|
- lib/gemmy/patches/class_patch.rb
|
119
|
+
- lib/gemmy/patches/enumerator_patch.rb
|
105
120
|
- lib/gemmy/patches/exception_patch.rb
|
106
121
|
- lib/gemmy/patches/float_patch.rb
|
107
122
|
- lib/gemmy/patches/hash_patch.rb
|