lab42_core 0.1.2 → 0.2.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/README.md +36 -1
- data/lib/lab42/core/behavior/proxy.rb +24 -0
- data/lib/lab42/core/behavior.rb +38 -0
- data/lib/lab42/core/dir.rb +38 -7
- data/lib/lab42/core/fn.rb +13 -0
- data/lib/lab42/core/meta.rb +27 -0
- data/lib/lab42/core/old_ruby2.rb +3 -0
- data/lib/lab42/core/unbound_behavior.rb +44 -0
- data/lib/lab42/core/version.rb +1 -1
- data/lib/lab42/core.rb +3 -0
- metadata +11 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 16682f25db174dc49c05db95880ad4dbdffb08a6
|
4
|
+
data.tar.gz: 9303958cffdf2f045054a1f3860de6f509213b43
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4cdfb75fd68d03b62a023b6064c5e63d52ea69392e514df65eaaaa8a2ee2f90a4c18479b7db795013ec9c5d0b7d83c6cefdeab117561e2cf89f2105b5bdf6fe7
|
7
|
+
data.tar.gz: b814d0a775141a045f84b810d7cc37d8cf5159c39e73eb42886a7b74cf6aaf9adcff8b8816302d791ca0b794071ac8b13feebc2dd6cc488c3ed5653de1d8c82a
|
data/README.md
CHANGED
@@ -35,6 +35,13 @@ Can be used after `require 'lab42/core'` or `require 'lab42/core/dir'`
|
|
35
35
|
end
|
36
36
|
```
|
37
37
|
|
38
|
+
If only the relative or absolute pathes are needed there are the two variations avaiable:
|
39
|
+
|
40
|
+
```ruby
|
41
|
+
Dir.abs_files ...
|
42
|
+
Dir.rel_files ...
|
43
|
+
```
|
44
|
+
|
38
45
|
For details see the corresponding [QED demo](https://github.com/RobertDober/lab42_core/blob/master/demo/dir.md).
|
39
46
|
|
40
47
|
## Enumerable
|
@@ -92,7 +99,35 @@ For details see the corresponding [QED demo](https://github.com/RobertDober/lab4
|
|
92
99
|
|
93
100
|
## Fn
|
94
101
|
|
95
|
-
|
102
|
+
Can be used after `require 'lab42/core/array'` **only**.
|
103
|
+
|
104
|
+
Might be moved into gem [lab42\_more](https://github.com/RobertDober/lab42_more) in the future .
|
105
|
+
|
106
|
+
API will remain the same, require will change to `require 'lab42_more/fn'`
|
107
|
+
|
108
|
+
### fn like function
|
109
|
+
|
110
|
+
```ruby
|
111
|
+
Dir.files [APP_ROOT, 'spec', 'support', '**', '*.rb'], Kernel.fn.require
|
112
|
+
|
113
|
+
Dir.files( %w{.. assets ** *.txt} ).sort_by &File.fn.mtime
|
114
|
+
```
|
115
|
+
|
116
|
+
### fm like function/method
|
117
|
+
|
118
|
+
```ruby
|
119
|
+
%w{ alpha beta gamma delta }.sort_by &String.fm.size
|
120
|
+
```
|
121
|
+
|
122
|
+
**N.B.** This only works because the object behind the scenes of `Class#fm` knows how to bind
|
123
|
+
upon call, once it has been transformed by `#to_proc`
|
124
|
+
|
125
|
+
|
126
|
+
For details see the corresponding [QED demo](https://github.com/RobertDober/lab42_core/blob/master/demo/fn.md).
|
127
|
+
|
128
|
+
## Object
|
129
|
+
|
130
|
+
Backport of `#itself` for versions < 2.2
|
96
131
|
|
97
132
|
## OpenObject
|
98
133
|
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require_relative '../behavior'
|
2
|
+
require_relative '../unbound_behavior'
|
3
|
+
module Lab42
|
4
|
+
class Behavior
|
5
|
+
# Hey man really, that's all??? All my responsibility is to intercept
|
6
|
+
# missing methods and sending them off to that Lab42::Behavior bloke,
|
7
|
+
# having him have all the fun!!!! You cannott be serious by any known
|
8
|
+
# defintion of that term, or, can you .....
|
9
|
+
class Proxy
|
10
|
+
attr_reader :receiver, :fm
|
11
|
+
private
|
12
|
+
def initialize receiver, fm: false
|
13
|
+
@receiver = receiver
|
14
|
+
@fm = fm
|
15
|
+
end
|
16
|
+
|
17
|
+
def method_missing *args, &blk
|
18
|
+
fm ?
|
19
|
+
Lab42::UnboundBehavior.new( receiver, receiver.instance_method( args.first ), *args.drop(1), &blk ) :
|
20
|
+
Lab42::Behavior.new( receiver, receiver.method( args.first ), *args.drop(1), &blk )
|
21
|
+
end
|
22
|
+
end # class Proxy
|
23
|
+
end # class Behavior
|
24
|
+
end # module Lab42
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'forwarder'
|
2
|
+
|
3
|
+
module Lab42
|
4
|
+
# Thank youn my dear Proxy, for sending me all the information
|
5
|
+
# I, the clever guy, who is having all the fun, will make best
|
6
|
+
# use of it by being an extremly, yes I said *extremly* clever
|
7
|
+
# callable object representing the methods or instance methods
|
8
|
+
# represented by the calls to `Object#fn` or `Module#fm`.
|
9
|
+
# Did I tell you yet? It is sooooo out not be functional...
|
10
|
+
class Behavior
|
11
|
+
attr_reader :args, :block, :method, :receiver
|
12
|
+
|
13
|
+
|
14
|
+
def call *a, &b
|
15
|
+
method
|
16
|
+
.( *(a + args), &(b||block) )
|
17
|
+
end
|
18
|
+
alias_method :[], :call
|
19
|
+
|
20
|
+
def to_proc
|
21
|
+
-> *a, &b do
|
22
|
+
method
|
23
|
+
.( *(a + args), &(b||block) )
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
|
28
|
+
private
|
29
|
+
def initialize receiver, method, *args, &block
|
30
|
+
@receiver = receiver
|
31
|
+
@method = method
|
32
|
+
@args = args
|
33
|
+
@block = block
|
34
|
+
end
|
35
|
+
|
36
|
+
|
37
|
+
end # class Behavior
|
38
|
+
end # module Lab42
|
data/lib/lab42/core/dir.rb
CHANGED
@@ -1,24 +1,55 @@
|
|
1
|
+
require_relative 'meta'
|
1
2
|
class << Dir
|
2
|
-
def
|
3
|
-
|
3
|
+
def abs_files glob_para, *rst, &blk
|
4
|
+
glob_para = File.join( *glob_para ) if Array === glob_para
|
5
|
+
blk = Lab42::Meta::Behavior *rst, &blk
|
6
|
+
|
7
|
+
__files__ :last, glob_para, &blk
|
8
|
+
end
|
9
|
+
|
10
|
+
def files glob_para, *rst, &blk
|
11
|
+
glob_para = File.join( *glob_para ) if Array === glob_para
|
12
|
+
blk = Lab42::Meta::Behavior *rst, &blk
|
13
|
+
|
14
|
+
__files__ :both, glob_para, &blk
|
15
|
+
end
|
16
|
+
|
17
|
+
def rel_files glob_para, *rst, &blk
|
18
|
+
glob_para = File.join( *glob_para ) if Array === glob_para
|
19
|
+
blk = Lab42::Meta::Behavior *rst, &blk
|
20
|
+
|
21
|
+
__files__ :first, glob_para, &blk
|
4
22
|
end
|
5
23
|
|
6
24
|
private
|
7
25
|
|
8
|
-
def __files__ glob_para, &blk
|
26
|
+
def __files__ selector, glob_para, &blk
|
9
27
|
here = pwd
|
10
28
|
if blk
|
11
|
-
glob( glob_para ).
|
29
|
+
glob( glob_para ).map do | f |
|
12
30
|
next if File.directory? f
|
13
|
-
blk.(
|
14
|
-
end
|
31
|
+
blk.( __select__( selector, f ){ File.expand_path File.join( here, f ) } )
|
32
|
+
end.compact
|
15
33
|
else
|
16
34
|
Enumerator.new do |y|
|
17
35
|
glob( glob_para ).each do | f |
|
18
36
|
next if File.directory? f
|
19
|
-
y.yield
|
37
|
+
y.yield __select__( selector, f ){ File.expand_path File.join( here, f ) }
|
20
38
|
end
|
21
39
|
end
|
22
40
|
end
|
23
41
|
end
|
42
|
+
|
43
|
+
def __select__ selector, frst_param, &last_param
|
44
|
+
case selector
|
45
|
+
when :first
|
46
|
+
frst_param
|
47
|
+
when :last
|
48
|
+
last_param.()
|
49
|
+
when :both
|
50
|
+
[ frst_param, last_param.() ]
|
51
|
+
else
|
52
|
+
raise ArgumentError, "Lazy selection must be called with :first, :last or :both, but was with #{selector.inspect}"
|
53
|
+
end
|
54
|
+
end
|
24
55
|
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Lab42
|
2
|
+
module Meta extend self
|
3
|
+
def Behavior *args, &blk
|
4
|
+
return blk if blk
|
5
|
+
determine_behavior_from args
|
6
|
+
end
|
7
|
+
|
8
|
+
private
|
9
|
+
def determine_behavior_from args
|
10
|
+
return make_callable args.last if args.last && args.last.respond_to?( :call )
|
11
|
+
return make_message_sender args if Symbol === args.first
|
12
|
+
end
|
13
|
+
|
14
|
+
def make_callable callable
|
15
|
+
return callable if Proc === callable
|
16
|
+
-> *a, &b do
|
17
|
+
callable.(*a, &b)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def make_message_sender args
|
22
|
+
-> (rcv, *late_args) do
|
23
|
+
rcv.send( args.first, *( late_args + args.drop(1) ) )
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end # module Meta
|
27
|
+
end # module Lab42
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require_relative 'behavior'
|
2
|
+
|
3
|
+
module Lab42
|
4
|
+
# Thank youn my dear Proxy, for sending me all the information
|
5
|
+
# I, the clever guy, who is having all the fun, will make best
|
6
|
+
# use of it by being an extremly, yes I said *extremly* clever
|
7
|
+
# callable object representing the methods or instance methods
|
8
|
+
# represented by the calls to `Object#fn` or `Module#fm`.
|
9
|
+
# Did I tell you yet? It is sooooo out not be functional...
|
10
|
+
class UnboundBehavior
|
11
|
+
attr_reader :args, :block, :method
|
12
|
+
|
13
|
+
def call *a, &b
|
14
|
+
available_args = a + args
|
15
|
+
m = method.bind available_args.first
|
16
|
+
m.( *available_args.drop(1), &(b||block) )
|
17
|
+
end
|
18
|
+
|
19
|
+
def to_proc
|
20
|
+
-> *a, &b do
|
21
|
+
available_args = a + args
|
22
|
+
method.bind( available_args.first )
|
23
|
+
.( *available_args.drop(1), &(b||block) )
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
# Rebinding:
|
28
|
+
# We still apply our LIFO policy! So much for the proverbial
|
29
|
+
# "The early bird catches the worm"? Anyway, what would I do
|
30
|
+
# with a worm??? (Mescal maybe?)
|
31
|
+
def _ *a, &b
|
32
|
+
self.class.new @klass, method, *(a + args), &(b||block)
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
def initialize klass, method, *args, &block
|
37
|
+
@klass = klass
|
38
|
+
@method = method
|
39
|
+
@args = args
|
40
|
+
@block = block
|
41
|
+
end
|
42
|
+
|
43
|
+
end # class Behavior
|
44
|
+
end # module Lab42
|
data/lib/lab42/core/version.rb
CHANGED
data/lib/lab42/core.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lab42_core
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Robert Dober
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2015-04-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: forwarder2
|
@@ -58,14 +58,14 @@ dependencies:
|
|
58
58
|
requirements:
|
59
59
|
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: '3.
|
61
|
+
version: '3.2'
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: '3.
|
68
|
+
version: '3.2'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: qed
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -119,11 +119,17 @@ files:
|
|
119
119
|
- README.md
|
120
120
|
- lib/lab42/core.rb
|
121
121
|
- lib/lab42/core/array.rb
|
122
|
+
- lib/lab42/core/behavior.rb
|
123
|
+
- lib/lab42/core/behavior/proxy.rb
|
122
124
|
- lib/lab42/core/dir.rb
|
123
125
|
- lib/lab42/core/enumerable.rb
|
124
126
|
- lib/lab42/core/file.rb
|
127
|
+
- lib/lab42/core/fn.rb
|
125
128
|
- lib/lab42/core/hash.rb
|
129
|
+
- lib/lab42/core/meta.rb
|
130
|
+
- lib/lab42/core/old_ruby2.rb
|
126
131
|
- lib/lab42/core/open_object.rb
|
132
|
+
- lib/lab42/core/unbound_behavior.rb
|
127
133
|
- lib/lab42/core/version.rb
|
128
134
|
- lib/lab42/file.rb
|
129
135
|
- lib/lab42/lazy.rb
|
@@ -147,7 +153,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
147
153
|
version: '0'
|
148
154
|
requirements: []
|
149
155
|
rubyforge_project:
|
150
|
-
rubygems_version: 2.4.
|
156
|
+
rubygems_version: 2.4.6
|
151
157
|
signing_key:
|
152
158
|
specification_version: 4
|
153
159
|
summary: Simple Ruby Core Module Extensions (for more see lab42_more)
|