QaDeS-lax 0.0.1
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/README.rdoc +39 -0
- data/Rakefile +51 -0
- data/bin/lax +6 -0
- data/lib/lax.rb +132 -0
- data/test/test.rb +0 -0
- metadata +60 -0
data/README.rdoc
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
= Lax
|
2
|
+
|
3
|
+
Lax is a Ruby preprocessor for enabling a relaxed and more concise syntax: You can omit the keywords <tt>do</tt> and <tt>end</tt>.
|
4
|
+
To get Lax to work in your code, you have to <tt>require</tt> Lax and then load your <tt>.rbl</tt> code.
|
5
|
+
|
6
|
+
Example:
|
7
|
+
<tt>test.rb</tt>
|
8
|
+
require 'rubygems'
|
9
|
+
require 'lax'
|
10
|
+
|
11
|
+
require 'rbltest'
|
12
|
+
# or: load 'rbltest.rbl'
|
13
|
+
|
14
|
+
<tt>rbltest.rbl</tt>
|
15
|
+
lines = <<END
|
16
|
+
one
|
17
|
+
two
|
18
|
+
three
|
19
|
+
END
|
20
|
+
|
21
|
+
lines.each |line|
|
22
|
+
if line.match /t/
|
23
|
+
puts line
|
24
|
+
else
|
25
|
+
puts "-" + line
|
26
|
+
|
27
|
+
|
28
|
+
== Executable
|
29
|
+
Lax also includes an executable which lets you preprocess single <tt>.rbl</tt> files.
|
30
|
+
|
31
|
+
Example:
|
32
|
+
lax rbltest.rbl
|
33
|
+
|
34
|
+
|
35
|
+
== Disclaimer
|
36
|
+
This project is *not* meant to propagate pythonic syntax or spark another "indentation as syntax" war.
|
37
|
+
It was purely born out of pure laziness, as I got tired of searching missing <tt>do</tt>s and <tt>end</tt>s
|
38
|
+
in my code.
|
39
|
+
Lax was derived from <tt>pyrb.rb</tt> at http://xtargets.com/snippets/posts/show/68.
|
data/Rakefile
ADDED
@@ -0,0 +1,51 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake'
|
3
|
+
load 'lax.gemspec'
|
4
|
+
|
5
|
+
|
6
|
+
# ----- Packaging -----
|
7
|
+
|
8
|
+
require 'rake/gempackagetask'
|
9
|
+
|
10
|
+
Rake::GemPackageTask.new(LaxSpec) do |pkg|
|
11
|
+
end
|
12
|
+
|
13
|
+
desc "Install Lax as a gem."
|
14
|
+
task :install => [:package] do
|
15
|
+
sudo = RUBY_PLATFORM =~ /win32/ ? '' : 'sudo'
|
16
|
+
sh %{#{sudo} gem install --no-ri pkg/#{NAME}-#{GEM_VERSION}}
|
17
|
+
end
|
18
|
+
|
19
|
+
# ----- Documentation -----
|
20
|
+
|
21
|
+
require 'rake/rdoctask'
|
22
|
+
|
23
|
+
Rake::RDocTask.new do |rdoc|
|
24
|
+
rdoc.title = 'Lax'
|
25
|
+
rdoc.options << '--line-numbers' << '--inline-source'
|
26
|
+
rdoc.rdoc_files.include(*FileList.new('*') do |list|
|
27
|
+
list.exclude(/(^|[^.a-z])[a-z]+/)
|
28
|
+
list.exclude('TODO')
|
29
|
+
end.to_a)
|
30
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
31
|
+
rdoc.rdoc_files.exclude('TODO')
|
32
|
+
rdoc.rdoc_dir = 'rdoc'
|
33
|
+
rdoc.main = 'README.rdoc'
|
34
|
+
end
|
35
|
+
|
36
|
+
# ----- Coverage -----
|
37
|
+
|
38
|
+
begin
|
39
|
+
require 'rcov/rcovtask'
|
40
|
+
|
41
|
+
Rcov::RcovTask.new do |t|
|
42
|
+
t.test_files = FileList['test/test.rb']
|
43
|
+
t.rcov_opts << '-x' << '"^\/"'
|
44
|
+
if ENV['NON_NATIVE']
|
45
|
+
t.rcov_opts << "--no-rcovrt"
|
46
|
+
end
|
47
|
+
t.verbose = true
|
48
|
+
end
|
49
|
+
rescue LoadError; end
|
50
|
+
|
51
|
+
|
data/bin/lax
ADDED
data/lib/lax.rb
ADDED
@@ -0,0 +1,132 @@
|
|
1
|
+
module Lax
|
2
|
+
EXT_LAX_ONLY = [ '.rbl' ].freeze
|
3
|
+
EXT_ALL = (EXT_LAX_ONLY + [ '.rb', '.rbw' ]).freeze
|
4
|
+
extensions = EXT_LAX_ONLY
|
5
|
+
|
6
|
+
def self.extensions= value
|
7
|
+
@extensions = value
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.extensions
|
11
|
+
@extensions
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.find_file(path, extensions = [''])
|
15
|
+
$:.each do |search_path|
|
16
|
+
search_path = File.join(search_path, path)
|
17
|
+
for ext in extensions do
|
18
|
+
p = path + ext
|
19
|
+
return p if FileTest.exist?(p)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.load(file)
|
25
|
+
return false if not (file and extensiond.member? File.extname(file))
|
26
|
+
|
27
|
+
txt = Lax.convert(file)
|
28
|
+
Object.module_eval txt, file, 1
|
29
|
+
true
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.convert(file)
|
33
|
+
txt = ""
|
34
|
+
stack = []
|
35
|
+
lines = File.open(file).readlines
|
36
|
+
|
37
|
+
indents = lines.collect do |l|
|
38
|
+
if l.match(/^\s+$/) # empty line
|
39
|
+
-1
|
40
|
+
else
|
41
|
+
m = l.match(/^(\s+)/)
|
42
|
+
last_indent = m ? m[1].gsub(/\t/, ' ').length : 0
|
43
|
+
end
|
44
|
+
end
|
45
|
+
indents << 0 # just append one "empty line" for the readahead
|
46
|
+
|
47
|
+
wait_for = nil
|
48
|
+
lines.each_with_index do |l, index|
|
49
|
+
if wait_for
|
50
|
+
txt << l
|
51
|
+
wait_for = nil if l.match(wait_for)
|
52
|
+
next
|
53
|
+
end
|
54
|
+
|
55
|
+
# lookahead to find needed ends early
|
56
|
+
indent = indents[index..-1].detect{|i| i > -1}
|
57
|
+
actual_line = lines[index..-1].detect{|line| not line.match /^\s*$/ }
|
58
|
+
next_indent = indents[(index+1)..-1].detect{|i| i > -1}
|
59
|
+
|
60
|
+
# detect needed ends
|
61
|
+
stack.reverse.each do |pindent|
|
62
|
+
if indent <= pindent
|
63
|
+
m = actual_line.match(/^(\s*)(else|end|rescue)/)
|
64
|
+
if (not m) or indent != pindent
|
65
|
+
txt << (" " * pindent) + "end\n"
|
66
|
+
end
|
67
|
+
stack.pop
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
if (indent < next_indent) and (indent != stack.last)
|
72
|
+
block_match = l.match(/<<(\w+)\s*$/)
|
73
|
+
if block_match
|
74
|
+
wait_for = /^#{block_match.captures[0]}\s*$/
|
75
|
+
else
|
76
|
+
# possibly we need to insert a "do"
|
77
|
+
m = l.match /^\s*(module|class|def|begin|for|while|if|unless|else|rescue)/
|
78
|
+
l.sub!(/( do)?(\s*\|.*\|)?(\s*)$/, ' do\2\3') unless m
|
79
|
+
stack.push indent
|
80
|
+
end
|
81
|
+
end
|
82
|
+
txt << l
|
83
|
+
end
|
84
|
+
|
85
|
+
while not stack.empty?
|
86
|
+
txt << (" " * stack.pop) + "end\n"
|
87
|
+
end
|
88
|
+
|
89
|
+
txt
|
90
|
+
end
|
91
|
+
|
92
|
+
def self.main
|
93
|
+
infile = ARGV[0]
|
94
|
+
unless infile
|
95
|
+
puts "Usage: lax <file.rbl>"
|
96
|
+
return
|
97
|
+
end
|
98
|
+
|
99
|
+
puts convert(infile)
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
module Kernel
|
104
|
+
req = respond_to?(:gem_original_require) ? 'gem_original_require' : 'require'
|
105
|
+
module_eval <<END
|
106
|
+
alias lax_original_require #{req}
|
107
|
+
def #{req}(path)
|
108
|
+
lax_require path
|
109
|
+
end
|
110
|
+
END
|
111
|
+
|
112
|
+
alias lax_original_load load
|
113
|
+
def load(path)
|
114
|
+
file = Lax.find_file(path)
|
115
|
+
Lax.load(file) || lax_original_load(path)
|
116
|
+
end
|
117
|
+
|
118
|
+
private
|
119
|
+
def lax_require(path)
|
120
|
+
return false if $".include? path
|
121
|
+
|
122
|
+
file = Lax.find_file(path, Lax.extensions)
|
123
|
+
if Lax.load(file)
|
124
|
+
$" << path
|
125
|
+
return true
|
126
|
+
else
|
127
|
+
lax_original_require path
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
end
|
132
|
+
|
data/test/test.rb
ADDED
File without changes
|
metadata
ADDED
@@ -0,0 +1,60 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: QaDeS-lax
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Michael Klaus
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2008-12-27 00:00:00 -08:00
|
13
|
+
default_executable:
|
14
|
+
dependencies: []
|
15
|
+
|
16
|
+
description: Lax is a preprocessor to relax Ruby syntax.
|
17
|
+
email: Michael.Klaus@gmx.net
|
18
|
+
executables:
|
19
|
+
- lax
|
20
|
+
extensions: []
|
21
|
+
|
22
|
+
extra_rdoc_files: []
|
23
|
+
|
24
|
+
files:
|
25
|
+
- Rakefile
|
26
|
+
- README.rdoc
|
27
|
+
- lib/lax.rb
|
28
|
+
has_rdoc: true
|
29
|
+
homepage: http://github.com/QaDeS/lax
|
30
|
+
post_install_message:
|
31
|
+
rdoc_options:
|
32
|
+
- --title
|
33
|
+
- Lax
|
34
|
+
- --main
|
35
|
+
- README.rdoc
|
36
|
+
- --line-numbers
|
37
|
+
- --inline-source
|
38
|
+
require_paths:
|
39
|
+
- lib
|
40
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
41
|
+
requirements:
|
42
|
+
- - ">="
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
version: "0"
|
45
|
+
version:
|
46
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
47
|
+
requirements:
|
48
|
+
- - ">="
|
49
|
+
- !ruby/object:Gem::Version
|
50
|
+
version: "0"
|
51
|
+
version:
|
52
|
+
requirements: []
|
53
|
+
|
54
|
+
rubyforge_project:
|
55
|
+
rubygems_version: 1.2.0
|
56
|
+
signing_key:
|
57
|
+
specification_version: 2
|
58
|
+
summary: A preprocessor to relax Ruby's syntax.
|
59
|
+
test_files:
|
60
|
+
- test/test.rb
|