y_support 2.0.21 → 2.0.23
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/y_support/abstract_algebra.rb +1 -1
- data/lib/y_support/core_ext/array/misc.rb +13 -0
- data/lib/y_support/core_ext/class/misc.rb +16 -0
- data/lib/y_support/core_ext/class.rb +2 -0
- data/lib/y_support/core_ext/hash/misc.rb +35 -35
- data/lib/y_support/name_magic/hash.rb +17 -0
- data/lib/y_support/name_magic.rb +3 -0
- data/lib/y_support/try.rb +1 -0
- data/lib/y_support/version.rb +1 -1
- data/test/misc_test.rb +22 -1
- data/test/name_magic_test.rb +6 -1
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0143322533b38e137de87f30d4d5d94021a0e211
|
4
|
+
data.tar.gz: f086f7e148dbd589c5f4007e689c4519c09c80b9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 602b5759bd46e3138145086c168cb695a0433f6efa3d114d4437186eec2b16507167326bbbb3247d058d1e69f0deae3b8d1e16a3b1d60bd4fbe127bd24ff66fc
|
7
|
+
data.tar.gz: 6473a5334642f9d423495aa02e925532dc7e1a44074d4a4b8d41760756084bb0401686a75b1a371f577927e655dcf2dc4758647111321136eebf368e0f7db5e3
|
@@ -209,7 +209,7 @@ class Matrix
|
|
209
209
|
end
|
210
210
|
end
|
211
211
|
return new_matrix( rows, arg.column_size )
|
212
|
-
when SY::Magnitude # newly added - multiplication by a magnitude
|
212
|
+
when ( SY::Magnitude rescue :SY_Magnitude_absent ) # newly added - multiplication by a magnitude
|
213
213
|
# I am not happy with this explicit switch on SY::Magnitude type here.
|
214
214
|
# Perhaps coerce should handle this?
|
215
215
|
rows = Array.new row_size do |i|
|
@@ -86,7 +86,20 @@ class Array
|
|
86
86
|
def to_column_vector
|
87
87
|
Matrix.column_vector self
|
88
88
|
end
|
89
|
+
|
90
|
+
# Returns correspondence matrix to another array.
|
91
|
+
#
|
92
|
+
def correspondence_matrix other
|
93
|
+
Matrix.correspondence_matrix self, other
|
94
|
+
end
|
89
95
|
|
96
|
+
# Returns indices of elements of another array in this array (inverse of
|
97
|
+
# #values_at).
|
98
|
+
#
|
99
|
+
def indices_of other
|
100
|
+
other.map { |e| index e }
|
101
|
+
end
|
102
|
+
|
90
103
|
# TEST ME
|
91
104
|
# def pretty_inspect
|
92
105
|
# each_slice( 4 ) { |slice|
|
@@ -0,0 +1,16 @@
|
|
1
|
+
#encoding: utf-8
|
2
|
+
|
3
|
+
class Class
|
4
|
+
# Creates a subclass of the current class parametrized with a given set of
|
5
|
+
# parameters. The parameters have form { symbol: value } and they cause
|
6
|
+
# singleton method(s) named "symbol" be defined on the subclass, returning
|
7
|
+
# "value".
|
8
|
+
#
|
9
|
+
def parametrize **parameters
|
10
|
+
Class.new( self ).tap do |subclass|
|
11
|
+
parameters.each_pair { |symbol, value|
|
12
|
+
subclass.define_singleton_method symbol do value end
|
13
|
+
}
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -6,48 +6,46 @@ class Hash
|
|
6
6
|
# reversed merge!: defaults.merge( self! )
|
7
7
|
alias :default! :reverse_merge!
|
8
8
|
|
9
|
-
# Applies a block as a mapping on all keys, returning a new hash
|
9
|
+
# Applies a block as a mapping on all keys, returning a new hash.
|
10
|
+
#
|
10
11
|
def with_keys
|
11
|
-
keys.each_with_object self.class.new do |hash_key,
|
12
|
-
|
12
|
+
keys.each_with_object self.class.new do |hash_key, hsh|
|
13
|
+
hsh[ yield hash_key ] = self[ hash_key ]
|
13
14
|
end
|
14
15
|
end
|
15
|
-
alias :do_with_keys :with_keys
|
16
16
|
|
17
|
-
# The difference from
|
18
|
-
#
|
17
|
+
# The difference from #with_keys is that modify_keys expects block that takes
|
18
|
+
# 2 arguments (key: value pair) and returns the new key.
|
19
|
+
#
|
19
20
|
def modify_keys
|
20
|
-
each_with_object self.class.new do |hash_pair,
|
21
|
-
|
21
|
+
each_with_object self.class.new do |hash_pair, hsh|
|
22
|
+
hsh[ yield( hash_pair ) ] = self[ hash_pair[0] ]
|
22
23
|
end
|
23
24
|
end
|
24
25
|
|
25
|
-
# Applies a block as a mapping on all values, returning a new hash
|
26
|
+
# Applies a block as a mapping on all values, returning a new hash.
|
27
|
+
#
|
26
28
|
def with_values
|
27
|
-
each_with_object self.class.new do |
|
28
|
-
ꜧ[ hash_pair[0] ] = yield( hash_pair[1] )
|
29
|
-
end
|
29
|
+
each_with_object self.class.new do |(k, v), hsh| hsh[ k ] = yield v end
|
30
30
|
end
|
31
|
-
alias :do_with_values :with_values
|
32
31
|
|
33
32
|
# Like #do_with_values, but modifies the receiver.
|
33
|
+
#
|
34
34
|
def with_values!
|
35
|
-
each_with_object self do |
|
36
|
-
hash_key, hash_val = hash_pair
|
37
|
-
ꜧ[ hash_key ] = yield( hash_val )
|
38
|
-
end
|
35
|
+
each_with_object self do |(k, v), hsh| hsh[ k ] = yield v end
|
39
36
|
end
|
40
|
-
alias :do_with_values! :with_values!
|
41
37
|
|
42
38
|
# The difference from #do_with_values is that modify_values expects block
|
43
39
|
# that takes 2 arguments (key: value pair) and returns the new value.
|
40
|
+
#
|
44
41
|
def modify_values
|
45
42
|
each_with_object self.class.new do |hash_pair, ꜧ|
|
46
43
|
ꜧ[ hash_pair[0] ] = yield( hash_pair )
|
47
44
|
end
|
48
45
|
end
|
49
46
|
|
50
|
-
# Like #modify_values, but modifies the receiver
|
47
|
+
# Like #modify_values, but modifies the receiver.
|
48
|
+
#
|
51
49
|
def modify_values!
|
52
50
|
each_with_object self do |hash_pair, ꜧ|
|
53
51
|
ꜧ[ hash_pair[0] ] = yield( hash_pair )
|
@@ -55,35 +53,37 @@ class Hash
|
|
55
53
|
end
|
56
54
|
|
57
55
|
# Like #map that returns a hash.
|
56
|
+
#
|
58
57
|
def modify
|
59
58
|
each_with_object self.class.new do |hash_pair, ꜧ|
|
60
59
|
key, val = yield hash_pair
|
61
60
|
ꜧ[key] = val
|
62
61
|
end
|
63
62
|
end
|
63
|
+
|
64
|
+
# A bit like Array#slice, but only takes 1 argument, which is either a Range,
|
65
|
+
# or an Array, and returns the selection of the hash for the keys that match
|
66
|
+
# the range or are present in the array.
|
67
|
+
#
|
68
|
+
def slice matcher
|
69
|
+
case matcher
|
70
|
+
when Array then select { |key, _| matcher.include? key }
|
71
|
+
else select { |key, _| matcher === key } end
|
72
|
+
end
|
64
73
|
|
65
74
|
# Makes hash keys accessible as methods. If the hash keys collide with
|
66
75
|
# its methods, ArgumentError is raised, unless :overwrite_methods
|
67
76
|
# option == true.
|
68
77
|
#
|
69
|
-
def dot!
|
78
|
+
def dot! overwrite_methods: false
|
70
79
|
keys.each do |key|
|
71
80
|
msg = "key #{key} of #dot!-ted hash is not convertible to a symbol"
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
end
|
79
|
-
|
80
|
-
define_singleton_method key.to_sym do
|
81
|
-
self[key]
|
82
|
-
end
|
83
|
-
|
84
|
-
define_singleton_method "#{key}=".to_sym do |value|
|
85
|
-
self[key] = value
|
86
|
-
end
|
81
|
+
fail ArgumentError, msg unless key.respond_to? :to_sym
|
82
|
+
msg = "#dot!-ted hash must not have key names colliding with its methods"
|
83
|
+
fail ArgumentError, msg if methods.include? key.to_sym unless
|
84
|
+
overwrite_methods
|
85
|
+
define_singleton_method key.to_sym do self[key] end
|
86
|
+
define_singleton_method "#{key}=".to_sym do |value| self[key] = value end
|
87
87
|
end
|
88
88
|
return self
|
89
89
|
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
class Hash
|
4
|
+
# Maps a hash into a hash, whose keys have been replaced with names of the
|
5
|
+
# key objects (which are assumed to respond to +#name+ method).
|
6
|
+
#
|
7
|
+
def keys_to_names
|
8
|
+
with_keys do |key| key.name || key end
|
9
|
+
end
|
10
|
+
|
11
|
+
# Modifies a hash in place so that the keys are replaced with key names (key
|
12
|
+
# objects are assumed to respond to +#name+ method).
|
13
|
+
#
|
14
|
+
def keys_to_names!
|
15
|
+
with_keys! do |key| key.name || key end
|
16
|
+
end
|
17
|
+
end
|
data/lib/y_support/name_magic.rb
CHANGED
@@ -1,7 +1,10 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
|
3
3
|
require 'y_support'
|
4
|
+
require 'y_support/core_ext/hash/misc'
|
5
|
+
|
4
6
|
require_relative 'name_magic/array'
|
7
|
+
require_relative 'name_magic/hash'
|
5
8
|
require_relative 'name_magic/namespace_methods'
|
6
9
|
require_relative 'name_magic/class_methods'
|
7
10
|
|
data/lib/y_support/try.rb
CHANGED
data/lib/y_support/version.rb
CHANGED
data/test/misc_test.rb
CHANGED
@@ -34,6 +34,20 @@ describe Module do
|
|
34
34
|
end
|
35
35
|
|
36
36
|
|
37
|
+
describe Class do
|
38
|
+
before do
|
39
|
+
require 'y_support/core_ext/class'
|
40
|
+
end
|
41
|
+
|
42
|
+
it "has #parametrize method" do
|
43
|
+
a = Class.new
|
44
|
+
-> { a.foo }.must_raise NoMethodError
|
45
|
+
b = a.parametrize foo: 42
|
46
|
+
b.foo.must_equal 42
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
|
37
51
|
describe Enumerable do
|
38
52
|
before do
|
39
53
|
require 'y_support/core_ext/enumerable'
|
@@ -94,7 +108,7 @@ describe Array do
|
|
94
108
|
end
|
95
109
|
|
96
110
|
it "has #to_column_vector" do
|
97
|
-
[1, 2, 3].to_column_vector.must_equal Matrix[[1, 2, 3]]
|
111
|
+
[1, 2, 3].to_column_vector.must_equal Matrix[[1], [2], [3]]
|
98
112
|
end
|
99
113
|
end
|
100
114
|
|
@@ -146,6 +160,13 @@ describe Hash do
|
|
146
160
|
.modify { |k, v| ["#{k}#{v}".to_sym, "#{v}#{k}"] } )
|
147
161
|
end
|
148
162
|
|
163
|
+
it "should have #slice" do
|
164
|
+
{ a: 1, b: 2, c: 3 }.slice( [:a, :b] ).must_equal( { a: 1, b: 2 } )
|
165
|
+
{ 1 => :a, 2 => :b, 3 => :c, 4 => :d }.slice( 2..3.5 )
|
166
|
+
.must_equal( { 2 => :b, 3 => :c } )
|
167
|
+
{ 0.0 => :a, 1.1 => :b }.slice( 1..2 ).must_equal( { 1.1 => :b } )
|
168
|
+
end
|
169
|
+
|
149
170
|
it "should have #dot! meta patcher for dotted access to keys" do
|
150
171
|
h = Hash.new.merge!(aaa: 1, taint: 2)
|
151
172
|
-> { h.dot! }.must_raise ArgumentError
|
data/test/name_magic_test.rb
CHANGED
@@ -58,10 +58,15 @@ describe NameMagic do
|
|
58
58
|
Rover = @ç.new
|
59
59
|
@ç.const_magic
|
60
60
|
XXX::Rover.must_be_kind_of @ç
|
61
|
+
Rover.name.must_equal :Rover
|
61
62
|
@ç.namespace!
|
62
63
|
Spot = @ç.new
|
63
64
|
@ç.const_magic
|
65
|
+
Spot.name.must_equal :Spot
|
64
66
|
-> { XXX::Spot }.must_raise NameError
|
65
67
|
@ç.const_get( :Spot ).must_be_kind_of @ç
|
68
|
+
# Array
|
69
|
+
[ Spot ].names.must_equal [ :Spot ]
|
70
|
+
{ Spot => 42 }.keys_to_names.must_equal( { Spot: 42 } )
|
66
71
|
end
|
67
|
-
end
|
72
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: y_support
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.
|
4
|
+
version: 2.0.23
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- boris
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-07-
|
11
|
+
date: 2013-07-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -56,6 +56,8 @@ files:
|
|
56
56
|
- lib/y_support/core_ext.rb
|
57
57
|
- lib/y_support/core_ext/array.rb
|
58
58
|
- lib/y_support/core_ext/array/misc.rb
|
59
|
+
- lib/y_support/core_ext/class.rb
|
60
|
+
- lib/y_support/core_ext/class/misc.rb
|
59
61
|
- lib/y_support/core_ext/enumerable.rb
|
60
62
|
- lib/y_support/core_ext/enumerable/misc.rb
|
61
63
|
- lib/y_support/core_ext/hash.rb
|
@@ -77,6 +79,7 @@ files:
|
|
77
79
|
- lib/y_support/name_magic.rb
|
78
80
|
- lib/y_support/name_magic/array.rb
|
79
81
|
- lib/y_support/name_magic/class_methods.rb
|
82
|
+
- lib/y_support/name_magic/hash.rb
|
80
83
|
- lib/y_support/name_magic/namespace_methods.rb
|
81
84
|
- lib/y_support/null_object.rb
|
82
85
|
- lib/y_support/respond_to.rb
|