riml 0.2.4 → 0.2.5

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/bin/riml CHANGED
@@ -38,11 +38,19 @@ module Riml
38
38
  append_filenames_to_list_if_all_exist(options.check_syntax_files, *filenames)
39
39
  end
40
40
 
41
- opts.on("-t", "--source-path PATH", "Path riml uses for `riml_source` and `riml_include` to find files. Defaults to pwd.") do |path|
42
- if Dir.exists?(path)
41
+ opts.on("-S", "--source-path PATH", "Colon-separated path riml uses to find files for `riml_source`. Defaults to pwd.") do |path|
42
+ begin
43
43
  Riml.source_path = path
44
- else
45
- abort "Couldn't find directory #{path.inspect}."
44
+ rescue UserArgumentError => e
45
+ abort e.message
46
+ end
47
+ end
48
+
49
+ opts.on("-I", "--include-path PATH", "Colon-separated path riml uses to find files for `riml_include`. Defaults to pwd.") do |path|
50
+ begin
51
+ Riml.include_path = path
52
+ rescue UserArgumentError => e
53
+ abort e.message
46
54
  end
47
55
  end
48
56
 
@@ -72,10 +80,11 @@ module Riml
72
80
 
73
81
  def self.append_filenames_to_list_if_all_exist(list, *filenames)
74
82
  filenames.each do |fname|
75
- if File.exists?(fname)
83
+ expanded = File.expand_path(fname)
84
+ if File.exists?(expanded)
76
85
  list << fname
77
86
  else
78
- abort "Couldn't find file #{fname.inspect}."
87
+ raise UserArgumentError, "Couldn't find file #{fname.inspect}."
79
88
  end
80
89
  end
81
90
  end
data/lib/ast_rewriter.rb CHANGED
@@ -68,7 +68,7 @@ module Riml
68
68
  old_ast = ast
69
69
  ast.children.each do |node|
70
70
  next unless RimlCommandNode === node && node.name == 'riml_include'
71
- node.each_existing_file! do |file|
71
+ node.each_existing_file! do |file, fullpath|
72
72
  if from_file && @included_file_refs[file] == from_file
73
73
  msg = "#{from_file.inspect} can't include #{file.inspect}, as " \
74
74
  " #{file.inspect} already included #{from_file.inspect}"
@@ -77,8 +77,7 @@ module Riml
77
77
  raise UserArgumentError, "#{file.inspect} can't include itself"
78
78
  end
79
79
  @included_file_refs[from_file] = file
80
- full_path = File.join(Riml.source_path, file)
81
- riml_src = File.read(full_path)
80
+ riml_src = File.read(fullpath)
82
81
  # recursively parse included files with this ast_rewriter in order
83
82
  # to pick up any classes that are defined there
84
83
  rewritten_ast = Parser.new.parse(riml_src, self, file)
data/lib/compiler.rb CHANGED
@@ -557,8 +557,8 @@ module Riml
557
557
  def compile(node)
558
558
  if node.name == 'riml_source'
559
559
  node.name = 'source'
560
- node.each_existing_file! do |file|
561
- root_node(node).current_compiler.compile_queue << file
560
+ node.each_existing_file! do |basename, full_path|
561
+ root_node(node).current_compiler.compile_queue << full_path
562
562
  end
563
563
  elsif node.name == 'riml_include'
564
564
  # riml_include has to be top-level
@@ -566,10 +566,9 @@ module Riml
566
566
  error_msg = %Q(riml_include error, has to be called at top-level)
567
567
  raise IncludeNotTopLevel, error_msg
568
568
  end
569
- node.each_existing_file! do |file|
570
- full_path = File.join(Riml.source_path, file)
569
+ node.each_existing_file! do |basename, full_path|
571
570
  riml_src = File.read(full_path)
572
- node.compiled_output << root_node(node).current_compiler.compile_include(riml_src, file)
571
+ node.compiled_output << root_node(node).current_compiler.compile_include(riml_src, basename)
573
572
  end
574
573
  return node.compiled_output
575
574
  end
data/lib/nodes.rb CHANGED
@@ -355,26 +355,38 @@ module Riml
355
355
  end
356
356
  end
357
357
 
358
+ # yields full file path for each existing file found in Riml.source_path
358
359
  def each_existing_file!
359
- files = []
360
+ files = {}
360
361
  arguments.map(&:value).each do |file|
361
- if File.exists?(File.join(Riml.source_path, file))
362
- files << file
362
+ if base_path = paths.detect do |path|
363
+ full = File.join(path, file)
364
+ File.exists?(full)
365
+ end
366
+ files[file] = File.join(base_path, file)
363
367
  else
364
368
  raise Riml::FileNotFound, "#{file.inspect} could not be found in " \
365
- "source path (#{Riml.source_path.inspect})"
369
+ "#{name.upcase}_PATH (#{paths.join(':').inspect})"
366
370
  end
367
371
  end
368
- return unless block_given?
372
+ return files.values unless block_given?
369
373
  # all files exist
370
- files.each do |f|
374
+ files.each do |basename, full_path|
371
375
  begin
372
- yield f
376
+ yield basename, full_path
373
377
  rescue Riml::IncludeFileLoop
374
- arguments.delete_if { |arg| arg.value == f }
378
+ arguments.delete_if { |arg| arg.value == basename }
375
379
  end
376
380
  end
377
381
  end
382
+
383
+ def paths
384
+ if name == 'riml_include'
385
+ Riml.include_path
386
+ else
387
+ Riml.source_path
388
+ end
389
+ end
378
390
  end
379
391
 
