CoffeeTags 0.0.1.2 → 0.0.1.3

Sign up to get free protection for your applications and to get access to all the features.
data/Guardfile CHANGED
@@ -1,6 +1,6 @@
1
- guard 'rspec', :version => 2, :bundler => true, :cli => ' --color', :all_on_start => false do
1
+ guard 'rspec', :version => 2, :bundler => true, :cli => ' --color', :all_on_start =>true do
2
2
  watch(%r{^spec/(.*).rb$}) { |m| m[0] }
3
3
  watch(%r{^lib/(.*).rb$}) do |m|
4
- "spec/#{m[0].split('/').last.split('.').first}_spec.rb"
4
+ "spec/#{m[0].split('/').last.split('.').first.downcase}_spec.rb"
5
5
  end
6
6
  end
data/Rakefile CHANGED
@@ -1 +1,6 @@
1
1
  require 'bundler/gem_tasks'
2
+
3
+ task :default => [ :test ]
4
+ task :test do
5
+ STDOUT << `rspec spec/`
6
+ end
data/bin/coffeetags CHANGED
@@ -1,4 +1,8 @@
1
1
  #!/usr/bin/env ruby
2
2
  require 'CoffeeTags'
3
3
 
4
- Coffeetags::Utils.option_parser ARGV
4
+ out = Coffeetags::Utils.option_parser ARGV
5
+ if out
6
+ output, include_vars, files = out
7
+ Coffeetags::Utils.run output, include_vars, files
8
+ end
@@ -1,27 +1,23 @@
1
1
  module Coffeetags
2
2
  class Formatter
3
+ @@header = []
4
+
3
5
  def initialize file, tree =[]
4
6
  @file = file
5
7
  @tree = tree
6
8
 
7
- @header = [
8
- "!_TAG_FILE_FORMAT 2 /extended format/",
9
- "!_TAG_FILE_SORTED 0 /0=unsorted, 1=sorted, 2=foldcase/",
10
- "!_TAG_PROGRAM_AUTHOR #{Coffeetags::AUTHOR}",
11
- "!_TAG_PROGRAM_NAME #{Coffeetags::NAME} //",
12
- "!_TAG_PROGRAM_URL #{Coffeetags::URL} /GitHub repository/",
13
- "!_TAG_PROGRAM_VERSION #{Coffeetags::VERSION} //"
14
- ]
15
9
 
16
10
  @types = {
17
11
  'f' => 'type:function',
18
12
  'c' => 'type:class',
13
+ 'o' => 'type:object',
19
14
  'v' => 'type:var'
20
15
  }
21
16
  end
22
17
 
23
18
  def regex_line line
24
- "/^#{line}$/;\""
19
+ "/^#{line.gsub('/', '\/')}$/;\""
20
+ "/^#{Regexp.escape line}$/;\""
25
21
  end
26
22
 
27
23
  def line_to_string entry
@@ -41,23 +37,29 @@ module Coffeetags
41
37
 
42
38
  def parse_tree
43
39
  @lines = @tree.map do | content|
44
- line_to_string content if content[:kind] == 'f'
40
+ line_to_string content unless content[:line].nil? or content[:name].blank?
45
41
  end.reject{|l| l.nil? }
46
42
  end
47
43
 
44
+
45
+ def tags
46
+ @lines.map { |l| "#{l}\n"}
47
+ end
48
+
48
49
  def to_file
49
- str = ""
50
- @header.each do |header|
51
- str << header
52
- str << "\n"
53
- end
54
-
55
- @lines.each do |line|
56
- str << line
57
- str << "\n"
58
- end
59
-
60
- str
50
+ self.header + tags
51
+ end
52
+
53
+ def self.header
54
+
55
+ header = [
56
+ "!_TAG_FILE_FORMAT 2 /extended format/",
57
+ "!_TAG_FILE_SORTED 1 /0=unsorted, 1=sorted, 2=foldcase/",
58
+ "!_TAG_PROGRAM_AUTHOR #{Coffeetags::AUTHOR}",
59
+ "!_TAG_PROGRAM_NAME #{Coffeetags::NAME} //",
60
+ "!_TAG_PROGRAM_URL #{Coffeetags::URL} /GitHub repository/",
61
+ "!_TAG_PROGRAM_VERSION #{Coffeetags::VERSION} //"
62
+ ].map { |h| "#{h}\n"}
61
63
  end
