jsus 0.1.19 → 0.1.20

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG CHANGED
@@ -1,4 +1,15 @@
1
1
  = Jsus Changelog
2
+ == Version 0.1.20
3
+ * Better integration for murdoc (factored it into class Jsus::Documenter)
4
+ * Tree structure for future reuse
5
+
6
+ == Versions 0.1.11 to 0.1.19
7
+ * Murloc Documentation experimental support (a bit dirty for now)
8
+ * Verbose mode for command-line, showing some missing dependencies and redeclared
9
+ provides
10
+ * Miscellanous changes and tweaks (was too lazy to write changelogs, sorry)
11
+
12
+
2
13
  == Version 0.1.10
3
14
  * Package.json files are now supported too (with the same format as yaml packages)
4
15
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.19
1
+ 0.1.20
data/bin/jsus CHANGED
@@ -1,6 +1,12 @@
1
1
  #!/usr/bin/env ruby
2
2
  require 'rubygems'
3
- require 'jsus'
3
+ begin
4
+ require 'jsus'
5
+ rescue LoadError
6
+ $: << "./lib"
7
+ require "jsus"
8
+ end
9
+
4
10
  require "fileutils"
5
11
  require 'choice'
6
12
  start_time = Time.now
@@ -54,7 +60,8 @@ Choice.options do
54
60
  option "docs_classes", :required => false do
55
61
  default []
56
62
  long "--generate-docs *CLASSES"
57
- desc "Generate documentation for classes via murdoc, e.g.: lsd-* mootools-*"
63
+ desc "Generate documentation for classes via murdoc. You need to use FULL PATHS, e.g.: " <<
64
+ "/mootools/*, /LSD/*, /**/*"
58
65
 
59
66
  end
60
67
 
@@ -99,48 +106,11 @@ if Choice.choices[:generate_includes]
99
106
  end
100
107
 
101
108
  # Generate documentation
