cableguy 0.2.3 → 0.5.0.pre2

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.
Files changed (58) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +59 -1
  3. data/Gemfile +6 -5
  4. data/Gemfile.lock +38 -0
  5. data/LICENSE.md +20 -0
  6. data/README.md +28 -0
  7. data/Rakefile +23 -1
  8. data/bin/cable +2 -37
  9. data/cableguy.gemspec +15 -17
  10. data/lib/palmade/cableguy/builders/cable_chmod.rb +3 -5
  11. data/lib/palmade/cableguy/builders/cable_copy.rb +2 -5
  12. data/lib/palmade/cableguy/builders/cable_custom.rb +6 -3
  13. data/lib/palmade/cableguy/builders/cable_mkdir.rb +3 -6
  14. data/lib/palmade/cableguy/builders/cable_move.rb +2 -5
  15. data/lib/palmade/cableguy/builders/cable_symlink.rb +4 -7
  16. data/lib/palmade/cableguy/builders/cable_template.rb +25 -9
  17. data/lib/palmade/cableguy/builders.rb +7 -8
  18. data/lib/palmade/cableguy/cable.rb +1 -24
  19. data/lib/palmade/cableguy/cablefile.rb +107 -0
  20. data/lib/palmade/cableguy/cabler.rb +257 -53
  21. data/lib/palmade/cableguy/cabling_values.rb +54 -0
  22. data/lib/palmade/cableguy/cli.rb +232 -0
  23. data/lib/palmade/cableguy/cli_helper.rb +18 -0
  24. data/lib/palmade/cableguy/configurator.rb +19 -20
  25. data/lib/palmade/cableguy/constants.rb +17 -2
  26. data/lib/palmade/cableguy/db.rb +115 -66
  27. data/lib/palmade/cableguy/{cable_configurator.rb → legacy_configurator.rb} +1 -2
  28. data/lib/palmade/cableguy/migration.rb +37 -61
  29. data/lib/palmade/cableguy/migrator.rb +124 -0
  30. data/lib/palmade/cableguy/templatebinding.rb +23 -16
  31. data/lib/palmade/cableguy/utils.rb +6 -7
  32. data/lib/palmade/cableguy/version.rb +1 -1
  33. data/lib/palmade/cableguy.rb +19 -34
  34. data/test/.cabling_values.yml +9 -0
  35. data/test/app/Cablefile +10 -0
  36. data/test/app/cabling/base/blog.rb +21 -0
  37. data/test/app/cabling/init.rb +16 -0
  38. data/test/app/config/templates/blog.yml +10 -0
  39. data/test/app_cabling_test.rb +33 -0
  40. data/test/boboot.rb +53 -0
  41. data/test/boot_test.rb +25 -0
  42. data/test/cablefile_test.rb +44 -0
  43. data/test/cabler_test.rb +45 -0
  44. data/test/cabling/base/blog.rb +17 -0
  45. data/test/cabling/init.rb +16 -0
  46. data/test/cabling_values_test.rb +24 -0
  47. data/test/cli_lock_test.rb +28 -0
  48. data/test/cli_test.rb +88 -0
  49. data/test/configure_test.rb +31 -0
  50. data/test/db_methods_test.rb +19 -0
  51. data/test/migrate_legacy_test.rb +34 -0
  52. data/test/migrate_test.rb +39 -0
  53. data/test/test_apply/config/blog.yml +10 -0
  54. data/test/test_helper.rb +81 -0
  55. metadata +93 -29
  56. data/Manifest +0 -19
  57. data/README +0 -1
  58. data/lib/palmade/cableguy/runner.rb +0 -44
@@ -16,6 +16,11 @@ module Palmade::Cableguy
16
16
  end
17
17
  end
18
18
 
19
+ def include?(section)
20
+ @sections.include?(prep(section))
21
+ end
22
+ alias :has? :include?
23
+
19
24
  def method_missing(method, *args, &block)
20
25
  method = method.to_s
21
26
  if method[-1,1] == '='
@@ -54,12 +59,7 @@ EVAL
54
59
  end
55
60
  end
56
61
 
57
- def include?(section)
58
- @sections.include?(prep(section))
59
- end
60
- alias :has? :include?
61
-
62
- def configure(file_path)
62
+ def configure_from_file(file_path)
63
63
  if File.exists?(file_path)
64
64
  fcontents = File.read(file_path)
65
65
  self.instance_eval(fcontents, file_path)
@@ -69,19 +69,6 @@ EVAL
69
69
  self