62
64
  end
63
65
  end
@@ -2,16 +2,22 @@ require 'yaml'
2
2
  module Coffeetags
3
3
  class Parser
4
4
  attr_reader :tree
5
- def initialize source
5
+ def initialize source, include_vars = false
6
+ @include_vars = include_vars
6
7
  @source = source
7
8
 
9
+ @fake_parent = 'window'
10
+
8
11
  # tree maps the ... tree :-)
9
12
  @tree = []
10
13
 
11
14
  # regexes
12
- @class_regex = /^[ \t]*class\s*(\w*)/
13
- @var_regex = /([@a-zA-Z0-9_]*)[ \t]*[=:][ \t]*$/
14
- @token_regex = /[ \t]*([@a-zA-Z0-9_]*)[ \t]*[:=]/
15
+ @block = /^\s*(if|unless|switch|loop|do)/
16
+ @class_regex = /^\s*class\s*(\w*)/
17
+ @proto_meths = /^\s*([A-Za-z]*)::([@a-zA-Z0-9_]*)/
18
+ @var_regex = /([@a-zA-Z0-9_]*)\s*[=:]{1}\s*$/
19
+ @token_regex = /([@a-zA-Z0-9_]*)\s*[:=]{1}/
20
+ @iterator_regex = /^\s*for\s*([a-zA-Z0-9_]*)\s*/
15
21
  end
16
22
 
17
23
  def line_level line
@@ -25,11 +31,11 @@ module Coffeetags
25
31
  idx = tree.index(element) || -1
26
32
 
27
33
  current_level = element[:level]
28
- tree[0..idx].reverse.each do |_el|
34
+ tree[0..idx].reverse.each_with_index do |item, index|
29
35
  # uhmmmmmm
30
- if _el[:level] != current_level and _el[:level] < current_level
31
- bf << _el[:name]
32
- current_level = _el[:level]
36
+ if item[:level] != current_level and item[:level] < current_level and item[:line] !~ @block
37
+ bf << item[:name] unless item[:kind] == 'b'
38
+ current_level = item[:level]
33
39
  end
34
40
  end
35
41
  bf.uniq.reverse.join('.')
@@ -39,36 +45,60 @@ module Coffeetags
39
45
  def execute!
40
46
  line_n = 0
41
47
  level = 0
42
- sc = '__top__'
43
48
  # indentify scopes
44
49
  @source.each_line do |line|
45
50
  line_n += 1
46
51
  level = line_level line
47
52
 
48
53
  if (_class = line.match @class_regex)
49
- @tree << {
50
- :name => _class[1], :level => level
51
- }
54
+ @tree << { :name => _class[1], :level => level }
55
+ end
56
+
57
+ if(_proto = line.match @proto_meths)
58
+ @tree << { :name => _proto[1], :level => level }
52
59
  end
53
60
 
54
61
  if(var = line.match @var_regex)
55
- @tree << {
56
- :name => var[1], :level => level
57
- }
62
+ @tree << { :name => var[1], :level => level }
63
+ end
64
+
65
+ if(_block = line.match @block)
66
+ @tree << { :name => _block[1], :level => level , :kind => 'b'}
58
67
  end
59
68
 
60
- token = line.match @token_regex
61
- if not token.nil? and line =~ /-\>/
69
+ token = line.match(@token_regex )
70
+ token ||= line.match(@iterator_regex)
71
+
72
+ if not token.nil?
62
73
  o = {
63
74
  :name => token[1],
64
75
  :level => level,
65
76
  :parent => '',
66
77
  :source => line.chomp,
67
- :kind => 'f',
68
78
  :line => line_n
69
79
  }
