CoffeeTags 0.0.1.2 → 0.0.1.3

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/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