70
70
  end
71
71
 
72
- def call_section(section, *args)
73
- section = prep(section)
74
- if @sections.include?(section)
75
- @sections[section].each do |block|
76
- block.call(*(args + @args))
77
- end
78
- else
79
- raise ArgumentError, "Section #{section} not defined."
80
- end
81
- end
82
- alias :call :call_section
83
- alias :include :call_section
84
-
85
72
  protected
86
73
 
87
74
  def prep(section)
@@ -108,6 +95,18 @@ EVAL
108
95
  raise ArgumentError, "Unknown update command: #{command}"
109
96
  end
110
97
  end
98
+
99
+ def call_section(section, *args)
100
+ section = prep(section)
101
+ if @sections.include?(section)
102
+ @sections[section].each do |block|
103
+ block.call(*(args + @args))
104
+ end
105
+ else
106
+ raise ArgumentError, "Section #{section} not defined."
107
+ end
108
+ end
109
+ alias :call :call_section
110
+ alias :include :call_section
111
111
  end
112
112
  end
113
-
@@ -1,6 +1,21 @@
1
1
  module Palmade::Cableguy
2
2
  module Constants
3
- DB_DIRECTORY = "db"
4
- DB_EXTENSION = "sqlite3"
3
+ DB_DIRECTORY = 'db'
4
+ DB_EXTENSION = 'sqlite3'
5
+
6
+ DEFAULT_CABLEFILE_NAME = 'Cablefile'
7
+ DEFAULT_LEGACY_CABLEFILE_NAME = 'config/cableguy.rb'
8
+
9
+ DEFAULT_CABLING_PATH = File.join(ENV['HOME'], 'cabling')
10
+ DEFAULT_CABLING_VALUES_PATH = File.join(ENV['HOME'], '.cabling_values.yml')
11
+
12
+ DEFAULT_LOCK_FILE = File.join('.cabling.yml')
13
+ DEFAULT_LOCK_PATH = File.join(ENV['HOME'], DEFAULT_LOCK_FILE)
14
+
15
+ DEFAULT_TARGET = 'development'
16
+ DEFAULT_LOCATION = nil
17
+
18
+ DEFAULT_TEMPLATES_PATH = 'config/templates'
19
+ DEPRECATED_DEFAULT_TARGET_PATH = 'config'
5
20
  end
6
21
  end
@@ -1,96 +1,131 @@
1
+ require 'sequel'
2
+ require 'fileutils'
3
+
1
4
  module Palmade::Cableguy
2
5
  class DB
3
6
  attr_reader :database
7
+ attr_reader :dataset
8
+
9
+ GLOBAL_GROUP = 'globals'
4
10
 
5
- def initialize(cabler)
11
+ DEFAULT_OPTIONS = {
12
+ :save_db => nil
13
+ }
14
+
15
+ def initialize(cabler, options = { })
16
+ @options = DEFAULT_OPTIONS.merge(options)
6
17
  @cabler = cabler
18
+
7
19
  @database = nil
8
20
  @sql_options = { :logger => @cabler.logger, :sql_log_level => :info }
9
21
 
10
22
  if @cabler.options[:verbose]
11
23
  @sql_options[:sql_log_level] = :debug
12
24
  end
25
+
26
+ @migrated = false
13
27
  end
14
28
 
15
29
  def boot
16
- @database = Sequel.sqlite(@cabler.db_path, @sql_options)
17
- @group = ""
18
- @prefix_stack = []
30
+ if @options[:save_db].nil?
31
+ connect_string = 'sqlite:/'
32
+ else
33
+ FileUtils.mkpath(File.dirname(@options[:save_db]))
34
+ connect_string = 'sqlite://%s' % @options[:save_db]
35
+ end
19
36
 
37
+ @database = Sequel.connect(connect_string, @sql_options)
20
38
  @dataset = @database[:cablingdatas]
21
- end
22
39
 
23
- def final_key(key)
24
- unless @prefix_stack.empty?
25
- @prefix_stack.push(key)
26
- key = nil
27
- end
40
+ @group_stack = [ ]
41
+ @prefix_stack = [ ]
28
42
 
29
- key ||= @prefix_stack.join('.')
43
+ self
30
44
  end
31
45
 
32
- def set(key, value, group = nil)
33
- group ||= @group
34
- key = final_key(key)
46
+ def prepare_for_use
47
+ prepare_table
48
+ end
35
49
 
