meta_code_commenter 0.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,5 @@
1
+ doc
2
+ pkg
3
+ coverage
4
+ tags
5
+ *.gemspec
data/.watchr ADDED
@@ -0,0 +1,21 @@
1
+
2
+ def run(*args)
3
+ system "ruby -rubygems -Ilib:test #{args.join(' ')}"
4
+ end
5
+
6
+ def run_tests
7
+ system "rake test"
8
+ end
9
+
10
+ def underscore(file)
11
+ file.gsub('/', '_')
12
+ end
13
+
14
+ watch('test/test_.*\.rb') {|md| run md[0] }
15
+ watch('lib/(.*)\.rb') { run_tests }
16
+ watch('test/helper.rb') { run_tests }
17
+
18
+ run_tests
19
+
20
+ Signal.trap("QUIT") { abort("\n") }
21
+ Signal.trap("INT") { run_tests }
@@ -0,0 +1,62 @@
1
+ = Meta code commenter (mcc)
2
+
3
+ Comments your meta code.
4
+
5
+ == Usage
6
+
7
+ require 'mcc'
8
+
9
+ params = ARGV.inject({}) do |hash, arg|
10
+ key, value = arg.split(/=/)
11
+ hash[key] = value
12
+ hash
13
+ end
14
+
15
+ puts MetaCodeCommenter.comment(STDIN.readlines)
16
+
17
+ === Command line
18
+
19
+ $ mcc key1=value key2=value < my_meta_code
20
+
21
+ === Example
22
+
23
+ $ cat code
24
+ def #{name}(proc=nil, &blk)
25
+ proc ||= blk
26
+ @#{name} = Proc.new do |ptr,data,len|
27
+ if data
28
+ proc.call(data.get_string(0, len))
29
+ else
30
+ proc.call
31
+ end
32
+ @abort ? 1 : 0
33
+ end
34
+ @parser[:#{name}] = @#{name}
35
+ end
36
+
37
+ $ mcc name=on_headers < code
38
+ def #{name}(proc=nil, &blk) # def name(proc=nil, &blk)
39
+ proc ||= blk # proc ||= blk
40
+ @#{name} = Proc.new do |ptr,data,len| # @name = Proc.new do |ptr,data,len|
41
+ if data # if data
42
+ proc.call(data.get_string(0, len)) # proc.call(data.get_string(0, len))
43
+ else # else
44
+ proc.call # proc.call
45
+ end # end
46
+ @abort ? 1 : 0 # @abort ? 1 : 0
47
+ end # end
48
+ @parser[:#{name}] = @#{name} # @parser[:name] = @name
49
+ end # end
50
+
51
+ == Installation (not yet)
52
+
53
+ gem install meta_code_commenter
54
+
55
+ == Authors
56
+
57
+ * Peter Suschlik
58
+
59
+ == TODO
60
+
61
+ * Fix failing test (double quotes don't work yet)
62
+ * Use thor or something or mcc
@@ -0,0 +1,57 @@
1
+ require 'rake'
2
+
3
+ begin
4
+ require 'jeweler'
5
+ Jeweler::Tasks.new do |gem|
6
+ gem.name = "meta_code_commenter"
7
+ gem.summary = 'Comments your meta code'
8
+ gem.email = "peter-mcc@suschlik.de"
9
+ gem.homepage = "http://github.com/splattael/meta_code_commenter"
10
+ gem.authors = ["Peter Suschlik"]
11
+
12
+ gem.has_rdoc = true
13
+ gem.extra_rdoc_files = [ "README.rdoc" ]
14
+
15
+ gem.add_development_dependency "riot"
16
+ gem.add_development_dependency "riot_notifier"
17
+
18
+ gem.test_files = Dir.glob('test/test_*.rb')
19
+ end
20
+ Jeweler::GemcutterTasks.new
21
+ rescue LoadError
22
+ puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
23
+ end
24
+
25
+ # Test
26
+ require 'rake/testtask'
27
+ desc 'Default: run unit tests.'
28
+ task :default => :test
29
+ task :test => :check_dependencies
30
+
31
+ Rake::TestTask.new(:test) do |test|
32
+ test.test_files = FileList.new('test/test_*.rb')
33
+ test.libs << 'test'
34
+ test.verbose = true
35
+ end
36
+
37
+ # RDoc
38
+ require 'rake/rdoctask'
39
+ Rake::RDocTask.new do |rd|
40
+ rd.title = "Riot Notifier"
41
+ rd.main = "README.rdoc"
42
+ rd.rdoc_files.include("README.rdoc", "lib/*.rb")
43
+ rd.rdoc_dir = "doc"
44
+ end
45
+
46
+
47
+ # Misc
48
+ desc "Tag files for vim"
49
+ task :ctags do
50
+ dirs = $LOAD_PATH.select {|path| File.directory?(path) }
51
+ system "ctags -R #{dirs.join(" ")}"
52
+ end
53
+
54
+ desc "Find whitespace at line ends"
55
+ task :eol do
56
+ system "grep -nrE ' +$' *"
57
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.0.0
data/bin/mcc ADDED
@@ -0,0 +1,9 @@
1
+ require 'mcc'
2
+
3
+ params = ARGV.inject({}) do |hash, arg|
4
+ key, value = arg.split(/=/)
5
+ hash[key] = value
6
+ hash
7
+ end
8
+
9
+ puts MetaCodeCommenter.comment(STDIN.readlines)
@@ -0,0 +1 @@
1
+ require 'meta_code_commenter'
@@ -0,0 +1,59 @@
1
+
2
+ module MetaCodeCommenter
3
+
4
+ def self.comment(lines, params={})
5
+ lines = lines.split(/\n/) if lines.respond_to?(:to_str)
6
+ Generator.new(lines, params).to_s
7
+ end
8
+
9
+ class Evaluator
10
+ instance_methods.each {|m| undef_method m unless m =~ /^__/ }
11
+
12
+ def initialize(vars)
13
+ vars.each do |key, value|
14
+ eval <<-RUBY
15
+ def #{key}
16
+ #{value.inspect}
17
+ end
18
+ RUBY
19
+ end
20
+ end
21
+
22
+ def __eval__(line)
23
+ eval(%{"#{line}"})
24
+ end
25
+
26
+ def method_missing(method, *args, &block)
27
+ method.to_s
28
+ end
29
+ end
30
+
31
+ class Generator
32
+ include Enumerable
33
+
34
+ def initialize(lines, params={})
35
+ @lines = lines.map(&:chomp)
36
+ @evaluator = Evaluator.new(params)
37
+ @max_length = (lines.max_by(&:length) || "").length
38
+ @max_length += 1 unless @max_length % 2 != 0
39
+ @remove_spaces = @lines.map { |line| (line[/^\s+/] || "").length }.min
40
+ end
41
+
42
+ def generate(line)
43
+ pad = " " * (@max_length - line.length)
44
+ comment = " # "
45
+ evaluated = @evaluator.__eval__(line)[@remove_spaces..-1]
46
+
47
+ line + pad + comment + evaluated
48
+ end
49
+
50
+ def generate!
51
+ @lines.map { |line| generate(line) }
52
+ end
53
+
54
+ def to_s
55
+ generate!.join("\n")
56
+ end
57
+ end
58
+
59
+ end
@@ -0,0 +1,7 @@
1
+ require 'rubygems'
2
+
3
+ require 'mcc'
4
+ require 'riot'
5
+ require 'riot_notifier'
6
+
7
+ Riot.reporter = RiotNotifier
@@ -0,0 +1,56 @@
1
+ require 'helper'
2
+
3
+ class String
4
+ def deindent
5
+ gsub(/^\s*/, '')
6
+ end
7
+ end
8
+
9
+ context "Generates output" do
10
+ def asserts_output(description, input, expected, args={})
11
+ input.chomp!
12
+ expected.chomp!
13
+
14
+ asserts(description) do
15
+ MetaCodeCommenter::Generator.new(input.split(/\n/), args).to_s
16
+ end.equals(expected)
17
+ end
18
+
19
+ asserts_output("empty", <<-'IN', <<-'OUT')
20
+ IN
21
+ OUT
22
+
23
+ asserts_output("one line", <<-'IN', <<-'OUT')
24
+ hello
25
+ IN
26
+ hello # hello
27
+ OUT
28
+
29
+ asserts_output("one line interpolated", <<-'IN', <<-'OUT', :value => "world")
30
+ hello = '#{value}'
31
+ IN
32
+ hello = '#{value}' # hello = 'world'
33
+ OUT
34
+
35
+ asserts_output("align lines", <<-'IN', <<-'OUT')
36
+ def method_call
37
+ method_body
38
+ end
39
+ IN
40
+ def method_call # def method_call
41
+ method_body # method_body
42
+ end # end
43
+ OUT
44
+
45
+ # TODO is failing!
46
+ asserts_output("double quote", <<-'IN', <<-'OUT', :key => "hello", :value => "world")
47
+ def #{key}
48
+ "#{value}"
49
+ end
50
+ IN
51
+ def #{key} # def hello
52
+ "#{value}" # "world"
53
+ end # end
54
+ OUT
55
+
56
+ end
metadata ADDED
@@ -0,0 +1,83 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: meta_code_commenter
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Peter Suschlik
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-12-21 00:00:00 +01:00
13
+ default_executable: mcc
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: riot
17
+ type: :development
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: "0"
24
+ version:
25
+ - !ruby/object:Gem::Dependency
26
+ name: riot_notifier
27
+ type: :development
28
+ version_requirement:
29
+ version_requirements: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: "0"
34
+ version:
35
+ description:
36
+ email: peter-mcc@suschlik.de
37
+ executables:
38
+ - mcc
39
+ extensions: []
40
+
41
+ extra_rdoc_files:
42
+ - README.rdoc
43
+ files:
44
+ - .gitignore
45
+ - .watchr
46
+ - README.rdoc
47
+ - Rakefile
48
+ - VERSION
49
+ - bin/mcc
50
+ - lib/mcc.rb
51
+ - lib/meta_code_commenter.rb
52
+ - test/helper.rb
53
+ - test/test_meta_code_commenter.rb
54
+ has_rdoc: true
55
+ homepage: http://github.com/splattael/meta_code_commenter
56
+ licenses: []
57
+
58
+ post_install_message:
59
+ rdoc_options:
60
+ - --charset=UTF-8
61
+ require_paths:
62
+ - lib
63
+ required_ruby_version: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: "0"
68
+ version:
69
+ required_rubygems_version: !ruby/object:Gem::Requirement
70
+ requirements:
71
+ - - ">="
72
+ - !ruby/object:Gem::Version
73
+ version: "0"
74
+ version:
75
+ requirements: []
76
+
77
+ rubyforge_project:
78
+ rubygems_version: 1.3.5
79
+ signing_key:
80
+ specification_version: 3
81
+ summary: Comments your meta code
82
+ test_files:
83
+ - test/test_meta_code_commenter.rb