tap 0.12.4 → 0.17.0
Sign up to get free protection for your applications and to get access to all the features.
- data/History +34 -0
- data/README +62 -41
- data/bin/tap +36 -40
- data/cmd/console.rb +14 -6
- data/cmd/manifest.rb +62 -58
- data/cmd/run.rb +49 -31
- data/doc/API +84 -0
- data/doc/Class Reference +83 -115
- data/doc/Examples/Command Line +36 -0
- data/doc/Examples/Workflow +40 -0
- data/lib/tap/app.rb +293 -214
- data/lib/tap/app/node.rb +43 -0
- data/lib/tap/app/queue.rb +77 -0
- data/lib/tap/app/stack.rb +16 -0
- data/lib/tap/app/state.rb +22 -0
- data/lib/tap/constants.rb +2 -2
- data/lib/tap/env.rb +400 -314
- data/lib/tap/env/constant.rb +227 -0
- data/lib/tap/env/gems.rb +63 -0
- data/lib/tap/env/manifest.rb +89 -0
- data/lib/tap/env/minimap.rb +292 -0
- data/lib/tap/{support → env}/string_ext.rb +2 -2
- data/lib/tap/exe.rb +113 -125
- data/lib/tap/join.rb +175 -0
- data/lib/tap/joins.rb +9 -0
- data/lib/tap/joins/switch.rb +44 -0
- data/lib/tap/joins/sync.rb +99 -0
- data/lib/tap/root.rb +100 -491
- data/lib/tap/root/utils.rb +220 -0
- data/lib/tap/{support → root}/versions.rb +31 -29
- data/lib/tap/schema.rb +248 -0
- data/lib/tap/schema/parser.rb +413 -0
- data/lib/tap/schema/utils.rb +82 -0
- data/lib/tap/support/intern.rb +19 -6
- data/lib/tap/support/templater.rb +8 -3
- data/lib/tap/task.rb +175 -171
- data/lib/tap/tasks/dump.rb +58 -0
- data/lib/tap/tasks/load.rb +62 -0
- metadata +30 -73
- data/cmd/destroy.rb +0 -27
- data/cmd/generate.rb +0 -27
- data/doc/Command Reference +0 -105
- data/doc/Syntax Reference +0 -234
- data/doc/Tutorial +0 -348
- data/lib/tap/dump.rb +0 -142
- data/lib/tap/file_task.rb +0 -384
- data/lib/tap/generator/arguments.rb +0 -13
- data/lib/tap/generator/base.rb +0 -176
- data/lib/tap/generator/destroy.rb +0 -60
- data/lib/tap/generator/generate.rb +0 -93
- data/lib/tap/generator/generators/command/command_generator.rb +0 -21
- data/lib/tap/generator/generators/command/templates/command.erb +0 -32
- data/lib/tap/generator/generators/config/config_generator.rb +0 -98
- data/lib/tap/generator/generators/generator/generator_generator.rb +0 -37
- data/lib/tap/generator/generators/generator/templates/task.erb +0 -27
- data/lib/tap/generator/generators/generator/templates/test.erb +0 -26
- data/lib/tap/generator/generators/root/root_generator.rb +0 -84
- data/lib/tap/generator/generators/root/templates/MIT-LICENSE +0 -22
- data/lib/tap/generator/generators/root/templates/README +0 -14
- data/lib/tap/generator/generators/root/templates/Rakefile +0 -84
- data/lib/tap/generator/generators/root/templates/Rapfile +0 -11
- data/lib/tap/generator/generators/root/templates/gemspec +0 -27
- data/lib/tap/generator/generators/root/templates/test/tap_test_helper.rb +0 -3
- data/lib/tap/generator/generators/task/task_generator.rb +0 -25
- data/lib/tap/generator/generators/task/templates/task.erb +0 -14
- data/lib/tap/generator/generators/task/templates/test.erb +0 -19
- data/lib/tap/generator/manifest.rb +0 -20
- data/lib/tap/generator/preview.rb +0 -69
- data/lib/tap/load.rb +0 -64
- data/lib/tap/spec.rb +0 -41
- data/lib/tap/support/aggregator.rb +0 -65
- data/lib/tap/support/audit.rb +0 -333
- data/lib/tap/support/constant.rb +0 -143
- data/lib/tap/support/constant_manifest.rb +0 -126
- data/lib/tap/support/dependencies.rb +0 -54
- data/lib/tap/support/dependency.rb +0 -44
- data/lib/tap/support/executable.rb +0 -198
- data/lib/tap/support/executable_queue.rb +0 -125
- data/lib/tap/support/gems.rb +0 -43
- data/lib/tap/support/join.rb +0 -144
- data/lib/tap/support/joins.rb +0 -12
- data/lib/tap/support/joins/switch.rb +0 -27
- data/lib/tap/support/joins/sync_merge.rb +0 -38
- data/lib/tap/support/manifest.rb +0 -171
- data/lib/tap/support/minimap.rb +0 -90
- data/lib/tap/support/node.rb +0 -176
- data/lib/tap/support/parser.rb +0 -450
- data/lib/tap/support/schema.rb +0 -385
- data/lib/tap/support/shell_utils.rb +0 -67
- data/lib/tap/test.rb +0 -77
- data/lib/tap/test/assertions.rb +0 -38
- data/lib/tap/test/env_vars.rb +0 -29
- data/lib/tap/test/extensions.rb +0 -73
- data/lib/tap/test/file_test.rb +0 -362
- data/lib/tap/test/file_test_class.rb +0 -15
- data/lib/tap/test/regexp_escape.rb +0 -87
- data/lib/tap/test/script_test.rb +0 -46
- data/lib/tap/test/script_tester.rb +0 -115
- data/lib/tap/test/subset_test.rb +0 -260
- data/lib/tap/test/subset_test_class.rb +0 -99
- data/lib/tap/test/tap_test.rb +0 -109
- data/lib/tap/test/utils.rb +0 -231
data/lib/tap/support/gems.rb
DELETED
@@ -1,43 +0,0 @@
|
|
1
|
-
require 'rubygems'
|
2
|
-
|
3
|
-
module Tap
|
4
|
-
module Support
|
5
|
-
|
6
|
-
# Methods for working with {RubyGems}[http://www.rubygems.org/]
|
7
|
-
# and other gems frequently used by Tap.
|
8
|
-
module Gems
|
9
|
-
module_function
|
10
|
-
|
11
|
-
# Returns the gemspec for the specified gem. A gem version
|
12
|
-
# can be specified in the name, like 'gem >= 1.2'. The gem
|
13
|
-
# will be activated using +gem+ if necessary.
|
14
|
-
def gemspec(gem_name)
|
15
|
-
return gem_name if gem_name.kind_of?(Gem::Specification)
|
16
|
-
|
17
|
-
# figure the version of the gem, by default >= 0.0.0
|
18
|
-
gem_name.to_s =~ /^([^<=>]*)(.*)$/
|
19
|
-
name, version = $1.strip, $2
|
20
|
-
version = ">= 0.0.0" if version.empty?
|
21
|
-
|
22
|
-
return nil if name.empty?
|
23
|
-
|
24
|
-
# load the gem and get the spec
|
25
|
-
gem(name, version)
|
26
|
-
Gem.loaded_specs[name]
|
27
|
-
end
|
28
|
-
|
29
|
-
# Selects gem specs for which the block returns true. If
|
30
|
-
# latest is specified, only the latest version of each
|
31
|
-
# gem will be passed to the block.
|
32
|
-
def select_gems(latest=true)
|
33
|
-
index = latest ?
|
34
|
-
Gem.source_index.latest_specs :
|
35
|
-
Gem.source_index.gems.collect {|(name, spec)| spec }
|
36
|
-
|
37
|
-
index.select do |spec|
|
38
|
-
yield(spec)
|
39
|
-
end.sort
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
data/lib/tap/support/join.rb
DELETED
@@ -1,144 +0,0 @@
|
|
1
|
-
require 'configurable'
|
2
|
-
|
3
|
-
module Tap
|
4
|
-
module Support
|
5
|
-
|
6
|
-
# Joins create on_complete blocks which link together tasks (or more
|
7
|
-
# generally, Executable objects) into workflows. Joins support a
|
8
|
-
# variety of configurations which affect how one task passes inputs
|
9
|
-
# to subsequent tasks.
|
10
|
-
#
|
11
|
-
class Join
|
12
|
-
include Configurable
|
13
|
-
|
14
|
-
# Causes the join to iterate the results
|
15
|
-
# of the source when enquing the targets.
|
16
|
-
config :iterate, false, :short => 'i', &c.boolean
|
17
|
-
|
18
|
-
# Causes joins to splat ('*') the results
|
19
|
-
# of the source when enquing the targets.
|
20
|
-
config :splat, false, :short => 's', &c.boolean
|
21
|
-
|
22
|
-
# Causes the targets to be enqued rather
|
23
|
-
# than executed immediately.
|
24
|
-
config :stack, false, :short => 'k', &c.boolean
|
25
|
-
|
26
|
-
# Aggregates results and enques them to the target
|
27
|
-
# in a trailing round.
|
28
|
-
config :aggregate, false, :short => 'a', &c.boolean
|
29
|
-
|
30
|
-
# Initializes a new join with the specified configuration.
|
31
|
-
def initialize(config={})
|
32
|
-
initialize_config(config)
|
33
|
-
end
|
34
|
-
|
35
|
-
# The name of the join, as a symbol. By default name is the basename of
|
36
|
-
# the underscored class name.
|
37
|
-
def name
|
38
|
-
File.basename(self.class.to_s.underscore).to_sym
|
39
|
-
end
|
40
|
-
|
41
|
-
# Creates a join that passes the results of each input to each output.
|
42
|
-
def join(inputs, outputs)
|
43
|
-
inputs.each do |input|
|
44
|
-
input.on_complete do |_result|
|
45
|
-
outputs.each do |output|
|
46
|
-
yield(_result) if block_given?
|
47
|
-
enq(output, _result)
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
# A hash of the configurations set to true.
|
54
|
-
def options
|
55
|
-
opts = config.to_hash
|
56
|
-
opts.delete_if {|key, value| value == false }
|
57
|
-
opts
|
58
|
-
end
|
59
|
-
|
60
|
-
# Returns a string like: "#<Join:object_id>"
|
61
|
-
def inspect
|
62
|
-
"#<Join:#{object_id}>"
|
63
|
-
end
|
64
|
-
|
65
|
-
protected
|
66
|
-
|
67
|
-
# Enques the executable with the results, respecting the
|
68
|
-
# configuration for self.
|
69
|
-
#
|
70
|
-
# true false
|
71
|
-
# iterate _results are iterated _results are enqued directly
|
72
|
-
# splat _results are splat enqued _results are enqued directly
|
73
|
-
# stack the executable is enqued the executable is executed
|
74
|
-
#
|
75
|
-
def enq(executable, *_results)
|
76
|
-
case
|
77
|
-
when aggregate
|
78
|
-
|
79
|
-
case
|
80
|
-
when iterate, splat, stack
|
81
|
-
raise "iterate, splat, or stack and aggregate"
|
82
|
-
else collect(executable, _results)
|
83
|
-
end
|
84
|
-
|
85
|
-
else
|
86
|
-
unpack(_results) do |_result|
|
87
|
-
case
|
88
|
-
when stack
|
89
|
-
executable.enq(*_result)
|
90
|
-
else
|
91
|
-
executable._execute(*_result)
|
92
|
-
end
|
93
|
-
end
|
94
|
-
end
|
95
|
-
end
|
96
|
-
|
97
|
-
# returns the aggregator for self
|
98
|
-
def aggregator # :nodoc:
|
99
|
-
@aggregator ||= {}
|
100
|
-
end
|
101
|
-
|
102
|
-
# helper method to aggregate audited results
|
103
|
-
def collect(executable, inputs) # :nodoc:
|
104
|
-
queue = executable.app.queue
|
105
|
-
entry = aggregator[executable]
|
106
|
-
|
107
|
-
queue.synchronize do
|
108
|
-
unless queue.has?(entry)
|
109
|
-
entry = aggregator[executable] = [executable, []]
|
110
|
-
queue.concat [entry]
|
111
|
-
end
|
112
|
-
entry[1].concat(inputs)
|
113
|
-
end
|
114
|
-
end
|
115
|
-
|
116
|
-
# helper method to splat/iterate audited results
|
117
|
-
def unpack(_results) # :nodoc:
|
118
|
-
case
|
119
|
-
when iterate && splat
|
120
|
-
raise "splat and iterate"
|
121
|
-
when iterate
|
122
|
-
_splat(_results).each {|_result| yield(_result) }
|
123
|
-
when splat
|
124
|
-
yield(_splat(_results))
|
125
|
-
else
|
126
|
-
yield(_results)
|
127
|
-
end
|
128
|
-
end
|
129
|
-
|
130
|
-
# helper to splat audits
|
131
|
-
def _splat(_results) # :nodoc:
|
132
|
-
array = []
|
133
|
-
_results.each do |_result|
|
134
|
-
unless _result.kind_of?(Audit)
|
135
|
-
_result = Audit.new(nil, _result)
|
136
|
-
end
|
137
|
-
|
138
|
-
array.concat(_result.splat)
|
139
|
-
end
|
140
|
-
array
|
141
|
-
end
|
142
|
-
end
|
143
|
-
end
|
144
|
-
end
|
data/lib/tap/support/joins.rb
DELETED
@@ -1,12 +0,0 @@
|
|
1
|
-
require 'tap/support/join'
|
2
|
-
|
3
|
-
module Tap
|
4
|
-
module Support
|
5
|
-
|
6
|
-
# A module of the standard Join classes supported by Tap.
|
7
|
-
module Joins
|
8
|
-
autoload(:SyncMerge, 'tap/support/joins/sync_merge')
|
9
|
-
autoload(:Switch, 'tap/support/joins/switch')
|
10
|
-
end
|
11
|
-
end
|
12
|
-
end
|
@@ -1,27 +0,0 @@
|
|
1
|
-
module Tap
|
2
|
-
module Support
|
3
|
-
module Joins
|
4
|
-
|
5
|
-
# A Switch join allows a block to determine which output from an array
|
6
|
-
# of outputs will receive the results of the input.
|
7
|
-
class Switch < Join
|
8
|
-
def join(inputs, outputs)
|
9
|
-
inputs.each do |input|
|
10
|
-
input.on_complete do |_result|
|
11
|
-
if index = yield(_result)
|
12
|
-
unless output = outputs[index]
|
13
|
-
raise "no switch target for index: #{index}"
|
14
|
-
end
|
15
|
-
|
16
|
-
enq(output, _result)
|
17
|
-
else
|
18
|
-
input.app.aggregator.store(_result)
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
@@ -1,38 +0,0 @@
|
|
1
|
-
module Tap
|
2
|
-
module Support
|
3
|
-
module Joins
|
4
|
-
|
5
|
-
# SyncMerge passes the collected results of the inputs to the outputs. The
|
6
|
-
# results will not be passed until results from all of the inputs are
|
7
|
-
# available; results are passed in one group. Similarly, a collision
|
8
|
-
# results if a single input completes twice before the group completes as
|
9
|
-
# a whole.
|
10
|
-
class SyncMerge < Join
|
11
|
-
|
12
|
-
def join(inputs, outputs)
|
13
|
-
results = Array.new(inputs.length)
|
14
|
-
|
15
|
-
inputs.each do |input|
|
16
|
-
input.on_complete do |_result|
|
17
|
-
index = inputs.index(_result.key)
|
18
|
-
|
19
|
-
unless results[index] == nil
|
20
|
-
raise "sync_merge collision... already got a result for #{inputs[index]}"
|
21
|
-
end
|
22
|
-
results[index] = _result
|
23
|
-
|
24
|
-
unless results.include?(nil)
|
25
|
-
yield(*results) if block_given?
|
26
|
-
outputs.each {|output| enq(output, *results) }
|
27
|
-
|
28
|
-
# reset the results array
|
29
|
-
results.collect! {|i| nil }
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
data/lib/tap/support/manifest.rb
DELETED
@@ -1,171 +0,0 @@
|
|
1
|
-
require 'tap/support/minimap'
|
2
|
-
require 'tap/support/intern'
|
3
|
-
|
4
|
-
module Tap
|
5
|
-
module Support
|
6
|
-
|
7
|
-
# Stores an array of paths and makes them available for lookup by
|
8
|
-
# minipath. Manifests may be bound to a Tap::Env, allowing searches
|
9
|
-
# across a full environment (including nested environments).
|
10
|
-
#
|
11
|
-
# Manifest has a number of hooks used by subclasses like
|
12
|
-
# ConstantManifest to lazily add entries as needed.
|
13
|
-
class Manifest
|
14
|
-
class << self
|
15
|
-
|
16
|
-
# Interns a new manifest, overriding the minikey
|
17
|
-
# method with the block (the minikey method converts
|
18
|
-
# entries to the path used during minimap and
|
19
|
-
# minimatch lookup, see Minimap).
|
20
|
-
def intern(*args, &block)
|
21
|
-
instance = new(*args)
|
22
|
-
if block_given?
|
23
|
-
instance.extend Support::Intern(:minikey)
|
24
|
-
instance.minikey_block = block
|
25
|
-
end
|
26
|
-
instance
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
include Enumerable
|
31
|
-
include Minimap
|
32
|
-
|
33
|
-
# Matches a compound manifest search key. After the match,
|
34
|
-
# if the key is compound then:
|
35
|
-
#
|
36
|
-
# $1:: env_key
|
37
|
-
# $4:: key
|
38
|
-
#
|
39
|
-
# If the key is not compound, $4 is nil and $1 is the key.
|
40
|
-
SEARCH_REGEXP = /^(([A-z]:)?.*?)(:(.*))?$/
|
41
|
-
|
42
|
-
# An array entries in self.
|
43
|
-
attr_reader :entries
|
44
|
-
|
45
|
-
# The bound Tap::Env, or nil.
|
46
|
-
attr_reader :env
|
47
|
-
|
48
|
-
# The reader on Tap::Env accessing manifests of the
|
49
|
-
# same type as self. reader is set during bind.
|
50
|
-
attr_reader :reader
|
51
|
-
|
52
|
-
# Initializes a new, unbound Manifest.
|
53
|
-
def initialize(entries=[])
|
54
|
-
@entries = entries
|
55
|
-
@env = nil
|
56
|
-
@reader = nil
|
57
|
-
end
|
58
|
-
|
59
|
-
# Binds self to an env and reader. The manifests returned by env.reader
|
60
|
-
# will be used during traversal methods like search. Raises an error if
|
61
|
-
# env does not respond to reader; returns self.
|
62
|
-
def bind(env, reader)
|
63
|
-
if env == nil
|
64
|
-
raise ArgumentError, "env may not be nil"
|
65
|
-
end
|
66
|
-
|
67
|
-
unless env.respond_to?(reader)
|
68
|
-
raise ArgumentError, "env does not respond to #{reader}"
|
69
|
-
end
|
70
|
-
|
71
|
-
@env = env
|
72
|
-
@reader = reader
|
73
|
-
self
|
74
|
-
end
|
75
|
-
|
76
|
-
# Unbinds self from env. Returns self.
|
77
|
-
def unbind
|
78
|
-
@env = nil
|
79
|
-
@reader = nil
|
80
|
-
self
|
81
|
-
end
|
82
|
-
|
83
|
-
# True if the env and reader have been set.
|
84
|
-
def bound?
|
85
|
-
@env != nil && @reader != nil
|
86
|
-
end
|
87
|
-
|
88
|
-
# A hook for dynamically building entries. By default build simply
|
89
|
-
# returns self
|
90
|
-
def build
|
91
|
-
self
|
92
|
-
end
|
93
|
-
|
94
|
-
# A hook to flag when self is built. By default built? returns true.
|
95
|
-
def built?
|
96
|
-
true
|
97
|
-
end
|
98
|
-
|
99
|
-
# A hook to reset a build. By default reset simply returns self.
|
100
|
-
def reset
|
101
|
-
self
|
102
|
-
end
|
103
|
-
|
104
|
-
# True if entries are empty.
|
105
|
-
def empty?
|
106
|
-
entries.empty?
|
107
|
-
end
|
108
|
-
|
109
|
-
# Iterates over each entry entry in self.
|
110
|
-
def each
|
111
|
-
entries.each {|entry| yield(entry) }
|
112
|
-
end
|
113
|
-
|
114
|
-
# Alias for Minimap#minimatch.
|
115
|
-
def [](key)
|
116
|
-
minimatch(key)
|
117
|
-
end
|
118
|
-
|
119
|
-
# Search across env.each for the first entry minimatching key.
|
120
|
-
# A single env can be specified by using a compound key like
|
121
|
-
# 'env_key:key'. Returns nil if no matching entry is found.
|
122
|
-
#
|
123
|
-
# Search raises an error unless bound?
|
124
|
-
def search(key)
|
125
|
-
raise "cannot search unless bound" unless bound?
|
126
|
-
|
127
|
-
key =~ SEARCH_REGEXP
|
128
|
-
envs = if $4 != nil
|
129
|
-
# compound key, match for env
|
130
|
-
key = $4
|
131
|
-
[env.minimatch($1)].compact
|
132
|
-
else
|
133
|
-
# not a compound key, search all
|
134
|
-
# envs by iterating env itself
|
135
|
-
env
|
136
|
-
end
|
137
|
-
|
138
|
-
# traverse envs looking for the first
|
139
|
-
# manifest entry matching key
|
140
|
-
envs.each do |env|
|
141
|
-
if result = env.send(reader).minimatch(key)
|
142
|
-
return result
|
143
|
-
end
|
144
|
-
end
|
145
|
-
|
146
|
-
nil
|
147
|
-
end
|
148
|
-
|
149
|
-
def inspect(traverse=true)
|
150
|
-
if traverse && bound?
|
151
|
-
lines = []
|
152
|
-
env.each do |env|
|
153
|
-
manifest = env.send(reader).build
|
154
|
-
next if manifest.empty?
|
155
|
-
|
156
|
-
lines << "== #{env.root.root}"
|
157
|
-
manifest.minimap.each do |mini, value|
|
158
|
-
lines << " #{mini}: #{value.inspect}"
|
159
|
-
end
|
160
|
-
end
|
161
|
-
return lines.join("\n")
|
162
|
-
end
|
163
|
-
|
164
|
-
lines = minimap.collect do |mini, value|
|
165
|
-
" #{mini}: #{value.inspect}"
|
166
|
-
end
|
167
|
-
"#{self.class}:#{object_id} (#{bound? ? env.root.root : ''})\n#{lines.join("\n")}"
|
168
|
-
end
|
169
|
-
end
|
170
|
-
end
|
171
|
-
end
|
data/lib/tap/support/minimap.rb
DELETED
@@ -1,90 +0,0 @@
|
|
1
|
-
require 'tap/root'
|
2
|
-
|
3
|
-
module Tap
|
4
|
-
module Support
|
5
|
-
|
6
|
-
# Minimap adds minimization and search methods to an array of paths (see
|
7
|
-
# Tap::Root.minimize and Tap::Root.minimal_match?).
|
8
|
-
#
|
9
|
-
# paths = %w{
|
10
|
-
# path/to/file-0.1.0.txt
|
11
|
-
# path/to/file-0.2.0.txt
|
12
|
-
# path/to/another_file.txt
|
13
|
-
# }
|
14
|
-
# paths.extend Minimap
|
15
|
-
#
|
16
|
-
# paths.minimatch('file') # => 'path/to/file-0.1.0.txt'
|
17
|
-
# paths.minimatch('file-0.2.0') # => 'path/to/file-0.2.0.txt'
|
18
|
-
# paths.minimatch('another_file') # => 'path/to/another_file.txt'
|
19
|
-
#
|
20
|
-
# More generally, Minimap may extend any object responding to each.
|
21
|
-
# Override the minikey method to convert objects into paths.
|
22
|
-
#
|
23
|
-
# class ConstantMap < Array
|
24
|
-
# include Minimap
|
25
|
-
#
|
26
|
-
# def minikey(const)
|
27
|
-
# const.underscore
|
28
|
-
# end
|
29
|
-
# end
|
30
|
-
#
|
31
|
-
# constants = ConstantMap[Tap::Support::Minimap Tap::Root]
|
32
|
-
# constants.minimatch('root') # => Tap::Root
|
33
|
-
# constants.minimatch('minimap') # => Tap::Support::Minimap
|
34
|
-
#
|
35
|
-
module Minimap
|
36
|
-
|
37
|
-
# Provides a minimized map of the entries using keys provided minikey.
|
38
|
-
#
|
39
|
-
# paths = %w{
|
40
|
-
# path/to/file-0.1.0.txt
|
41
|
-
# path/to/file-0.2.0.txt
|
42
|
-
# path/to/another_file.txt
|
43
|
-
# }.extend Minimap
|
44
|
-
#
|
45
|
-
# paths.minimap
|
46
|
-
# # => [
|
47
|
-
# # ['file-0.1.0', 'path/to/file-0.1.0.txt'],
|
48
|
-
# # ['file-0.2.0', 'path/to/file-0.2.0.txt'],
|
49
|
-
# # ['another_file','path/to/another_file.txt']]
|
50
|
-
#
|
51
|
-
def minimap
|
52
|
-
hash = {}
|
53
|
-
map = []
|
54
|
-
each {|entry| map << (hash[minikey(entry)] = [entry]) }
|
55
|
-
Tap::Root.minimize(hash.keys) do |key, mini_key|
|
56
|
-
hash[key].unshift mini_key
|
57
|
-
end
|
58
|
-
|
59
|
-
map
|
60
|
-
end
|
61
|
-
|
62
|
-
# Returns the first entry whose minikey mini-matches the input, or nil if
|
63
|
-
# no such entry exists.
|
64
|
-
#
|
65
|
-
# paths = %w{
|
66
|
-
# path/to/file-0.1.0.txt
|
67
|
-
# path/to/file-0.2.0.txt
|
68
|
-
# path/to/another_file.txt
|
69
|
-
# }.extend Minimap
|
70
|
-
#
|
71
|
-
# paths.minimatch('file-0.2.0') # => 'path/to/file-0.2.0.txt'
|
72
|
-
# paths.minimatch('file-0.3.0') # => nil
|
73
|
-
#
|
74
|
-
def minimatch(key)
|
75
|
-
each do |entry|
|
76
|
-
return entry if Tap::Root.minimal_match?(minikey(entry), key)
|
77
|
-
end
|
78
|
-
nil
|
79
|
-
end
|
80
|
-
|
81
|
-
protected
|
82
|
-
|
83
|
-
# A hook to convert a non-path entry into a path for minimap and
|
84
|
-
# minimatch. Returns the entry by default.
|
85
|
-
def minikey(entry)
|
86
|
-
entry
|
87
|
-
end
|
88
|
-
end
|
89
|
-
end
|
90
|
-
end
|