36
- @dataset.insert(:key => key, :value => value, :group => group)
50
+ def group(group, &block)
51
+ @group_stack.push(group.to_s)
52
+
53
+ if block_given?
54
+ begin
55
+ @database.transaction do
56
+ yield
57
+ end
58
+ ensure
59
+ @group_stack.pop
60
+ end
61
+ end
37
62
 
38
- stack_pop
63
+ group
39
64
  end
40
65
 
41
- def delete_key(key, group = nil)
42
- group ||= @group
43
-
44
- key = final_key(key)
66
+ def globals(&block)
67
+ group(GLOBAL_GROUP, &block)
68
+ end
45
69
 
46
- @dataset.filter(:key => key, :group => group).delete
47
- stack_pop
70
+ def prefix(prefix, &block)
71
+ @prefix_stack.push(prefix)
72
+ yield
73
+ ensure
74
+ @prefix_stack.pop
48
75
  end
49
76
 
50
- def update(key, value, group = nil)
51
- group ||= @group
52
- key = final_key(key)
77
+ def final_key(key, group)
78
+ if key =~ /^([A-Za-z0-9\_]*)\:([A-Za-z0-9\_\-\.]+)$/
79
+ group = $~[1]
80
+ key = $~[2]
81
+ else
82
+ group = @group_stack.last if group.nil?
53
83
 
54
- @dataset.filter(:key => key, :group => group).update(:value => value)
84
+ unless @prefix_stack.empty?
85
+ key = (@prefix_stack + [ key ]).join('.')
86
+ end
87
+ end
55
88
 
56
- stack_pop
89
+ [ key, group ]
57
90
  end
58
91
 
59
- def group(group = nil, &block)
60
- @group = group
92
+ def final_value(group, key, value)
93
+ val_key = '%s:%s' % [ group, key ]
61
94
 
62
- @database.transaction do
63
- yield
64
- end
95
+ g = @cabler.values.fetch(group, { })
96
+ g.fetch(key, value)
65
97
  end
66
98
 
67
- def globals(&block)
68
- @group = "globals"
99
+ def set(key, value, group = nil)
100
+ key, group = final_key(key, group)
101
+ value = final_value(group, key, value)
69
102
 
70
- @database.transaction do
71
- yield
103
+ if @dataset.where(:key => key, :group => group).count > 0
104
+ @dataset.filter(:key => key, :group => group).update(:value => value)
105
+ else
106
+ @dataset.insert(:key => key, :group => group, :value => value)
72
107
  end
73
108
  end
74
109
 
75
- def prefix(prefix, &block)
76
- @prefix_stack.push(prefix)
77
- yield
110
+ def update(key, value, group = nil)
111
+ key, group = final_key(key, group)
112
+ value = final_value(group, key, value)
78
113
 
79
- stack_pop
114
+ @dataset.filter(:key => key, :group => group).update(:value => value)
80
115
  end
81
116
 
82
- def stack_pop
83
- @prefix_stack.pop
117
+ def delete_key(key, group = nil)
118
+ key, group = final_key(key, group)
119
+
120
+ @dataset.filter(:key => key, :group => group).delete
84
121
  end
85
122
 
86
- def has_key?(key, group)
87
- group ||= @cabler.group.to_s
123
+ def has_key?(key, group = nil)
124
+ key, group = final_key(key, group)
88
125
 
89
126
  val = @dataset.where(:key => key, :group => group).count
90
-
91
127
  if val == 0
92
- val = @dataset.where(:key => key, :group => "globals").count
93
-
128
+ val = @dataset.where(:key => key, :group => GLOBAL_GROUP).count
94
129
  val == 0 ? false : true
95
130
  else
96
131
  true
@@ -98,35 +133,31 @@ module Palmade::Cableguy
98
133
  end
99
134
 
100
135
  def get(key, group = nil)
101
- group ||= @cabler.group.to_s
136
+ key, group = final_key(key, group)
102
137
 
103
138
  val = @dataset.where(:key => key, :group => group)
104
-
105
139
  if val.empty?
106
- val = @dataset.where(:key => key, :group => "globals")
140
+ val = @dataset.where(:key => key, :group => GLOBAL_GROUP)
107
141
  end
108
142
 
109
143
  if val.count > 0
110
144
  val.first[:value]
111
145
  else
112
- raise "key \'#{key}\' cannot be found!"
146
+ raise "key \'%s\' cannot be found!" % key
113
147
  end
114
148
  end
115
149
 
116
150
  def get_if_key_exists(key, group = nil)
117
- group ||= @cabler.group.to_s
118
-
119
151
  get(key, group) if has_key?(key, group)
