hx 0.24.0 → 0.25.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.
- data/VERSION +1 -1
- data/lib/hx.rb +18 -47
- data/lib/hx/cli.rb +3 -2
- data/lib/hx/path.rb +9 -0
- data/spec/selector_spec.rb +17 -1
- metadata +6 -6
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.25.0
|
data/lib/hx.rb
CHANGED
@@ -39,12 +39,27 @@ end
|
|
39
39
|
class EditingNotSupportedError < RuntimeError
|
40
40
|
end
|
41
41
|
|
42
|
-
|
43
|
-
module Filter
|
42
|
+
module View
|
44
43
|
def edit_entry(path, prototype=nil)
|
45
44
|
raise EditingNotSupportedError, "Editing not supported for #{path}"
|
46
45
|
end
|
47
46
|
|
47
|
+
def each_entry(selector)
|
48
|
+
raise NotImplementedError, "#{self.class}#each_entry not implemented"
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def self.get_entry(view, path)
|
53
|
+
view.each_entry(Path.literal(path)) do |entry_path, entry|
|
54
|
+
return entry
|
55
|
+
end
|
56
|
+
raise NoSuchEntryError, path
|
57
|
+
end
|
58
|
+
|
59
|
+
# minimal complete definition: each_entry_path + get_entry, or each_entry
|
60
|
+
module Filter
|
61
|
+
include View
|
62
|
+
|
48
63
|
def each_entry_path(selector)
|
49
64
|
each_entry(selector) { |path, entry| yield path }
|
50
65
|
end
|
@@ -61,10 +76,7 @@ module Filter
|
|
61
76
|
end
|
62
77
|
|
63
78
|
def get_entry(path)
|
64
|
-
|
65
|
-
return entry
|
66
|
-
end
|
67
|
-
raise NoSuchEntryError, path
|
79
|
+
Hx.get_entry(self, path)
|
68
80
|
end
|
69
81
|
end
|
70
82
|
|
@@ -332,42 +344,6 @@ class Sort
|
|
332
344
|
end
|
333
345
|
end
|
334
346
|
|
335
|
-
class IncludeFragments
|
336
|
-
include Hx::Filter
|
337
|
-
|
338
|
-
def initialize(input, options)
|
339
|
-
@input = input
|
340
|
-
@fragments = options[:fragments] || {}
|
341
|
-
@fragment_paths = Set.new(@fragments.values)
|
342
|
-
end
|
343
|
-
|
344
|
-
def edit_entry(path, prototype)
|
345
|
-
raise EditingNotSupported, path if @fragment_paths.include? path
|
346
|
-
@input.edit_entry(path, prototype) { |text| yield text }
|
347
|
-
self
|
348
|
-
end
|
349
|
-
|
350
|
-
def each_entry_path(selector)
|
351
|
-
@input.each_entry_path(selector) do |path|
|
352
|
-
yield path unless @fragment_paths.include? path
|
353
|
-
end
|
354
|
-
self
|
355
|
-
end
|
356
|
-
|
357
|
-
def get_entry(path)
|
358
|
-
raise NoSuchEntryError, path if @fragment_paths.include? path
|
359
|
-
entry = @input.get_entry(path)
|
360
|
-
entry = entry.dup
|
361
|
-
for field, fragment_path in @fragments
|
362
|
-
begin
|
363
|
-
entry[field] = @input.get_entry(path)
|
364
|
-
rescue NoSuchEntryError
|
365
|
-
end
|
366
|
-
end
|
367
|
-
entry
|
368
|
-
end
|
369
|
-
end
|
370
|
-
|
371
347
|
Chain = Object.new
|
372
348
|
def Chain.new(input, options)
|
373
349
|
filters = options[:chain] || []
|
@@ -473,11 +449,6 @@ def self.build_source(options, default_input, sources, raw_source)
|
|
473
449
|
source = Overlay.new(*input_sources)
|
474
450
|
end
|
475
451
|
|
476
|
-
if raw_source.has_key? 'fragments'
|
477
|
-
source = IncludeFragments.new(source,
|
478
|
-
:fragments => raw_source['fragments'])
|
479
|
-
end
|
480
|
-
|
481
452
|
if raw_source.has_key? 'filter'
|
482
453
|
if raw_source.has_key? 'options'
|
483
454
|
filter_options = options.dup
|
data/lib/hx/cli.rb
CHANGED
@@ -48,8 +48,8 @@ Usage: hx [--config CONFIG_FILE] [upgen]
|
|
48
48
|
hx [--config CONFIG_FILE] regen
|
49
49
|
hx [--config CONFIG_FILE] post[up] SOURCE:PATH
|
50
50
|
hx [--config CONFIG_FILE] edit[up] SOURCE:PATH
|
51
|
-
hx [--config CONFIG_FILE] list SOURCE:PATTERN
|
52
|
-
hx [--config CONFIG_FILE] dump SOURCE:PATTERN
|
51
|
+
hx [--config CONFIG_FILE] list SOURCE[:PATTERN]
|
52
|
+
hx [--config CONFIG_FILE] dump SOURCE[:PATTERN]
|
53
53
|
hx [--config CONFIG_FILE] serve [PORT]
|
54
54
|
|
55
55
|
EOS
|
@@ -102,6 +102,7 @@ EOS
|
|
102
102
|
end
|
103
103
|
|
104
104
|
def self.cmd_serve(site, port=nil)
|
105
|
+
Socket.do_not_reverse_lookup = true
|
105
106
|
server = WEBrick::HTTPServer.new({:Port => port || 0})
|
106
107
|
real_port = server.config[:Port]
|
107
108
|
|
data/lib/hx/path.rb
CHANGED
@@ -29,6 +29,10 @@ module Selector
|
|
29
29
|
raise NotImplementedError, "#{self.class}#accept_path? not implemented"
|
30
30
|
end
|
31
31
|
|
32
|
+
def literal?
|
33
|
+
false
|
34
|
+
end
|
35
|
+
|
32
36
|
def |(other)
|
33
37
|
Disjunction.build(self, other)
|
34
38
|
end
|
@@ -61,6 +65,7 @@ class Pattern
|
|
61
65
|
include Selector
|
62
66
|
|
63
67
|
def initialize(tokens)
|
68
|
+
@is_literal = tokens.size == 1 and String === tokens.first
|
64
69
|
@regexp = Regexp.new("^#{tokens.map { |token|
|
65
70
|
case token
|
66
71
|
when :doublestar; '.*'
|
@@ -70,6 +75,10 @@ class Pattern
|
|
70
75
|
}}$")
|
71
76
|
end
|
72
77
|
|
78
|
+
def literal?
|
79
|
+
@is_literal
|
80
|
+
end
|
81
|
+
|
73
82
|
def accept_path?(path) ; !!(path =~ @regexp) ; end
|
74
83
|
end
|
75
84
|
|
data/spec/selector_spec.rb
CHANGED
@@ -7,6 +7,16 @@ describe Hx::Path::Pattern do
|
|
7
7
|
Hx::Path::Pattern.should < Hx::Path::Selector
|
8
8
|
end
|
9
9
|
|
10
|
+
it "should indicate literal paths as singletons" do
|
11
|
+
pattern = Hx::Path.literal("foo/bar")
|
12
|
+
pattern.literal?.should be_true
|
13
|
+
end
|
14
|
+
|
15
|
+
it "should not indicate patterns as singletons" do
|
16
|
+
pattern = Hx::Path.parse_pattern('foo/*')
|
17
|
+
pattern.literal?.should be_false
|
18
|
+
end
|
19
|
+
|
10
20
|
it "should accept or reject literal paths" do
|
11
21
|
pattern = Hx::Path.literal("foo/bar")
|
12
22
|
pattern.should accept_path("foo/bar")
|
@@ -84,7 +94,13 @@ describe "Hx::Path::Selector conjunctions" do
|
|
84
94
|
end
|
85
95
|
end
|
86
96
|
|
87
|
-
describe
|
97
|
+
describe Hx::Path::Selector do
|
98
|
+
it "should define a default literal? method which returns false" do
|
99
|
+
o = Object.new
|
100
|
+
o.extend Hx::Path::Selector
|
101
|
+
o.literal?.should be_false
|
102
|
+
end
|
103
|
+
|
88
104
|
it "should be able to elide specific circumfixes" do
|
89
105
|
filter = Hx::Path.parse_pattern("foo").elide_circumfix("XXX", "YYY")
|
90
106
|
filter.should accept_path("XXXfooYYY")
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hx
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
5
|
-
prerelease:
|
4
|
+
hash: 123
|
5
|
+
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
8
|
+
- 25
|
9
9
|
- 0
|
10
|
-
version: 0.
|
10
|
+
version: 0.25.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- MenTaLguY
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-
|
18
|
+
date: 2011-04-29 00:00:00 -07:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -160,7 +160,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
160
160
|
requirements: []
|
161
161
|
|
162
162
|
rubyforge_project:
|
163
|
-
rubygems_version: 1.
|
163
|
+
rubygems_version: 1.6.2
|
164
164
|
signing_key:
|
165
165
|
specification_version: 3
|
166
166
|
summary: A miniature static site generator.
|