380
392
  class OperatorNode < Struct.new(:operator, :operands)
data/lib/riml.rb CHANGED
@@ -1,3 +1,5 @@
1
+ require 'pathname'
2
+
1
3
  require File.expand_path('../environment', __FILE__)
2
4
  require 'nodes'
3
5
  require 'lexer'
@@ -12,11 +14,11 @@ module Riml
12
14
  end
13
15
 
14
16
  # parse code (or tokens) into nodes
15
- def self.parse(input, ast_rewriter = AST_Rewriter.new)
17
+ def self.parse(input, ast_rewriter = AST_Rewriter.new, filename = nil)
16
18
  unless input.is_a?(Array) || input.is_a?(String)
17
19
  raise ArgumentError, "input must be tokens or code, is #{input.class}"
18
20
  end
19
- Parser.new.parse(input, ast_rewriter)
21
+ Parser.new.parse(input, ast_rewriter, filename)
20
22
  end
21
23
 
22
24
  # compile nodes (or tokens or code or file) into output code
@@ -27,7 +29,7 @@ module Riml
27
29
  nodes = parser.parse(input)
28
30
  elsif input.is_a?(File)
29
31
  source = input.read
30
- nodes = parser.parse(source)
32
+ nodes = parser.parse(source, AST_Rewriter.new, input.path)
31
33
  else
32
34
  raise ArgumentError, "input must be nodes, tokens, code or file, is #{input.class}"
33
35
  end
@@ -74,10 +76,19 @@ module Riml
74
76
  end
75
77
 
76
78
  def self.source_path
77
- @source_path ||= Dir.getwd
79
+ get_path(:source_path)
78
80
  end
81
+
79
82
  def self.source_path=(path)
80
- @source_path = path
83
+ set_path(:source_path, path)
84
+ end
85
+
86
+ def self.include_path
87
+ get_path(:include_path)
88
+ end
89
+
90
+ def self.include_path=(path)
91
+ set_path(:include_path, path)
81
92
  end
82
93
 
83
94
  def self.warn(warning)
@@ -103,6 +114,32 @@ module Riml
103
114
  @warning_buffer ||= WarningBuffer.new
104
115
  end
105
116
 
117
+ def self.set_path(name, path)
118
+ return instance_variable_set("@#{name}", nil) if path.nil?
119
+ path = path.split(':') if path.is_a?(String)
120
+ path.each do |dir|
121
+ unless Dir.exists?(dir)
122
+ raise UserArgumentError, "Error trying to set #{name.to_s}. " \
123
+ "Directory #{dir.inspect} doesn't exist"
124
+ end
125
+ end
126
+ instance_variable_set("@#{name}", path)
127
+ end
128
+ self.source_path = nil # eliminate ivar warnings
129
+ self.include_path = nil # eliminate ivar warnings
130
+
131
+ def self.get_path(name)
132
+ ivar = instance_variable_get("@#{name}")
133
+ return ivar if ivar
134
+ # RIML_INCLUDE_PATH or RIML_SOURCE_PATH
135
+ val = if (path = ENV["RIML_#{name.to_s.upcase}"])
136
+ path
137
+ else
138
+ [Dir.getwd]
139
+ end
140
+ set_path(name, val)
141
+ end
142
+
106
143
  def self.threaded_compile_files(*filenames)
107
144
  threads = []
108
145
  filenames.each do |fname|
@@ -116,10 +153,10 @@ module Riml
116
153
 
117
154
  # This is for when another file is sourced within a file we're compiling.
118
155
  def self.process_compile_queue!(compiler)
119
- while filename = compiler.compile_queue.shift
120
- unless compiler.sourced_files_compiled.include?(filename)
121
- compiler.sourced_files_compiled << filename
122
- compile(File.open(File.join(Riml.source_path, filename)), compiler.parser, compiler)
156
+ while full_path = compiler.compile_queue.shift
157
+ unless compiler.sourced_files_compiled.include?(full_path)
158
+ compiler.sourced_files_compiled << full_path
159
+ compile(File.open(full_path), compiler.parser, compiler)
123
160
  end
124
161
  end
125
162
  end
@@ -128,11 +165,16 @@ module Riml
128
165
  INCLUDE_COMMENT_FMT = File.read(File.expand_path("../included.vim", __FILE__))
129
166
 
130
167
  def self.write_file(output, fname)
131
- file_basename = File.basename(fname)
132
- unless File.extname(file_basename).empty?
133
- file_basename = file_basename.split(".").tap {|parts| parts.pop}.join(".")
168
+ # absolute path, output into same directory as file
169
+ dir = if fname[0] == File::SEPARATOR
170
+ Pathname.new(fname).parent.to_s
171
+ # relative path, output into current working directory
172
+ else
173
+ Dir.getwd
134
174
  end
135
- File.open("#{file_basename}.vim", 'w') do |f|
175
+ basename_without_riml_ext = File.basename(fname).sub(/\.riml\Z/i, '')
176
+ full_path = File.join(dir, "#{basename_without_riml_ext}.vim")
177
+ File.open(full_path, 'w') do |f|
136
178
  f.write FILE_HEADER + output
137
179
  end
138
180
  end
data/version.rb CHANGED
@@ -1,4 +1,4 @@
1
1
  module Riml
2
- # last changed: Apr. 21, 2013
3
- VERSION = [0,2,4]
2
+ # last changed: Apr. 28, 2013
3
+ VERSION = [0,2,5]
4
4
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: riml
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.4
4
+ version: 0.2.5
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-04-22 00:00:00.000000000 Z
12
+ date: 2013-04-28 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: racc