120
152
  end
121
153
 
122
154
  def get_children(key, group = nil)
123
- group ||= @cabler.group.to_s
124
- values = []
125
-
126
- res = @dataset.where(:key.like("#{key}%"), :group => group)
155
+ key, group = final_key(key, group)
127
156
 
157
+ values = [ ]
158
+ res = @dataset.where(Sequel.like(:key, "#{key}%"), :group => group)
128
159
  if res.empty?
129
- res = @dataset.where(:key.like("#{key}%"), :group => "globals")
160
+ res = @dataset.where(Sequel.like(:key, "#{key}%"), :group => GLOBAL_GROUP)
130
161
  end
131
162
 
132
163
  key = key.split('.')
@@ -140,19 +171,37 @@ module Palmade::Cableguy
140
171
  if values.count > 0
141
172
  values & values
142
173
  else
143
- raise "no values for \'#{key}\'!"
174
+ raise "no values for \'%s\'!" % key
144
175
  end
145
176
  end
146
177
 
147
- def create_table_if_needed
148
- if @database.tables.include? :cablingdatas
149
- @database.drop_table :cablingdatas
178
+ def empty?
179
+ !@database.tables.include?(:cablingdatas) || @dataset.count == 0
180
+ end
181
+
182
+ def migrated?
183
+ @migrated == true
184
+ end
185
+
186
+ def migrated!
187
+ @migrated = true
188
+ end
189
+
190
+ def reset
191
+ if @database.tables.include?(:cablingdatas)
192
+ @dataset.truncate
150
193
  end
151
194
 
152
- @database.create_table :cablingdatas do
153
- String :key
154
- String :value
155
- String :group
195
+ @migrated = false
196
+ end
197
+
198
+ def prepare_table
199
+ unless @database.tables.include?(:cablingdatas)
200
+ @database.create_table(:cablingdatas) do
201
+ String :key
202
+ String :value
203
+ String :group
204
+ end
156
205
  end
157
206
  end
158
207
  end
@@ -1,5 +1,5 @@
1
1
  module Palmade::Cableguy
2
- class CableConfigurator < Configurator
2
+ class LegacyConfigurator < Configurator
3
3
  attr_reader :setups
4
4
  attr_reader :requires
5
5
 
@@ -29,4 +29,3 @@ module Palmade::Cableguy
29
29
  end
30
30
  end
31
31
  end
32
-
@@ -2,91 +2,67 @@ module Palmade::Cableguy
2
2
  class Migration
3
3
  attr_reader :cabler
4
4
  attr_reader :db
5
+ attr_reader :cabling_path
5
6
 
6
- def initialize(cabler)
7
- @cabler = cabler
8
-
9
- @db = @cabler.db
10
- @cabling_path = @cabler.cabling_path
11
- @utils = Palmade::Cableguy::Utils
7
+ def self.use_klass_stack(klass_stack)
8
+ @@klass_stack = klass_stack
9
+ ret = yield
10
+ @@klass_stack = nil
11
+ klass_stack
12
12
  end
13
13
 
14
- def boot
15
- @db.create_table_if_needed
16
-
17
- file_stack = []
18
-
19
- sort_directories.each do |p|
20
- path = File.join(@cabling_path, p)
21
-
22
- if p == 'targets'
23
- if !@cabler.location.nil? && @cabler.location != @cabler.target
24
- f = File.join(path, "#{@cabler.target}_#{@cabler.location}.rb")
25
- else
26
- f = File.join(path, "#{@cabler.target}.rb")
27
- end
28
-
29
- if File.exists?(f)
30
- require f
31
- file_stack.push(f)
32
- else
33
- raise "File #{f} doesn't exist!"
34
- end
35
- elsif p == '.'
36
- if File.exist?(File.join(path, 'custom.rb'))
37
- f = Dir["#{path}/custom.rb"].shift
38
- require f
39
- file_stack.push(f)
40
- end
41
- else
42
- Dir["#{path}/*.rb"].each do |d|
43
- require d
44
- file_stack.push(d)
45
- end
46
- end
47
-
48
- file_stack.each do |f|
49
- class_name = File.basename(f).chomp(".rb")
50
- camelized_class_name = (@utils.camelize(class_name))
51
- klass = Palmade::Cableguy::Migrations.const_get(camelized_class_name)
52
- k = klass.new(@cabler)
53
- k.migrate!
54
- end
55
- file_stack.clear
14
+ def self.inherited(subclass)
15
+ if defined?(@@klass_stack) && !@@klass_stack.nil?
16
+ @@klass_stack << subclass
56
17
  end