70
- o[:parent] = scope_path o
71
- @tree << o
80
+
81
+ # remove edge cases for now
82
+ # - if a line containes a line like: element.getElement('type=[checkbox]').lol()
83
+ is_in_string = line =~ /.*['"].*#{token[1]}.*=.*["'].*/
84
+
85
+ # - scope access and comparison in if x == 'lol'
86
+ is_in_comparison = line =~ /::|==/
87
+
88
+ # - objects with blank parent (parser bug?)
89
+ has_blank_parent = o[:parent] =~ /\.$/
90
+
91
+ # - multiple consecutive assignments
92
+ is_previous_not_the_same = !(@tree.last and @tree.last[:name] == o[:name] and @tree.last[:level] == o[:level])
93
+
94
+ if is_in_string.nil? and is_in_comparison.nil? and has_blank_parent.nil? and is_previous_not_the_same
95
+ o[:kind] = line =~ /[:=]{1}.*-\>/ ? 'f' : 'o'
96
+ o[:parent] = scope_path o
97
+ o[:parent] = @fake_parent if o[:parent].empty?
98
+
99
+ @tree << o if o[:kind] == 'f'
100
+ @tree << o if o[:kind] == 'o' and @include_vars
101
+ end
72
102
  end
73
103
  @tree.uniq!
74
104
  end
@@ -1,4 +1,4 @@
1
1
  # encoding: utf-8
2
2
  module Coffeetags
3
- VERSION = "0.0.1.2"
3
+ VERSION = "0.0.1.3"
4
4
  end
data/lib/CoffeeTags.rb CHANGED
@@ -17,57 +17,85 @@ module Coffeetags
17
17
  AUTHOR = "Łukasz Korecki /lukasz@coffeesounds.com/"
18
18
  NAME = "CoffeeTags"
19
19
  URL = "https://github.com/lukaszkorecki/CoffeeTags"
20
- TAGBAR_COFFEE_CONF = <<-CONF
21
- let g:tagbar_type_coffee = {
22
- \\ 'kinds' : [
23
- \\ 'f:functions',
24
- \\ 'o:object'
25
- \\ ],
26
- \\ 'kind2scope' : {
27
- \\ 'f' : 'object',
28
- \\ 'o' : 'object'
29
- \\},
30
- \\ 'sro' : ".",
31
- \\ 'ctagsbin' : 'coffeetags',
32
- \\ 'ctagsargs' : '',
33
- \\}
34
- CONF
35
20
 
21
+ STRINGS = {
22
+ 'version' => "#{NAME} #{Coffeetags::VERSION} by #{AUTHOR} ( #{URL} )",
23
+ 'help' => <<-HELP
24
+ --version - coffeetags version
25
+ --vim-conf - print out tagbar config for vim
26
+ --include-vars - include objects/variables in generated tags
27
+ combine --vim-conf and --include-vars to create a config which adds '--include-vars' option
28
+ HELP
29
+ }
36
30
  class Utils
37
31
 
38
32
  def self.option_parser args
39
- puts "no args!" and return if args.empty?
40
- case args.first
41
- when /version/
42
- STDOUT << Coffeetags::VERSION
43
- when 'help'
44
- STDOUT << 'coffeetags [version|vim_conf] or path to a coffeescript file'
45
- when /vim_conf/
46
- puts <<-HELP
47
- " Add this type definition to your vimrc
48
- " or do
49
- " coffeetags vim_conf >> <PATH TO YOUR VIMRC>
50
- HELP
51
- puts Coffeetags::TAGBAR_COFFEE_CONF
52
- else
53
- self.run args
33
+ include_vars = ! args.delete('--include-vars').nil?
34
+
35
+ output = nil
36
+
37
+ unless args.index( '-f').nil?
38
+ output = args[ args.index('-f') + 1]
39
+ args.delete '-f'
40
+ args.delete output
54
41
  end
55
42
 
43
+ to_print = [].tap do |_to_print|
44
+ _to_print << args.delete( '--help')
45
+ _to_print << args.delete( '--version')
46
+ end.reject { |i| i.nil? }.map { |i| i.sub '--', ''}.map { |s| STRINGS[s] }
47
+ ( to_print << tagbar_conf(include_vars) ) unless args.delete('--vim-conf').nil?
48
+
49
+ to_print.each { |str| puts str }
50
+
51
+ [output, include_vars, args] unless args.empty?
56
52
  end
57
53
 
58
- def self.run files
59
- files.each do |file|
60
- sc = File.read file
61
54
 
62
- parser = Coffeetags::Parser.new sc
55
+ def self.run output, include_vars, files
56
+ __out = if output.nil?
57
+ STDOUT
58
+ else
59
+ File.open output, 'w'
60
+ end
61
+
62
+ __out << Coffeetags::Formatter.header
63
+
64
+ files.reject { |f| f =~ /^--/}.each do |file|
65
+ sc = File.read file
66
+ parser = Coffeetags::Parser.new sc, include_vars
63
67
  parser.execute!
