collin-fold 0.0.6 → 0.0.8
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/Rakefile.rb +1 -1
- data/lib/fold.rb +2 -0
- data/lib/fold/abstract_fold.rb +2 -2
- data/lib/fold/abstract_slice.rb +6 -0
- data/lib/fold/fold_factory.rb +7 -1
- data/lib/fold/precompiler.rb +5 -2
- data/lib/fold/slice_factory.rb +65 -0
- data/rspec/fold/abstract_fold_spec.rb +11 -0
- data/rspec/fold/abstract_slice_spec.rb +8 -0
- data/rspec/fold/fold_factory_spec.rb +8 -2
- data/rspec/fold/precompiler_spec.rb +20 -0
- data/rspec/fold/slice_factory_spec.rb +40 -0
- data/rspec/fold_spec_helper.rb +1 -0
- metadata +6 -1
data/Rakefile.rb
CHANGED
data/lib/fold.rb
CHANGED
data/lib/fold/abstract_fold.rb
CHANGED
data/lib/fold/fold_factory.rb
CHANGED
@@ -30,6 +30,11 @@ module Fold
|
|
30
30
|
|
31
31
|
fold.metaclass.send :attr_accessor, var.gsub('@', '')
|
32
32
|
end
|
33
|
+
that = self
|
34
|
+
fold.meta_def :method_missing do |meth, *args|
|
35
|
+
return that.send(meth, *args) if that.respond_to?(meth)
|
36
|
+
super
|
37
|
+
end
|
33
38
|
|
34
39
|
fold
|
35
40
|
end
|
@@ -46,11 +51,12 @@ module Fold
|
|
46
51
|
end
|
47
52
|
|
48
53
|
module ClassMethods
|
49
|
-
def folds id, regex=AbstractFold::Regex, &block
|
54
|
+
def folds id, regex=AbstractFold::Regex, clear_match=true, &block
|
50
55
|
fold= Class.new(AbstractFold)
|
51
56
|
fold.const_set :Regex, regex
|
52
57
|
|
53
58
|
fold.send :define_method, :render, &block if block_given?
|
59
|
+
fold.class.send :define_method, :clear_match do; clear_match end
|
54
60
|
|
55
61
|
const_set id, fold
|
56
62
|
defined_folds << fold
|
data/lib/fold/precompiler.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
module Fold
|
2
2
|
class Precompiler
|
3
3
|
include Fold::FoldFactory
|
4
|
+
include Fold::SliceFactory
|
4
5
|
|
5
6
|
def fold lines
|
6
7
|
last_line= produce
|
@@ -12,7 +13,7 @@ module Fold
|
|
12
13
|
parent_stack= []
|
13
14
|
|
14
15
|
lines.each do |text|
|
15
|
-
line = produce text
|
16
|
+
line = produce process(text)
|
16
17
|
|
17
18
|
indent = line.tabs - last_line.tabs
|
18
19
|
|
@@ -33,7 +34,9 @@ module Fold
|
|
33
34
|
parent_line = parent_stack.last
|
34
35
|
parent_line.children << line
|
35
36
|
end
|
36
|
-
|
37
|
+
|
38
|
+
line.parent = parent_line unless parent_line.nil?
|
39
|
+
|
37
40
|
last_line= line
|
38
41
|
end
|
39
42
|
|
@@ -0,0 +1,65 @@
|
|
1
|
+
require 'ruby2ruby'
|
2
|
+
|
3
|
+
module Fold
|
4
|
+
module SliceFactory
|
5
|
+
def self.included klass
|
6
|
+
klass.extend ClassMethods
|
7
|
+
end
|
8
|
+
|
9
|
+
def process line=''
|
10
|
+
self.class.defined_slices.each do |slice|
|
11
|
+
line.gsub! slice::Regex do |match|
|
12
|
+
text = $1
|
13
|
+
eval(slice::Block.to_ruby).call
|
14
|
+
end
|
15
|
+
end
|
16
|
+
line
|
17
|
+
end
|
18
|
+
|
19
|
+
# def produce line=''
|
20
|
+
# # This all happens because I need to access Precompiler attributes
|
21
|
+
# # from within AbstractFold render methods
|
22
|
+
# # Pretty much needs a nice refactor, but don't have the time.
|
23
|
+
# # PS: thx ruby
|
24
|
+
# fold = if klass= detect_class(line)
|
25
|
+
# klass.new attrs
|
26
|
+
# else
|
27
|
+
# AbstractFold.new attrs.merge(:tabs => -1)
|
28
|
+
# end
|
29
|
+
#
|
30
|
+
# instance_variables.each do |var|
|
31
|
+
# fold.instance_variable_set var, instance_variable_get(var)
|
32
|
+
#
|
33
|
+
# fold.metaclass.send :attr_accessor, var.gsub('@', '')
|
34
|
+
# end
|
35
|
+
# that = self
|
36
|
+
# fold.meta_def :method_missing do |meth, *args|
|
37
|
+
# return that.send(meth, *args) if that.respond_to?(meth)
|
38
|
+
# super
|
39
|
+
# end
|
40
|
+
#
|
41
|
+
# fold
|
42
|
+
# end
|
43
|
+
|
44
|
+
def detect_slice_class line
|
45
|
+
return nil if line.blank?
|
46
|
+
self.class.defined_slices.reverse.detect {|slice| slice::Regex and slice::Regex.match(line)}
|
47
|
+
end
|
48
|
+
|
49
|
+
module ClassMethods
|
50
|
+
def slices id, regex=AbstractSlice::Regex, &block
|
51
|
+
slice= Class.new(AbstractSlice)
|
52
|
+
|
53
|
+
slice.const_set :Regex, regex
|
54
|
+
slice.const_set :Block, block
|
55
|
+
|
56
|
+
const_set id, slice
|
57
|
+
defined_slices << slice
|
58
|
+
end
|
59
|
+
|
60
|
+
def defined_slices
|
61
|
+
@slices||= []
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
@@ -12,6 +12,11 @@ describe Fold::AbstractFold, ".initialize" do
|
|
12
12
|
Fold::Precompiler.folds :What, /what/
|
13
13
|
Fold::Precompiler::What::Regex.should == /what/
|
14
14
|
end
|
15
|
+
|
16
|
+
it "and specifies whether or not to rip the match from the source" do
|
17
|
+
Fold::Precompiler.folds :Whatever, /whatever/, false
|
18
|
+
Fold::Precompiler::Whatever.clear_match.should == false
|
19
|
+
end
|
15
20
|
end
|
16
21
|
|
17
22
|
describe Fold::AbstractFold, ".render" do
|
@@ -28,6 +33,12 @@ describe Fold::AbstractFold, ".render" do
|
|
28
33
|
what= Fold::Precompiler::What.new(:text=>'whatever')
|
29
34
|
what.render.should== "ever?"
|
30
35
|
end
|
36
|
+
|
37
|
+
it "doesn't clear match text if clear_match is false" do
|
38
|
+
Fold::Precompiler.folds :Dirty, /dirty/, false
|
39
|
+
dirty = Fold::Precompiler::Dirty.new(:text=>"dirty bird")
|
40
|
+
dirty.render.should == "dirty bird"
|
41
|
+
end
|
31
42
|
|
32
43
|
it "renders children" do
|
33
44
|
Fold::Precompiler.folds :Parent, /^parent / do
|
@@ -5,6 +5,10 @@ class Included
|
|
5
5
|
def initialize
|
6
6
|
@instance_variable = []
|
7
7
|
end
|
8
|
+
|
9
|
+
def passed
|
10
|
+
:passed
|
11
|
+
end
|
8
12
|
end
|
9
13
|
|
10
14
|
describe Fold::FoldFactory do
|
@@ -47,13 +51,15 @@ describe Fold::FoldFactory, ".produce" do
|
|
47
51
|
@it.produce.instance_variables.should include("@instance_variable")
|
48
52
|
end
|
49
53
|
|
54
|
+
it "methods fall through" do
|
55
|
+
@it.produce.passed.should == :passed
|
56
|
+
end
|
57
|
+
|
50
58
|
it "and sets up attribute accessors for them" do
|
51
59
|
@it.produce.instance_variable.should === []
|
52
60
|
end
|
53
61
|
end
|
54
62
|
|
55
|
-
|
56
|
-
|
57
63
|
#describe Fold::Precompiler::Action::Regex do
|
58
64
|
# it "matches !LINE" do
|
59
65
|
# Fold::Precompiler::Action::Regex.should match("!LINE")
|
@@ -9,6 +9,10 @@ end
|
|
9
9
|
class Confused < Fold::Precompiler
|
10
10
|
folds :Line, //
|
11
11
|
folds :What, /what/
|
12
|
+
|
13
|
+
slices :Octothorp, /#([\w]+)/ do
|
14
|
+
"octothorpedo:#{text}"
|
15
|
+
end
|
12
16
|
end
|
13
17
|
|
14
18
|
describe Fold::Precompiler, ".folds" do
|
@@ -45,6 +49,22 @@ LINE 7
|
|
45
49
|
}
|
46
50
|
@it.fold(en.lines).children.length.should == 3
|
47
51
|
end
|
52
|
+
|
53
|
+
it "children can be orphans" do
|
54
|
+
en = Fold::Engine.new "LINE 1"
|
55
|
+
@it.fold(en.lines).parent.should == nil
|
56
|
+
end
|
57
|
+
|
58
|
+
it "lets children know about their parents" do
|
59
|
+
en = Fold::Engine.new %{
|
60
|
+
Line 1
|
61
|
+
Line 2
|
62
|
+
Line 3
|
63
|
+
}
|
64
|
+
|
65
|
+
folded = @it.fold(en.lines)
|
66
|
+
folded.children.first.parent.should == folded
|
67
|
+
end
|
48
68
|
|
49
69
|
it "barfs on innappropriate indentation" do
|
50
70
|
en= Fold::Engine.new %{
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'rspec/fold_spec_helper'
|
2
|
+
|
3
|
+
class Included
|
4
|
+
include Fold::FoldFactory
|
5
|
+
include Fold::SliceFactory
|
6
|
+
|
7
|
+
slices :Interpolation, /#\{(.*?)\}/ do
|
8
|
+
text
|
9
|
+
end
|
10
|
+
|
11
|
+
def initialize
|
12
|
+
@instance_variable = []
|
13
|
+
end
|
14
|
+
|
15
|
+
def passed
|
16
|
+
:passed
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
describe Fold::SliceFactory do
|
21
|
+
it "inherits module" do
|
22
|
+
Fold::SliceFactory.class.should == Module
|
23
|
+
end
|
24
|
+
|
25
|
+
before(:each) do
|
26
|
+
@it = Included.new
|
27
|
+
end
|
28
|
+
|
29
|
+
it "has list of included slices" do
|
30
|
+
Included.defined_slices.should include(Included::Interpolation)
|
31
|
+
end
|
32
|
+
|
33
|
+
it "generates constant" do
|
34
|
+
Included::Interpolation.should_not be_nil
|
35
|
+
end
|
36
|
+
|
37
|
+
it "replaces items in a string" do
|
38
|
+
@it.process('#{hey} whats #{up}').should == "hey whats up"
|
39
|
+
end
|
40
|
+
end
|
data/rspec/fold_spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: collin-fold
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Collin Miller
|
@@ -47,6 +47,8 @@ files:
|
|
47
47
|
- lib/fold/abstract_fold.rb
|
48
48
|
- lib/fold/fold_factory.rb
|
49
49
|
- lib/fold/precompiler.rb
|
50
|
+
- lib/fold/slice_factory.rb
|
51
|
+
- lib/fold/abstract_slice.rb
|
50
52
|
- rspec/fixtures
|
51
53
|
- rspec/fixtures/fold
|
52
54
|
- rspec/fixtures/fold/fixture.target.fold
|
@@ -58,6 +60,9 @@ files:
|
|
58
60
|
- rspec/fold/fold_factory_spec.rb
|
59
61
|
- rspec/fold/engine_spec.rb
|
60
62
|
- rspec/fold/abstract_fold_spec.rb
|
63
|
+
- rspec/fold/slice_factory_spec.rb
|
64
|
+
- rspec/fold/abstract_slice_spec.rb
|
65
|
+
- rspec/fold/precompiler_spec.rb~
|
61
66
|
has_rdoc: false
|
62
67
|
homepage: http://github.com/collin/fold
|
63
68
|
post_install_message:
|