57
18
  end
58
19
 
59
- def sort_directories
60
- dir_stack = ["base", "targets", '.']
20
+ def initialize(cabler)
21
+ @cabler = cabler
22
+ @db = cabler.db
23
+ @cabling_path = cabler.cabling_path
61
24
  end
62
25
 
63
- def migrate!
64
- raise "class #{self.class.name} doesn't have a migrate method. Override!"
65
- end
26
+ protected
66
27
 
67
28
  def set(key, value, set = nil)
68
- @db.set(key, value, set)
29
+ db.set(key, value, set)
30
+ end
31
+
32
+ def update(key, value)
33
+ db.update(key, value)
34
+ end
35
+
36
+ def get(key)
37
+ db.get(key)
69
38
  end
70
39
 
71
40
  def group(group, &block)
72
- @group = group
73
- @db.group(@group, &block)
41
+ db.group(group, &block)
74
42
  end
75
43
 
76
44
  def globals(&block)
77
- @db.globals(&block)
45
+ db.globals(&block)
78
46
  end
79
47
 
80
48
  def prefix(prefix, &block)
81
- @db.prefix(prefix, &block)
49
+ db.prefix(prefix, &block)
82
50
  end
83
51
 
84
52
  def delete_key(key, group = nil)
85
- @db.delete_key(key, group)
53
+ db.delete_key(key, group)
86
54
  end
87
55
 
88
- def update(key, value)
89
- @db.update(key, value)
56
+ def values
57
+ cabler.values
58
+ end
59
+
60
+ def pre_migrate; end
61
+
62
+ def post_migrate; end
63
+
64
+ def migrate!
65
+ raise "class %s doesn't have a migrate! method. Override!" % self.class.name
90
66
  end
91
67
  end
92
68
  end
@@ -0,0 +1,124 @@
1
+ module Palmade::Cableguy
2
+ class Migrator
3
+ attr_reader :cabler
4
+ attr_reader :db
5
+ attr_reader :cabling_path
6
+
7
+ attr_accessor :klass_stack
8
+ attr_accessor :file_stack
9
+ attr_accessor :instance_stack
10
+
11
+ DIR_TREE = [ 'base', 'targets', '.' ]
12
+
13
+ DEFAULT_OPTS = {
14
+ :unload_cabling => true
15
+ }
16
+
17
+ def self.boot(cabler, cabling_path, opts = { })
18
+ Migrator.new(cabler, cabling_path, opts).tap { |o| o.boot }
19
+ end
20
+
21
+ def initialize(cabler, cabling_path, opts = { })
22
+ @options = DEFAULT_OPTS.merge(opts)
23
+
24
+ @cabler = cabler
25
+ @db = cabler.db
26
+ @cabling_path = cabling_path
27
+
28
+ @file_stack = [ ]
29
+ @klass_stack = [ ]
30
+ @instance_stack = [ ]
31
+ end
32
+
33
+ def boot
34
+ init_file = File.join(cabling_path, 'init.rb')
35
+ require init_file if File.exist?(init_file)
36
+ end
37
+
38
+ def load_cabling
39
+ if @instance_stack.empty?
40
+ search_for_files
41
+ require_files_once
42
+ instantiate_klasses
43
+ end
44
+ end
45
+
46
+ def unload_cabling
47
+ @klass_stack.each do |k|
48
+ klass_name = k.name
49
+
50
+ knames = klass_name.split('::')
51
+ if knames.count > 1
52
+ const_name = knames.pop
53
+ parent_module = ::Object.module_eval('::%s' % knames.join('::'), __FILE__, __LINE__)
54
+ else
55
+ parent_module = ::Object
56
+ const_name = knames[0]
57
+ end
58
+
59
+ parent_module.send(:remove_const, const_name.to_sym)
60
+ end
61
+ end
62
+
63
+ def run!
64
+ load_cabling
65
+
66
+ run_all_migrations(:pre_migrate)
67
+ run_all_migrations(:migrate!)
68
+ run_all_migrations(:post_migrate)
69
+
70
+ if @options[:unload_cabling]
71
+ unload_cabling
72
+ end
73
+
74
+ self
75
+ end
76
+
77
+ protected
78
+
79
+ def instantiate_klasses
80
+ @klass_stack.each do |klass|
81
+ @instance_stack << klass.new(cabler)
82
+ end
83
+ end
84
+
85
+ def run_all_migrations(migration)
86
+ @instance_stack.each do |i|
87
+ i.send(migration)
88
+ end
89
+ end
90
+
91
+ def require_files_once
92
+ Palmade::Cableguy::Migration.use_klass_stack(@klass_stack) do
93
+ file_stack.each { |file| load(file) }
94
+ end
95
+ end
96
+
97
+ def directory_tree; DIR_TREE; end
98
+
99
+ def search_for_files
100
+ directory_tree.each do |child|
101
+ path = File.join(cabling_path, child)
102
+
103
+ case child
104
+ when 'targets'
105
+ if !cabler.location.nil? && !cabler.location.empty? && cabler.location != cabler.target
106
+ file = File.join(path, '%s_%s.rb' % [ cabler.target, cabler.location ])
107
+ else
108
+ file = File.join(path, '%s.rb' % cabler.target)
109
+ end
110
+
111
+ if File.exists?(file)
112
+ file_stack.push(file)
113
+ end
114
+ when '.'
115
+ if File.exist?(File.join(path, 'custom.rb'))
116
+ file_stack.push(Dir['%s/custom.rb' % path].shift)
117
+ end
118
+ else
119
+ Dir['%s/*.rb' % path].each { |file| file_stack.push(file) }
120
+ end
121
+ end
122
+ end
123
+ end
124
+ end
@@ -2,7 +2,6 @@ module Palmade::Cableguy
2
2
  class TemplateBinding