64
68
 
65
69
  formatter = Coffeetags::Formatter.new file, parser.tree
66
70
 
67
71
  formatter.parse_tree
68
72
 
69
- STDOUT << formatter.to_file
73
+ __out << formatter.tags
70
74
  end
75
+ __out.close if __out.respond_to? :close
76
+ end
77
+
78
+ def self.tagbar_conf include_vars
79
+ <<-CONF
80
+ " Add this type definition to your vimrc
81
+ " or do
82
+ " coffeetags --vim-conf >> <PATH TO YOUR VIMRC>
83
+ " if you want your tags to include vars/objects do:
84
+ " coffeetags --vim-conf --include-vars
85
+ let g:tagbar_type_coffee = {
86
+ \\ 'kinds' : [
87
+ \\ 'f:functions',
88
+ \\ 'o:object'
89
+ \\ ],
90
+ \\ 'kind2scope' : {
91
+ \\ 'f' : 'object',
92
+ \\ 'o' : 'object'
93
+ \\},
94
+ \\ 'sro' : ".",
95
+ \\ 'ctagsbin' : 'coffeetags',
96
+ \\ 'ctagsargs' : '#{include_vars ? "--include-vars" : "" } ',
97
+ \\}
98
+ CONF
71
99
  end
72
100
  end
73
101
  end
@@ -0,0 +1,69 @@
1
+ require 'lib/CoffeeTags'
2
+ include Coffeetags
3
+ describe Utils do
4
+ context 'Argument parsing' do
5
+ it "returns nil when nothing is passed" do
6
+ Utils.option_parser( []).should == nil
7
+ end
8
+
9
+ it "returns files list" do
10
+ Utils.option_parser( [ 'lol.coffee']).should == [ nil, false, ['lol.coffee']]
11
+ end
12
+
13
+ it "parses --include-vars option" do
14
+ Utils.option_parser( [ '--include-vars', 'lol.coffee']).should == [ nil, true, ['lol.coffee']]
15
+ end
16
+
17
+ it "parses -f <file> option" do
18
+ Utils.option_parser( [ '-f','tags' ,'lol.coffee']).should == [ 'tags', false, ['lol.coffee']]
19
+ end
20
+
21
+ it "parses --vim-conf option" do
22
+ pending 'learn how to catch STDOUT in specs :-)'
23
+ Utils.option_parser( [ '--vim-conf','lol.coffee']).should match /g:tagbar_type_coffee /
24
+
25
+ end
26
+
27
+
28
+ end
29
+
30
+ context 'Parser runner' do
31
+ before do
32
+ @fake_parser = mock('Parser')
33
+ @fake_parser.stub! :"execute!"
34
+ @fake_parser.stub!( :tree).and_return []
35
+
36
+ Parser.stub!(:new).and_return @fake_parser
37
+
38
+ @fake_formatter = mock 'Formatter'
39
+ @fake_formatter.stub! :parse_tree
40
+ @fake_formatter.stub!(:tags).and_return <<-TAG
41
+ tag
42
+ tag2
43
+ tag3
44
+ TAG
45
+ Coffeetags::Formatter.stub!(:new).and_return @fake_formatter
46
+ Coffeetags::Formatter.stub!(:header).and_return "header\n"
47
+
48
+ File.stub!(:read).and_return 'woot@'
49
+
50
+ end
51
+
52
+
53
+ it "opens the file and writes tags to it" do
54
+ Utils.run 'test.tags', false, ['woot']
55
+ `cat test.tags`.should== <<-FF
56
+ header
57
+ tag
58
+ tag2
59
+ tag3
60
+ FF
61
+
62
+ end
63
+ after :each do
64
+ `rm test.tags`
65
+ end
66
+
67
+ end
68
+
69
+ end
@@ -4,10 +4,34 @@ bump = (wat) ->
4
4
  Wat =
5
5
  ho : (x) ->
6
6
  x = 'o'
7
+ x = 'z' if bamp
7
8
  console.log 'ahhhh'
8
9
  @lolWat =
9
10
  bump : ->
10
11
  console.log 'bump'
11
12
  bump_up : ->
12
13
  console.log 'bump up'