102
- unless Choice.choices[:docs_classes].empty?
103
- require "murdoc"
104
- documented_sources = Jsus::Container.new
105
- sources = pool ? pool.sources : package.source_files
106
- Choice.choices[:docs_classes].each do |expr|
107
- regex = Regexp.new("^" + expr.gsub("*", ".*") + "$", Regexp::IGNORECASE)
108
- sources.each {|s| documented_sources << s if s.provides.any? {|provided| provided.to_s =~ regex } }
109
- end
110
-
111
- doc_dir = Choice.choices[:output_directory] + "/docs"
112
- FileUtils.mkdir_p(doc_dir)
113
- template = File.dirname(__FILE__) + "/../markup/template.haml"
114
- sources_index = {}
115
- documented_sources.each do |source|
116
- skipped_lines = 0
117
- content = source.original_content.gsub(/\A\s*\/\*.*?\*\//m) {|w| skipped_lines += w.split("\n").size; "" } # deleting initial comment
118
- annotator = Murdoc::Annotator.new(content, :javascript, :highlight_source => true)
119
- header = source.header
120
- sources_index[source.package.name] ||= []
121
- source_dir = "#{doc_dir}/#{source.package.name}"
122
- FileUtils.mkdir_p(source_dir)
123
- File.open("#{source_dir}/#{File.basename(source.filename)}.html", "w+") do |f|
124
- sources_index[source.package.name] << File.basename(source.filename)
125
- f.puts Murdoc::Formatter.new(template).render(:paragraphs => annotator.paragraphs, :header => header, :source => source, :skipped_lines => skipped_lines)
126
- end
127
- end
128
-
129
- FileUtils.cp(File.dirname(__FILE__) + "/../markup/stylesheet.css", doc_dir)
130
-
131
- # building indices
132
- sources_index.each do |pkg, sources_names|
133
- source_dir = "#{doc_dir}/#{pkg}"
134
- FileUtils.cp("#{doc_dir}/stylesheet.css", source_dir)
135
- File.open("#{source_dir}/index.html", "w+") do |f|
136
- f.puts Haml::Engine.new(File.read(File.dirname(__FILE__) + "/../markup/index.haml")).render(self, :package => pkg, :sources => sources_names)
137
- end
138
- end
139
-
140
- # building main index of packages
141
- File.open("#{doc_dir}/index.html", "w+") do |f|
142
- f.puts Haml::Engine.new(File.read(File.dirname(__FILE__) + "/../markup/packages_index.haml")).render(self, :packages => sources_index.keys)
143
- end
109
+ unless Choice.choices[:docs_classes].empty?
110
+ documenter = Jsus::Documenter.new
111
+ package.source_files.each {|source| documenter << source }
112
+ pool.sources.each {|source| documenter << source } if pool
113
+ documenter.only(Choice.choices[:docs_classes]).generate(Choice.choices[:output_directory] + "/docs")
144
114
  end
145
115
 
146
116
 
@@ -5,7 +5,7 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{jsus}
8
- s.version = "0.1.19"
8
+ s.version = "0.1.20"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Mark Abramov"]
@@ -35,13 +35,14 @@ Gem::Specification.new do |s|
35
35
  "jsus.gemspec",
36
36
  "lib/jsus.rb",
37
37
  "lib/jsus/container.rb",
38
+ "lib/jsus/documenter.rb",
38
39
  "lib/jsus/package.rb",
39
40
  "lib/jsus/packager.rb",
40
41
  "lib/jsus/pool.rb",
41
42
  "lib/jsus/source_file.rb",
42
43
  "lib/jsus/tag.rb",
43
- "markup/index.haml",
44
- "markup/packages_index.haml",
44
+ "lib/jsus/tree.rb",
45
+ "markup/index_template.haml",
45
46
  "markup/stylesheet.css",
46
47
  "markup/template.haml",
47
48
  "spec/data/Basic/README",
@@ -93,11 +94,13 @@ Gem::Specification.new do |s|
93
94
  "spec/data/bad_test_source_two.js",
94
95
  "spec/data/test_source_one.js",
95
96
  "spec/jsus/container_spec.rb",
97
+ "spec/jsus/documenter_spec.rb",
96
98
  "spec/jsus/package_spec.rb",
97
99
  "spec/jsus/packager_spec.rb",
98
100
  "spec/jsus/pool_spec.rb",
99
101
  "spec/jsus/source_file_spec.rb",
100
102
  "spec/jsus/tag_spec.rb",
103
+ "spec/jsus/tree_spec.rb",
101
104
  "spec/shared/class_stubs.rb",
102
105
  "spec/spec_helper.rb"
103
106
  ]
@@ -108,11 +111,13 @@ Gem::Specification.new do |s|
108
111
  s.summary = %q{Javascript packager and dependency resolver}
109
112
  s.test_files = [
110
113
  "spec/jsus/container_spec.rb",
114
+ "spec/jsus/documenter_spec.rb",
111
115
  "spec/jsus/package_spec.rb",
112
116
  "spec/jsus/packager_spec.rb",
113
117
  "spec/jsus/pool_spec.rb",
114
118
  "spec/jsus/source_file_spec.rb",
115
119
  "spec/jsus/tag_spec.rb",
120
+ "spec/jsus/tree_spec.rb",
116
121
  "spec/shared/class_stubs.rb",
117
122
  "spec/spec_helper.rb"
118
123
  ]
@@ -16,7 +16,8 @@ require 'jsus/tag'
16
16
  require 'jsus/container'
17
17
  require 'jsus/packager'
18
18
  require 'jsus/pool'
19
-
19
+ require 'jsus/tree'
20
+ require 'jsus/documenter'
20
21
  #
21
22
  # Jsus — a library for packaging up your source files.
22
23
  #