3
3
  attr_reader :cable
4
4
  attr_reader :cabler
5
- attr_reader :cabling
6
5
  attr_reader :arg_hash
7
6
  attr_reader :target
8
7
  attr_reader :location
@@ -10,20 +9,26 @@ module Palmade::Cableguy
10
9
  attr_reader :reserved_keys
11
10
  attr_accessor :output_buffer
12
11
 
13
- def initialize(cable, cabler, cabling, target)
12
+ def self.require_erb
13
+ require 'erb'
14
+ end
15
+
16
+ def initialize(cable, cabler)
14
17
  @cable = cable
15
18
  @cabler = cabler
16
- @cabling = cabling
17
- @target = target
19
+
20
+ @target = @cabler.target
18
21
  @location = @cabler.location
22
+
19
23
  @arg_hash = @cable.args[2]
20
24
  @db = @cabler.db
21
- @key_prefix = []
22
- @reserved_keys = ['target', 'location']
25
+ @key_prefix = [ ]
26
+
27
+ @reserved_keys = ['target', 'location', 'cabler']
23
28
  end
24
29
 
25
30
  def join_keys(key)
26
- "#{@key_prefix.join('.')}.#{key}"
31
+ '%s.%s' % [ @key_prefix.join('.'), key ]
27
32
  end
28
33
 
29
34
  def has_key?(key, group = nil)
@@ -84,24 +89,27 @@ module Palmade::Cableguy
84
89
  end
85
90
 
86
91
  def parse(file_path)
87
- Palmade::Cableguy.require_erb
88
- fcontents = File.read(file_path)
92
+ self.class.require_erb
89
93
 
94
+ fcontents = File.read(file_path)
90
95
  parsed = ERB.new(fcontents, nil, "-%>", "@output_buffer").result(binding)
91
- parsed = special_parse(parsed, [ '{', '}' ], false)
96
+ parsed = special_parse(parsed)
92
97
  end
93
98
 
94
99
  def special_parse(parsed, delim = [ '{', '}' ], cabling_only = false)
95
- delim0 = "\\#{delim[0]}"
96
- delim1 = "\\#{delim[1]}"
100
+ delim0 = "\\%s" % delim[0]
101
+ delim1 = "\\%s" % delim[1]
97
102
 
98
- parsed = parsed.gsub(/#{delim0}(.+)#{delim1}/) do |match|
99
- found = $1
103
+ holders_re = '%s(([A-Za-z0-9\_]+)\:)?([A-Za-z0-9\.\_\-]+)%s' % [ delim0, delim1 ]
104
+
105
+ parsed = parsed.gsub(/#{holders_re}/) do |match|
106
+ group = $2
107
+ found = $3
100
108
 
101
109
  if @reserved_keys.include?(found)
102
110
  eval_ret = self.send(found)
103
111
  else
104
- eval_ret = get(found)
112
+ eval_ret = get(found, group)
105
113
  end
106
114
  end
107
115
  end
@@ -134,4 +142,3 @@ module Palmade::Cableguy
134
142
  end
135
143
  end
136
144
  end
137
-