13
- @BOOO__up = -> z()
14
+ @filter = ->
15
+ filter.getElements('input[type="checkbox"]').addEvent('change', (e) ->
16
+ Wat.trackEvent('Track', "Filter::#{e.target.name}", e.target.value)
17
+ )
18
+
19
+ _loop = (x) ->
20
+ woop = 1
21
+ if z.isSomethingRidic
22
+ fu = 1
23
+
24
+ if wat
25
+ nice = 'ok'
26
+
27
+
28
+ for element in lol
29
+ do (element)
30
+ ugh = 2 * element
31
+ # for testing with issue #1 examples
32
+ dir = fs.readdirSync __dirname
33
+ x = dir + '/foo'
34
+
35
+ for f in dir
36
+ do (f) ->
37
+ console.log f
@@ -1,20 +1,38 @@
1
1
  ---
2
2
  - :source: bump = (wat) ->
3
- :parent: ""
3
+ :parent: "window"
4
4
  :kind: f
5
5
  :name: bump
6
6
  :line: 1
7
7
  :level: 0
8
+ - :source: " v = 'test'"
9
+ :parent: 'bump'
10
+ :kind: o
11
+ :name: v
12
+ :line: 2
13
+ :level: 2
8
14
  - :name: Wat
15
+ :source: 'Wat ='
16
+ :parent: window
17
+ :kind: o
9
18
  :level: 0
19
+ :line: 4
10
20
  - :source: " ho : (x) ->"
11
21
  :parent: Wat
12
22
  :kind: f
13
23
  :name: ho
14
24
  :line: 5
15
25
  :level: 2
26
+ - :source: " x = 'o'"
27
+ :level: 4
28
+ :kind: o
29
+ :line: 6
30
+ :name: x
16
31
  - :name: '@lolWat'
17
32
  :level: 4
33
+ :line: 8
34
+ :source: ' @lolWat ='
35
+ :kind: o
18
36
  - :source: " bump : ->"
19
37
  :parent: 'Wat.ho.@lolWat'
20
38
  :kind: f
@@ -33,3 +51,8 @@
33
51
  :name: '@BOOO__up'
34
52
  :line: 13
35
53
  :level: 4
54
+ - :source: 'Array::loop = (x) ->'
55
+ :line: 18
56
+ :kind: f
57
+ :parent: Array
58
+ :level: 0
@@ -7,6 +7,12 @@
7
7
  :name: constructor
8
8
  :line: 8
9
9
  :level: 2
10
+ - :source: ' @url = "https://#{host}.campfirenow.com/"'
11
+ :name: '@url'
12
+ :parent: 'Campfire.constructor'
13
+ :kind: o
14
+ :level: 4
15
+ :line: 9
10
16
  - :source: " handlers: (callbacks) ->"
11
17
  :parent: Campfire
12
18
  :kind: f
@@ -45,6 +51,14 @@
45
51
  :name: recent
46
52
  :line: 40
47
53
  :level: 2
54
+ - :source: ' url = "room/#{id}/recent.json"'
55
+ :parent: Campfire.recent
56
+ :kind: o
57
+ :name: url
58
+ :line: 41
59
+ :level: 4
60
+
61
+
48
62
  - :name: Test
49
63
  :level: 0
50
64
  - :source: " bump : ->"
@@ -14,12 +14,18 @@ describe 'CoffeeTags::Formatter' do
14
14
  end
15
15
 
16
16
  it "generates a line for method definition" do
17
- exp = 'constructor test.coffee /^ constructor: (api_key, host) ->$/;" f lineno:8 object:Campfire type:function'
17
+ exp = [ 'constructor', 'test.coffee',
18
+ "/^#{Regexp.escape ' constructor: (api_key, host) ->'}$/;\"",
19
+ 'f', 'lineno:8', 'object:Campfire', 'type:function'
20
+ ].join("\t")
18
21
  @instance.parse_tree.first.should == exp
19
22
  end
20
23
 
21
24
  it "generates line for second class" do
22
- exp = 'bump test.coffee /^ bump : ->$/;" f lineno:46 object:Test type:function'
25
+ exp = [ 'bump', 'test.coffee',
26
+ "/^#{Regexp.escape ' bump : ->'}$/;\"",
27
+ 'f', 'lineno:46', 'object:Test', 'type:function'
28
+ ].join "\t"
23
29
  @instance.parse_tree.last.should == exp