@@ -0,0 +1,96 @@
1
+ module Jsus
2
+ class Documenter
3
+ def initialize
4
+ require "murdoc"
5
+ rescue LoadError
6
+ raise "You should install murdoc gem in order to produce documentation"
7
+ end
8
+
9
+ def generate(doc_dir = Dir.pwd)
10
+ #FileUtils.rm_rf(doc_dir)
11
+ FileUtils.mkdir_p(doc_dir)
12
+ template_path = File.dirname(__FILE__) + "/../../markup"
13
+ template = File.read("#{template_path}/template.haml")
14
+ index_template = File.read("#{template_path}/index_template.haml")
15
+ stylesheet_path = "#{template_path}/stylesheet.css"
16
+ documented_sources.traverse(true) do |node|
17
+ if node.value # leaf
18
+ dir = doc_dir + File.dirname(node.full_path)
19
+ FileUtils.mkdir_p(dir)
20
+ file_from_contents(dir + "/#{node.name}.html", create_documentation_for_source(node.value, template))
21
+ else
22
+ dir = doc_dir + node.full_path
23
+ FileUtils.mkdir_p(dir)
24
+ FileUtils.cp(stylesheet_path, dir)
25
+ file_from_contents(dir + "/index.html", create_index_for_node(node, index_template))
26
+ end
27
+ end
28
+ end
29
+
30
+ def create_documentation_for_source(source, template)
31
+ skipped_lines = 0
32
+ content = source.original_content.gsub(/\A\s*\/\*.*?\*\//m) {|w| skipped_lines += w.split("\n").size; "" }
33
+ annotator = Murdoc::Annotator.new(content, :javascript, :highlight_source => true)
34
+ Murdoc::Formatter.new(template).render(:paragraphs => annotator.paragraphs, :header => source.header, :source => source, :skipped_lines => skipped_lines)
35
+ end
36
+
37
+ def create_index_for_node(node, template)
38
+ Haml::Engine.new(template).render(self, :node => node)
39
+ end
40
+
41
+ def <<(source)
42
+ filename = File.basename(source.filename)
43
+ if source.package
44
+ tree.insert("/#{source.package.name}/#{filename}", source)
45
+ else
46
+ tree.insert("/#{filename}", source)
47
+ end
48
+ self
49
+ end
50
+
51
+ def tree
52
+ @tree ||= Tree.new
53
+ end
54
+
55
+ def current_scope
56
+ @current_scope ||= default_scope
57
+ end
58
+
59
+ def default_scope
60
+ ["/**/*"]
61
+ end
62
+
63
+ def current_scope=(scope)
64
+ @current_scope = scope
65
+ end
66
+
67
+ # exclusive scope
68
+ def only(scope)
69
+ result = clone
70
+ result.current_scope = [scope].flatten
71
+ result
72
+ end
73
+
74
+ # additive scope
75
+ def or(scope)
76
+ result = clone
77
+ result.current_scope = current_scope + [scope].flatten
78
+ result
79
+ end
80
+
81
+ def documented_sources
82
+ @documented_sources ||= documented_sources!
83
+ end
84
+
85
+ def documented_sources!
86
+ doctree = Tree.new
87
+ current_scope.map {|pathspec| tree.glob(pathspec) }.flatten.each {|s| doctree.insert(s.full_path, s.value)}
88
+ doctree
89
+ end
90
+
91
+ protected
92
+ def file_from_contents(filename, contents)
93
+ File.open(filename, "w+") {|f| f << contents }
94
+ end
95
+ end
96
+ end
@@ -166,6 +166,42 @@ module Jsus
166
166
  Container.new(*result)
167
167
  end
168
168
 
169
+ #
170
+ # Returs a tree, containing all the sources
171
+ #
172
+ def source_tree
173
+ @source_tree ||= source_tree!
174
+ end
175
+
176
+ def source_tree! # :nodoc:
177
+ tree = Tree.new
178
+ sources.each do |source|
179
+ if source.package
180
+ tree.insert("/" + source.package.name + "/" + File.basename(source.filename), source)
181
+ else
182
+ tree.insert("/" + File.basename(source.filename), source)
183
+ end
184
+ end
185
+ tree
186
+ end
187
+
188
+ #
189
+ # Returns a tree containing all the provides tags
190
+ #
191
+ def provides_tree
192
+ @provides_tree ||= provides_tree!
193
+ end
194
+
195
+ def provides_tree!
196
+ tree = Tree.new
197
+ sources.each do |source|
198
+ source.provides.each do |tag|
199
+ tree.insert("/" + tag.to_s, source)
200
+ end
201
+ end
202
+ tree
203
+ end
204
+
169
205
  protected
170
206
 
171
207
  def provides_map # :nodoc:
@@ -0,0 +1,118 @@
1
+ module Jsus
2
+ class Tree
3
+ PATH_SEPARATOR = "/"
4
+
5
+ # Utility functions
6
+ def self.get_path_components(path)
7
+ raise "Path should start with root (got: #{path})" unless path && path[0,1] == PATH_SEPARATOR
8
+ path = path.dup
9
+ path[0,1] = ""
10
+ path.split(PATH_SEPARATOR)
11
+ end
12
+
13
+ def self.path_from_components(components)
14
+ "#{PATH_SEPARATOR}#{components.join(PATH_SEPARATOR)}"
15
+ end
16
+
17
+
18
+ class Node
19
+ attr_accessor :value
20
+ attr_accessor :parent
21
+ attr_accessor :path_components
22
+
23
+ def initialize(full_path, value = nil)
24
+ self.full_path = full_path
25
+ self.value = value
26
+ end
27
+
28
+ attr_reader :full_path
29
+ attr_reader :name
30
+ def full_path=(full_path)
31
+ @full_path = full_path
32
+ @path_components = Tree.get_path_components(full_path)
33
+ @name = @path_components[-1]
34
+ end
35
+
36
+ def children
37
+ @children ||= []
38
+ end
39
+
40
+ def find_child(name)
41
+ children.detect {|child| child.name == name }
42
+ end
43
+
44
+ def create_child(name, value = nil)
45
+ full_path = Tree.path_from_components(path_components + [name])
46
+ node = Node.new(full_path, value)
47
+ children << node
48
+ node.parent = self
49
+ node
50
+ end
51
+
52
+ def find_or_create_child(name, value = nil)
53
+ find_child(name) || create_child(name, value)
54
+ end
55
+
56
+ def find_children_matching(pathspec)
57
+ case pathspec
58
+ when "**"
59
+ [self] + children.select {|child| child.has_children? }
60
+ when /\*/
61
+ regexp = Regexp.new("^" + Regexp.escape(pathspec).gsub("\\*", ".*") + "$")
62
+ children.select {|child| !child.has_children? && child.name =~ regexp }
63
+ else
64
+ [find_child(pathspec)].compact
65
+ end
66
+ end
67
+
68
+ def has_children?
69
+ !children.empty?
70
+ end
71
+ end
72
+
73
+
74
+ def root
75
+ @root ||= Node.new("/", nil)
76
+ end
77
+
78
+ def [](path)
79
+ path_components = self.class.get_path_components(path)
80
+ path_components.inject(root) do |result, component|
81
+ if result
82
+ result.find_child(component)
83
+ end
84
+ end
85
+ end
86
+
87
+ def glob(pathspec)
88
+ self.class.get_path_components(pathspec).inject([root]) do |nodes, component|
89
+ nodes.map {|node| node.find_children_matching(component) }.flatten
90
+ end
91
+ end
92
+
93
+ def insert(full_path, value = nil)
94
+ node = create_all_nodes_if_needed(full_path)
95
+ node.value = value
96
+ node
97
+ end
98
+
99
+ def traverse(all_nodes = false)
100
+ node_list = [root]
101
+ while !node_list.empty?
102
+ node = node_list.shift
103
+ yield node if all_nodes || !node.has_children?
104
+ node.children.each {|child| node_list << child }
105
+ end
106
+ end
107
+
108
+
109
+
110
+ def create_all_nodes_if_needed(full_path)
111
+ self.class.get_path_components(full_path).inject(root) do |result, component|
112
+ result.find_or_create_child(component)
113
+ end
114
+ end
115
+
116
+ end
117
+
118
+ end
@@ -0,0 +1,19 @@
1
+ %html
2
+ %head
3
+ %title Documentation index for #{node.full_path}
4
+ %link{:rel => "stylesheet", :href => "stylesheet.css"}
5
+ %body
6
+ - subdirectories = node.children.select {|s| s.has_children? }
7
+ - unless subdirectories.empty?
8
+ %h2 List of subdirectories for #{node.full_path}:
9
+ %ul
10
+ - subdirectories.each do |child|
11
+ %li
12
+ %a{:href => "#{child.name}/index.html"}= child.name
13
+ - files = node.children.select {|s| s.value }
14
+ - unless files.empty?
15
+ %h2 List of files for #{node.full_path}:
16
+ %ul
17
+ - files.each do |child|
18
+ %li
19
+ %a{:href => "#{child.name}.html"}= child.name
@@ -0,0 +1,31 @@
1
+ require "spec_helper"
2
+
3
+ describe Jsus::Documenter do
4
+ subject { described_class.new }
5
+ let(:input_dir) { "#{File.dirname(__FILE__)}/../data/Basic/app/javascripts/Orwik" }
6
+ let(:pool) { Jsus::Pool.new(input_dir) }
7
+
8
+ describe "<<" do
9
+ it "should add source files to tree" do
10
+ pool.sources.each {|s| subject << s}
11
+ subject.tree["/Orwik/Color.js"].value.should be_a(Jsus::SourceFile)
12
+ end
13
+ end
14
+
15
+ describe "#documented_sources" do
16
+ before(:each) { pool.sources.each {|s| subject << s} }
17
+ it "should return all sources by default" do
18
+ subject.documented_sources.glob("/**/*").should have(4).elements
19
+ end
20
+
21
+ it "should accept #only scope as exclusive scope" do
22
+ subject.only("/Orwik/Wid*").documented_sources.glob("/**/*").should have(1).element # /Orwik/Widget.js
23
+ end
24
+
25
+ it "should accept #or scope as additive scope" do
26
+ # /Orwik/Widget.js, /Orwik/Input.js, /Orwik/Input.Color.js
27
+ subject.only("/Orwik/Wid*").or("/Orwik/Inp*").documented_sources.glob("/**/*").should have(3).elements
28
+ end
29
+ end
30
+
31
+ end
@@ -126,4 +126,28 @@ describe Jsus::Pool do
126
126
  subject.lookup_extensions(Jsus::Tag["Core/Class"]).should have_exactly(1).item
127
127
  end
128
128
  end
129
+
130
+ describe "#source_tree" do
131
+ let(:input_dir) { "spec/data/Extensions/app/javascripts" }
132
+ subject { Jsus::Pool.new(input_dir) }
133
+
134
+ it "should return a tree with all the source elements in it" do
135
+ subject.source_tree["/Core/Class.js"].value.should be_a(Jsus::SourceFile)
136
+ end
137
+
138
+ it "should not choke when sources got no referenced package" do
139
+ subject.send(:sources).each {|s| s.package = nil}
140
+ lambda { subject.source_tree }.should_not raise_error
141
+ end
142
+ end
143
+
144
+ describe "#provides_tree" do
145
+ let(:input_dir) { "spec/data/Extensions/app/javascripts" }
146
+ subject { Jsus::Pool.new(input_dir) }
147
+
148
+ it "should return a tree with all the source elements in it" do
149
+ subject.provides_tree.glob("/Core/Class")[0].value.should be_a(Jsus::SourceFile)
150
+ end
151
+ end
152
+
129
153
  end
@@ -0,0 +1,172 @@
1
+ require "spec_helper"
2
+
3
+ describe Jsus::Tree::Node do
4
+ describe "#initialize" do
5
+ it "should accept full path" do
6
+ described_class.new("/path/node", nil).full_path.should == "/path/node"
7
+ end
8
+
9
+ it "should extract node name" do
10
+ described_class.new("/path/node", nil).name.should == "node"
11
+ end
12
+
13
+ it "should set value" do
14
+ described_class.new("/path/node", 123).value.should == 123
15
+ end
16
+ end
17
+
18
+ describe "#children" do
19
+ subject { described_class.new("/") }
20
+
21
+ it "should be initialized with an empty array" do
22
+ subject.children.should == []
23
+ end
24
+ end
25
+
26
+ describe "#find_children_matching" do
27
+ subject { described_class.new('/') }
28
+ let(:nodes) { [] }
29
+ before(:each) do
30
+ # [0] /one 1
31
+ # [1] /two 2
32
+ # [2] /one/three 3
33
+ # [3] /one/four 4
34
+ nodes << subject.create_child('one', 1) << subject.create_child('two', 2)
35
+ nodes << nodes[0].create_child('three', 3) << nodes[0].create_child('four', 4)
36
+ end
37
+
38
+ it "if it matches a child name, it should return that child" do
39
+ subject.find_children_matching("one").should == [nodes[0]]
40
+ end
41
+
42
+ it "if it is *, it should return children, not containing other children" do
43
+ subject.find_children_matching("*").should == [nodes[1]]
44
+ end
45
+
46
+ it "if it is **, it should return self and children, containing other children" do
47
+ subject.find_children_matching("**").should == [subject, nodes[0]]
48
+ end
49
+
50
+ it "should search for occurences with wildcards" do
51
+ nodes[0].find_children_matching("thr*").should == [nodes[2]]
52
+ end
53
+ end
54
+ end
55
+
56
+ describe Jsus::Tree do
57
+ subject { Jsus::Tree.new }
58
+
59
+ describe "#root" do
60
+ it "should create node if needed" do
61
+ subject.root.should be_a(Jsus::Tree::Node)
62
+ end
63
+
64
+ it "should not recreate node" do
65
+ subject.root.should == subject.root
66
+ end
67
+ end
68
+
69
+ describe "#insert" do
70
+ it "should create a node and assign value to it" do
71
+ subject.insert("/hello", "Value")
72
+ subject.root.children.should have_exactly(1).element
73
+ subject.root.children[0].value.should == "Value"
74
+ end
75
+
76
+ it "should create all underlying nodes if needed" do
77
+ subject.insert("/hello/world", "value")
78
+ subject.root.children[0].children[0].value.should == "value"
79
+ end
80
+
81
+ it "should replace value of existing node if it already exists" do
82
+ subject.insert("/hello/world", "value")
83
+ subject.insert("/hello", "other_value")
84
+ subject.root.children.should have_exactly(1).element
85
+ subject.root.children[0].value.should == "other_value"
86
+ subject.root.children[0].children.should have_exactly(1).element
87
+ subject.root.children[0].children[0].value.should == "value"
88
+ end
89
+
90
+ it "should not replace value of existing parent nodes" do
91
+ subject.insert("/hello", "value")
92
+ subject.insert("/hello/world", "other")
93
+ subject.root.children[0].value.should == "value"
94
+ end
95
+
96
+ it "should return a node" do
97
+ subject.insert("/hello/world", "value").value.should == "value"
98
+ end
99
+ end
100
+
101
+ describe "#[]" do
102
+ it "should raise error unless path starts with root" do
103
+ lambda { subject["hello"] }.should raise_error
104
+ end
105
+
106
+ it "should allow to get node by path" do
107
+ subject.insert("/hello/world", 123)
108
+ subject["/hello/world"].value.should == 123
109
+ end
110
+
111
+ it "should return nil if node is not found" do
112
+ subject["/hello"].should be_nil
113
+ subject["/hello/world"].should be_nil
114
+ end
115
+ end
116
+
117
+ describe "#glob" do
118
+ subject { Jsus::Tree.new }
119
+ let(:nodes) { [] }
120
+ before(:each) do
121
+ nodes << subject.insert("/hello/world/one", 1) <<
122
+ subject.insert("/hello/world/two", 2) <<
123
+ subject.insert("/hello/three", 3) <<
124
+ subject.insert("/hello/four", 4)
125
+ end
126
+
127
+ it "should return the node if exact path is given" do
128
+ subject.glob("/hello/four").should == [nodes[3]]
129
+ end
130
+
131
+ it "should return all nodes in given node AND WITHOUT CHILDREN if path with wildcard is given" do
132
+ subject.glob("/hello/*").should =~ [nodes[2], nodes[3]]
133
+ end
134
+
135
+ it "should search for children matching wildcards" do
136
+ subject.glob("/hello/thr*").should == [nodes[2]]
137
+ end
138
+
139
+ it "should return all nodes in all subtrees and in the given subtree if double wildcard is given" do
140
+ subject.glob("/hello/**/*").should =~ nodes
141
+ end
142
+
143
+ it "should not choke when it cannot find anything" do
144
+ subject.glob("/ololo").should == []
145
+ subject.glob("/ololo/mwahaha").should == []
146
+ end
147
+ end
148
+
149
+ describe "#traverse" do
150
+ subject { Jsus::Tree.new }
151
+ let(:nodes) { [] }
152
+ before(:each) do
153
+ nodes << subject.insert("/hello/world/one", 1) <<
154
+ subject.insert("/hello/world/two", 2) <<
155
+ subject.insert("/hello/three", 3) <<
156
+ subject.insert("/hello/four", 4)
157
+ end
158
+
159
+ it "should traverse only leaves by default" do
160
+ counter = 0
161
+ subject.traverse { counter += 1 }
162
+ counter.should == 4
163
+ end
164
+
165
+ it "should traverse all nodes if given a true argument" do
166
+ counter = 0
167
+ subject.traverse(true) { counter += 1 }
168
+ counter.should == 7
169
+ end
170
+ end
171
+
172
+ end
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 1
8
- - 19
9
- version: 0.1.19
8
+ - 20
9
+ version: 0.1.20
10
10
  platform: ruby
11
11
  authors:
12
12
  - Mark Abramov
@@ -199,13 +199,14 @@ files:
199
199
  - jsus.gemspec
200
200
  - lib/jsus.rb
201
201
  - lib/jsus/container.rb
202
+ - lib/jsus/documenter.rb
202
203
  - lib/jsus/package.rb
203
204
  - lib/jsus/packager.rb
204
205
  - lib/jsus/pool.rb
205
206
  - lib/jsus/source_file.rb
206
207
  - lib/jsus/tag.rb
207
- - markup/index.haml
208
- - markup/packages_index.haml
208
+ - lib/jsus/tree.rb
209
+ - markup/index_template.haml
209
210
  - markup/stylesheet.css
210
211
  - markup/template.haml
211
212
  - spec/data/Basic/README
@@ -257,11 +258,13 @@ files:
257
258
  - spec/data/bad_test_source_two.js
258
259
  - spec/data/test_source_one.js
259
260
  - spec/jsus/container_spec.rb
261
+ - spec/jsus/documenter_spec.rb
260
262
  - spec/jsus/package_spec.rb
261
263
  - spec/jsus/packager_spec.rb
262
264
  - spec/jsus/pool_spec.rb
263
265
  - spec/jsus/source_file_spec.rb
264
266
  - spec/jsus/tag_spec.rb
267
+ - spec/jsus/tree_spec.rb
265
268
  - spec/shared/class_stubs.rb
266
269
  - spec/spec_helper.rb
267
270
  has_rdoc: true
@@ -278,7 +281,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
278
281
  requirements:
279
282
  - - ">="
280
283
  - !ruby/object:Gem::Version
281
- hash: -125126051440542470
284
+ hash: -1317162541712808956
282
285
  segments:
283
286
  - 0
284
287
  version: "0"
@@ -299,10 +302,12 @@ specification_version: 3
299
302
  summary: Javascript packager and dependency resolver
300
303
  test_files:
301
304
  - spec/jsus/container_spec.rb
305
+ - spec/jsus/documenter_spec.rb
302
306
  - spec/jsus/package_spec.rb
303
307
  - spec/jsus/packager_spec.rb
304
308
  - spec/jsus/pool_spec.rb
305
309
  - spec/jsus/source_file_spec.rb
306
310
  - spec/jsus/tag_spec.rb
311
+ - spec/jsus/tree_spec.rb
307
312
  - spec/shared/class_stubs.rb
308
313
  - spec/spec_helper.rb
@@ -1,10 +0,0 @@
1
- %html
2
- %head
3
- %title Index for #{package} documentation
4
- %link{:rel => "stylesheet", :href => "stylesheet.css"}
5
- %body
6
- %h1 List of package #{package} contents
7
- %ul
8
- - sources.each do |source|
9
- %li
10
- %a{:href => "#{source}.html"}= source
@@ -1,10 +0,0 @@
1
- %html
2
- %head
3
- %title Index for documentation
4
- %link{:rel => "stylesheet", :href => "stylesheet.css"}
5
- %body
6
- %h1 List of packages
7
- %ul
8
- - packages.each do |package|
9
- %li
10
- %a{:href => "#{package}/index.html"}= package