24
30
  end
25
31
 
data/spec/parser_spec.rb CHANGED
@@ -3,8 +3,9 @@ describe 'CoffeeTags::Parser' do
3
3
  before :all do
4
4
  @campfire_class = File.read File.expand_path('./spec/fixtures/campfire.coffee')
5
5
  @test_file = File.read File.expand_path('./spec/fixtures/test.coffee')
6
- @test_tree = YAML::load_file File.expand_path('./spec/fixtures/test_tree.yaml')
6
+
7
7
  @cf_tree = YAML::load_file File.expand_path('./spec/fixtures/tree.yaml')
8
+ @test_tree = YAML::load_file File.expand_path('./spec/fixtures/test_tree.yaml')
8
9
 
9
10
  end
10
11
 
@@ -36,21 +37,20 @@ describe 'CoffeeTags::Parser' do
36
37
  before(:each) do
37
38
  @parser = Coffeetags::Parser.new ''
38
39
  end
39
- it 'gets the scope path for first function' do
40
+ it 'gets the scope path for function' do
40
41
  @parser.scope_path(@cf_tree[1], @cf_tree[0...1] ).should == 'Campfire'
41
42
  end
42
43
 
43
44
  it 'gets the scope path for second function' do
44
- @parser.scope_path(@cf_tree[2], @cf_tree[0..1] ).should == 'Campfire'
45
+ @parser.scope_path(@cf_tree[3], @cf_tree[0..2] ).should == 'Campfire'
45
46
  end
46
47
 
47
48
  it "gets the scope for nested function" do
48
- @parser.scope_path(@cf_tree[4], @cf_tree[0..3]).should == 'Campfire.handlers.resp'
49
+ @parser.scope_path(@cf_tree[5], @cf_tree[0..4]).should == 'Campfire.handlers.resp'
49
50
  end
50
51
 
51
52
  it "gets the scope of a function which comes after nested function" do
52
-
53
- @parser.scope_path(@cf_tree[6], @cf_tree[0..5]).should == 'Campfire'
53
+ @parser.scope_path(@cf_tree[7], @cf_tree[0..6]).should == 'Campfire'
54
54
  end
55
55
 
56
56
  it 'gets scope for last method defined in diff class' do
@@ -61,26 +61,93 @@ describe 'CoffeeTags::Parser' do
61
61
  context 'Parsing' do
62
62
  context 'Scoping' do
63
63
  before(:each) do
64
- @coffee_parser = Coffeetags::Parser.new @campfire_class
65
- @test_parser = Coffeetags::Parser.new @test_file
64
+ @coffee_parser = Coffeetags::Parser.new @campfire_class, true
65
+ @test_parser = Coffeetags::Parser.new @test_file, true
66
+ @coffee_parser.execute!
66
67
  end
67
68
 
68
- it "generates the scope list" do
69
- @coffee_parser.execute!
70
- @coffee_parser.tree.should == @cf_tree
69
+ it "parses the class" do
70
+ c =@coffee_parser.tree.find { |i| i[:name] == 'Campfire'}
71
+ c.should == @cf_tree.find {|i| i[:name] == 'Campfire'}
72
+ end
73
+
74
+ it "parses the 2nd class" do
75
+ c =@coffee_parser.tree.find { |i| i[:name] == 'Test'}
76
+ c.should == @cf_tree.find {|i| i[:name] == 'Test'}
77
+ end
78
+
79
+ it "parses the instance variable" do
80
+ c =@coffee_parser.tree.find { |i| i[:name] == '@url'}
81
+ c.should == @cf_tree.find {|i| i[:name] == '@url'}
82
+ end
83
+
84
+ it "parses the object literal with functions" do
85
+ c =@coffee_parser.tree.find { |i| i[:name] == 'resp'}
86
+ c.should == @cf_tree.find {|i| i[:name] == 'resp'}
87
+ end
88
+
89
+ it "parses a nested function" do
90
+ c =@coffee_parser.tree.find { |i| i[:name] == 'onSuccess'}
91
+ c.should == @cf_tree.find {|i| i[:name] == 'onSuccess'}
92
+ end
93
+
94
+ it "parses a method var" do
95
+ c =@coffee_parser.tree.find { |i| i[:name] == 'url'}
96
+ c.should == @cf_tree.find {|i| i[:name] == 'url'}
71
97
  end
72
98
  end
73
99
  end
74
100
 
75
101
  context 'Test.coffee parsing' do
76
102
  before(:each) do
77
- @parser_test = Coffeetags::Parser.new @test_file
103
+ @parser_test = Coffeetags::Parser.new @test_file, true
78
104
  @parser_test.execute!
79
105
  end
80
106
 
81
- it "generates the tree for test.coffee" do
82
- @parser_test.tree.should == @test_tree
107
+ it "doesnt extract a variable from a tricky line" do
108
+ @parser_test.tree.find { |i| i[:name] == 'Filter'}.should == nil
83
109
  end
84
110
 
111
+ it 'correctly recognizes an object in if block' do
112
+ pro = @parser_test.tree.find { |i| i[:name] == 'fu'}
113
+ pro[:parent].should == '_loop'
114
+
115
+ pro = @parser_test.tree.find { |i| i[:name] == 'nice'}
116
+ pro[:parent].should == '_loop'
117
+ end
118
+
119
+ it 'correctly recognizes an object in for block' do
120
+ pro = @parser_test.tree.find { |i| i[:name] == 'ugh'}
121
+ pro[:parent].should == '_loop.element'
122
+
123
+ end
124
+
125
+ it "extracts a method defined in a prototype" do
126
+ pending 'methods defined on prototype needs implementing'
127
+ pro = @parser_test.tree.find { |i| i[:name] == '_loop'}
128
+ exp = @test_tree.find { |i| i[:name] == '_loop'}
129
+ pro.should_not be nil
130
+ pro.should == exp
131
+ end
132
+
133
+ context 'for loop' do
134
+ subject {
135
+ @parser_test = Coffeetags::Parser.new @test_file, true
136
+ @parser_test.execute!
137
+ @parser_test.tree.find { |i| i[:name] == 'element'}
138
+ }
139
+ it "finds variables defined in for loop" do
140
+ subject[:line].should == 28
141
+ end
142
+
143
+ it "extracts the name" do
144
+ subject[:name].should == 'element'
145
+ end
146
+
147
+ it "detects the scope" do
148
+
149
+ subject[:parent].should == '_loop'
150
+ end
151
+ end
85
152
  end
86
153
  end
data/test.rb CHANGED
@@ -1,4 +1,8 @@
1
1
  require './lib/CoffeeTags'
2
2
  require 'yaml'
3
3
 
4
- Coffeetags::Utils.option_parser ARGV
4
+ out = Coffeetags::Utils.option_parser ARGV
5
+ if out
6
+ output, include_vars, files = out
7
+ Coffeetags::Utils.run output, include_vars, files
8
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: CoffeeTags
3
3
  version: !ruby/object:Gem::Version
4
- hash: 79
4
+ hash: 77
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
9
  - 1
10
- - 2
11
- version: 0.0.1.2
10
+ - 3
11
+ version: 0.0.1.3
12
12
  platform: ruby
13
13
  authors:
14
14
  - "\xC5\x81ukasz Korecki"
@@ -16,7 +16,7 @@ autorequire:
16
16
  bindir: bin
17
17
  cert_chain: []
18
18
 
19
- date: 2011-09-23 00:00:00 +01:00
19
+ date: 2011-10-06 00:00:00 +01:00
20
20
  default_executable:
21
21
  dependencies: []
22
22
 
@@ -42,6 +42,7 @@ files:
42
42
  - lib/CoffeeTags/formatter.rb
43
43
  - lib/CoffeeTags/parser.rb
44
44
  - lib/CoffeeTags/version.rb
45
+ - spec/coffeetags_spec.rb
45
46
  - spec/fixtures/campfire.coffee
46
47
  - spec/fixtures/campfire.js
47
48
  - spec/fixtures/campfire.js.tags
@@ -86,6 +87,7 @@ signing_key:
86
87
  specification_version: 3
87
88
  summary: Simple tags generator for CoffeeScript
88
89
  test_files:
90
+ - spec/coffeetags_spec.rb
89
91
  - spec/fixtures/campfire.coffee
90
92
  - spec/fixtures/campfire.js
91
93
  - spec/fixtures/campfire.js.tags