jsus 0.3.1 → 0.3.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -6,8 +6,7 @@ module Jsus
6
6
  # structure (with node names like /namespace/inner/item) and supporting
7
7
  # lookups via #glob method.
8
8
  #
9
- # Example:
10
- #
9
+ # @example
11
10
  # tree = Jsus::Tree.new
12
11
  # tree["/folder/item_0"] = "Hello"
13
12
  # tree["/folder/item_1"] = "World"
@@ -29,6 +28,7 @@ module Jsus
29
28
 
30
29
  # Splits path into components
31
30
  # Jsus::Tree.components_from_path("/hello/world") # => ["hello", "world"]
31
+ # @api semipublic
32
32
  def components_from_path(path)
33
33
  raise "Empty path given: #{path.inspect}" if !path || path == ""
34
34
  path = path.to_s.dup
@@ -68,23 +68,31 @@ module Jsus
68
68
  attr_reader :name
69
69
  # Assigns node's full path and automatically deduces path components,
70
70
  # basename etc.
71
+ # @api semipublic
71
72
  def full_path=(full_path)
72
73
  @full_path = full_path
73
74
  @path_components = Tree.get_path_components(full_path)
74
75
  @name = @path_components[-1]
75
76
  end
76
77
 
77
- # Returns node's direct descendants
78
+ # @return [Array] node's direct descendants
79
+ # @api public
78
80
  def children
79
81
  @children ||= []
80
82
  end
81
83
 
82
- # Finds a node child by basename
84
+ # @param [String] basename
85
+ # @return [Jsus::Util::Tree::Node] direct node child with given basename
86
+ # @api public
83
87
  def find_child(name)
84
88
  children.detect {|child| child.name == name }
85
89
  end
86
90
 
87
91
  # Creates a child with given name and value
92
+ # @param [String] node name
93
+ # @param [Object] value
94
+ # @return [Jsus::Util::Tree::Node]
95
+ # @api public
88
96
  def create_child(name, value = nil)
89
97
  full_path = Tree.path_from_components(path_components + [name])
90
98
  node = Node.new(full_path, value)
@@ -94,7 +102,11 @@ module Jsus
94
102
  end
95
103
 
96
104
  # Finds a child with given name or creates a child with given name and
97
- # value
105
+ # value.
106
+ #
107
+ # @param [String] name
108
+ # @param [Object] value
109
+ # @api public
98
110
  def find_or_create_child(name, value = nil)
99
111
  find_child(name) || create_child(name, value)
100
112
  end
@@ -105,7 +117,10 @@ module Jsus
105
117
  # 'smth*' -- nodes beginning with smth
106
118
  # 'smth*else' -- nodes beginning with smth and ending with else
107
119
  # <string without asterisks> -- plain node lookup by name
108
- # Returns array with search results
120
+ #
121
+ # @param [String] pathspec
122
+ # @return [Array] array with search results
123
+ # @api public
109
124
  def find_children_matching(pathspec)
110
125
  case pathspec
111
126
  when "**"
@@ -118,18 +133,23 @@ module Jsus
118
133
  end
119
134
  end
120
135
 
121
- # Returns whether this node has children
136
+ # @return [Boolean] whether this node has children
137
+ # @api public
122
138
  def has_children?
123
139
  !children.empty?
124
140
  end
125
141
  end
126
142
 
127
- # Root node of the tree
143
+ # @return [Jsus::Util::Tree::Node] root node of the tree
144
+ # @api public
128
145
  def root
129
146
  @root ||= Node.new("/", nil)
130
147
  end
131
148
 
132
149
  # Looks up a node by direct path. Does not support wildcards
150
+ # @param [String] path
151
+ # @return [Jsus::Util::Tree::Node]
152
+ # @api public
133
153
  def lookup(path)
134
154
  path_components = self.class.get_path_components(path)
135
155
  path_components.inject(root) do |result, component|
@@ -139,6 +159,11 @@ module Jsus
139
159
  end
140
160
  end
141
161
 
162
+ # @see lookup
163
+ # @param [String] path
164
+ # @return [Jsus::Util::Tree::Node]
165
+ # @note returns nil when node has no assigned value
166
+ # @api public
142
167
  def [](path)
143
168
  node = lookup(path)
144
169
  node ? node.value : nil
@@ -147,20 +172,28 @@ module Jsus
147
172
 
148
173
 
149
174
  # Searches for nodes by a given pathspec
150
- # See Jsus::Util::Tree::Node#find_children_matching for more details
175
+ # @see Jsus::Util::Tree::Node#find_children_matching for more details
176
+ # @param [String] pathspec
177
+ # @return [Array] nodes for given pathspec
178
+ # @api semipublic
151
179
  def find_nodes_matching(pathspec)
152
180
  self.class.get_path_components(pathspec).inject([root]) do |nodes, component|
153
181
  nodes.map {|node| node.find_children_matching(component) }.flatten
154
182
  end
155
183
  end
156
184
 
157
- # Returns values for nodes matching given pathspec
158
- # See Jsus::Util::Tree::Node#find_children_matching for more details
185
+ # @param [String] pathspec
186
+ # @return [Array] values for nodes matching given pathspec
187
+ # @see Jsus::Util::Tree::Node#find_children_matching for more details
188
+ # @api public
159
189
  def glob(pathspec)
160
190
  find_nodes_matching(pathspec).map {|node| node.value }
161
191
  end
162
192
 
163
193
  # Inserts a node with given value into the tree
194
+ # @param [String] full node path
195
+ # @param [Object] value
196
+ # @api public
164
197
  def insert(full_path, value = nil)
165
198
  node = create_all_nodes_if_needed(full_path)
166
199
  node.value = value
@@ -168,9 +201,10 @@ module Jsus
168
201
  end
169
202
  alias_method :[]=, :insert
170
203
 
171
- # Traverses the tree.
172
- # When given true as the argument, traverses all nodes.
173
- # Otherwise, only leaves.
204
+ # Traverses the tree (BFS).
205
+ # @param [Boolean] whether to traverse non-leaves nodes
206
+ # @yield traversed node
207
+ # @api public
174
208
  def traverse(all_nodes = false)
175
209
  node_list = [root]
176
210
  while !node_list.empty?
@@ -180,8 +214,9 @@ module Jsus
180
214
  end
181
215
  end
182
216
 
183
- # Returns a list of leaves.
184
- # Returns only leaves with set values by default
217
+ # @param [Boolean] whether to return only leaves with values
218
+ # @return [Array] list of leaves
219
+ # @api public
185
220
  def leaves(only_with_value = true)
186
221
  result = []
187
222
  traverse {|node| result << node if !only_with_value || node.value }
@@ -190,7 +225,8 @@ module Jsus
190
225
 
191
226
  protected
192
227
 
193
- def create_all_nodes_if_needed(full_path) # :nodoc:
228
+ # @api private
229
+ def create_all_nodes_if_needed(full_path)
194
230
  self.class.get_path_components(full_path).inject(root) do |result, component|
195
231
  result.find_or_create_child(component)
196
232
  end
@@ -198,4 +234,4 @@ module Jsus
198
234
 
199
235
  end
200
236
  end
201
- end
237
+ end
@@ -5,17 +5,21 @@ module Jsus
5
5
  class Base
6
6
  # Constructor accepts pool or array or container and adds every file
7
7
  # to its source files set.
8
+ # @param [Jsus::Pool, Jsus::Container, Array] source files to validate
9
+ # @api public
8
10
  def initialize(pool_or_array_or_container)
9
11
  self.source_files = pool_or_array_or_container
10
12
  end
11
13
 
12
- # Returns source files for validation
14
+ # @return [Array] source files for validation
15
+ # @api public
13
16
  def source_files
14
17
  @source_files ||= []
15
18
  end
16
19
  alias_method :sources, :source_files
17
20
 
18
- # Sets source files for validation
21
+ # @param [Jsus::Pool, Jsus::Container, Array] source files for validation
22
+ # @api public
19
23
  def source_files=(pool_or_array_or_container)
20
24
  case pool_or_array_or_container
21
25
  when Pool
@@ -28,21 +32,25 @@ module Jsus
28
32
  end
29
33
  alias_method :sources=, :source_files=
30
34
 
31
- # Returns whether or not given sources conform to given set of rules
35
+ # @return [Boolean] whether or not given sources conform to given set of rules
36
+ # @api public
32
37
  def validate
33
38
  validation_errors.empty?
34
39
  end
35
40
 
36
- # List of validation errors, override this method on descendant classes.
41
+ # @return [Array] list of validation errors
42
+ # @override
37
43
  def validation_errors
38
44
  []
39
45
  end
40
46
 
41
47
  # Shortcut for creating and validating a list of items
48
+ # @param [*Array] args for #new
49
+ # @api public
42
50
  def self.validate(*args)
43
51
  new(*args).validate
44
52
  end
45
53
  end
46
54
  end
47
55
  end # Util
48
- end
56
+ end
@@ -6,7 +6,13 @@ module Jsus
6
6
  # * Presence of authors field
7
7
  # * Presence of license field
8
8
  class Mooforge < Base
9
- def validation_errors # :nodoc:
9
+ # Mooforge validator checks every file for the following:
10
+ # * Presence of header
11
+ # * Presence of authors field
12
+ # * Presence of license field
13
+ # @return [Array] list oferrors
14
+ # @api public
15
+ def validation_errors
10
16
  @validation_errors ||= sources.inject([]) do |result, sf|
11
17
  if !sf.header
12
18
  result << "#{sf.filename} is missing header"
@@ -22,4 +28,4 @@ module Jsus
22
28
  end
23
29
  end
24
30
  end # Util
25
- end
31
+ end
@@ -6,6 +6,10 @@ p, h1, h2, h3, ol, li, ul, dt, dd, dl, body, html {
6
6
  padding: 0;
7
7
  margin: 0; }
8
8
 
9
+ p + br {
10
+ display: none;
11
+ }
12
+
9
13
  body {
10
14
  width: 40%;
11
15
  padding-left: 2.5%;
@@ -27,7 +31,7 @@ body > * {
27
31
  padding-right: 6%; }
28
32
 
29
33
  html {
30
- background: #FFD300; }
34
+ background: #FFC873; }
31
35
 
32
36
  header {
33
37
  background: rgba(255, 255, 255, 0.1);
@@ -41,10 +45,23 @@ header {
41
45
  width: 5em;
42
46
  font-weight: bold; }
43
47
 
44
- section, руфвук {
48
+ section {
45
49
  float: left;
46
50
  clear: both;
47
- width: 88%; }
51
+ width: 85%; }
52
+
53
+ section iframe {
54
+ width: 260%;
55
+ height: 250px;
56
+ border: 1px solid #333;
57
+ margin-bottom: 1em;
58
+ margin-top: 1.5em;
59
+ }
60
+
61
+ section iframe.high {
62
+ height: 300px;
63
+ }
64
+
48
65
 
49
66
  p, dl, li {
50
67
  color: #665504;
@@ -57,12 +74,42 @@ a {
57
74
  a:visited {
58
75
  color: #A64E00; }
59
76
 
60
- p {
77
+ p + p, h2 + p, h1 + p, ul + p, ol + p{
61
78
  margin-top: 1.5em; }
62
79
 
80
+ p code {
81
+ background-color: rgba(200, 220, 200, 0.2);
82
+ display: inline-block;
83
+ -moz-border-radius: 4px;
84
+ -webkit-border-radius: 4px;
85
+ border-radius: 4px;
86
+ padding: 0 0.2em;
87
+ font-family: "monaco", "Courier New", Courier, monospace, serif;
88
+ font-size:0.8em;
89
+ line-height:1.5em;
90
+ }
91
+ p:last-child {
92
+ margin-bottom: 1.5em;
93
+ }
94
+
63
95
  h1 {
64
96
  font-size: 2em; }
65
97
 
98
+ h1 + ul {
99
+ float: right;
100
+ width: 140%;
101
+ margin-right: -160%;
102
+ margin-top: -2em;
103
+ }
104
+
105
+ h1 + ul li {
106
+ display: inline;
107
+ }
108
+
109
+ h1 + ul li + li{
110
+ margin-left: 1em;
111
+ }
112
+
66
113
  h2 {
67
114
  font-size: 1em; }
68
115
 
@@ -72,13 +119,18 @@ h1, h2, h3 {
72
119
  ol, li {
73
120
  margin-left: 1em; }
74
121
 
75
- body > p, body > h1, body > h2 {
122
+ body > p, body > h1 {
76
123
  clear: left; }
77
124
 
125
+ body > h2 {
126
+ clear: both;
127
+ }
128
+
78
129
  header {
79
130
  padding-bottom: 1em;
80
131
  overflow: hidden; }
81
132
 
133
+
82
134
  dl {
83
135
  clear: left; }
84
136
  dl dt, dl dd {
@@ -91,29 +143,45 @@ dl {
91
143
  figure {
92
144
  display: block;
93
145
  float: right;
94
- margin-right: -140%;
146
+ margin-right: -135%;
95
147
  width: 122.75%;
96
148
  clear: right;
97
- padding: 1.5em 5% 3em; }
149
+ margin-top: -0.1em;
150
+ padding: 0 0 3em; }
98
151
  figure > ol {
99
- text-shadow: 0 1px 0 #FFDE40;
100
- -moz-text-shadow: 0 1px 0 #FFDE40;
101
- -webkit-text-shadow: 0 1px 0 #FFDE40;
152
+ font-family: 0.75em/2.25em Arial;
153
+ text-shadow: 0 1px 0 #eee;
154
+ -moz-text-shadow: 0 1px 0 #eee;
155
+ -webkit-text-shadow: 0 1px 0 #eee;
156
+ box-shadow: 0 1px 2px #333;
157
+ -moz-box-shadow: 0 1px 2px #333;
158
+ -webkit-box-shadow: 0 1px 2px #333;
102
159
  width: 7.5%;
103
160
  text-align: right;
104
161
  float: left;
105
- font-size: 0.8em;
162
+ -moz-border-radius: 0.2em;
106
163
  -webkit-border-radius: 0.2em;
107
- background: rgba(166, 137, 0, 0.1);
108
- border: 1px solid rgba(0, 0, 0, 0.3);
164
+ border-radius: 0.2em;
165
+ border: 1px solid rgba(0, 0, 0, 0.5);
109
166
  list-style: none;
110
167
  margin-left: -9.25%; }
111
168
  figure > ol li {
169
+ background: rgba(125, 125, 125, 0.4);
112
170
  margin: 0; }
113
- figure > code, figure > ol {
114
- font-size: 1em;
115
- font-family: monospace; }
171
+ figure > ol li:first-child {
172
+ border-top-left-radius: 0.2em;
173
+ border-top-right-radius: 0.2em; }
174
+ figure > ol li:last-child {
175
+ border-bottom-left-radius: 0.2em;
176
+ border-bottom-right-radius: 0.2em; }
177
+ figure > ol li.new {
178
+ background: #98B72E; }
179
+ figure > ol li.changed {
180
+ background: #FFBD40; }
116
181
  figure > code {
182
+ font-size: 1em;
183
+ line-height: 1.5em;
184
+ font-family: "monaco", "Courier New", Courier, monospace, serif;
117
185
  white-space: pre; }
118
186
 
119
187
  body .hll {
@@ -2,7 +2,7 @@ name: Class
2
2
  filename: class.js
3
3
  description: Class class
4
4
  license: MIT-Style License, http://mootools.net/license
5
- copyright: Somebody
5
+ copyright: © Somebody
6
6
  authors: Someone
7
7
  sources:
8
- - Source/Class.js
8
+ - Source/Class.js
@@ -205,6 +205,31 @@ describe Jsus::Middleware do
205
205
  body.index("script: Color.js").should > body.index("script: Core.js")
206
206
  end
207
207
  end
208
+
209
+ describe "using /include/ pattern" do
210
+ let(:path) { "/javascripts/jsus/include/Package:Input.Color.js" }
211
+
212
+ it "should be successful" do
213
+ get(path).should be_successful
214
+ end
215
+
216
+ it "should respond with type text/javascript" do
217
+ get(path).content_type.should == "text/javascript"
218
+ end
219
+
220
+ it "should contain filenames for required files" do
221
+ get(path).body.should include("/Color.js")
222
+ get(path).body.should include("/Input.js")
223
+ get(path).body.should include("/Input.Color.js")
224
+ end
225
+
226
+ it "should respect :includes_root setting" do
227
+ old_settings = Jsus::Middleware.settings
228
+ Jsus::Middleware.settings = {:includes_root => File.expand_path("../../data/ComplexDependencies/Mootools/Source", __FILE__)}
229
+ get(path).body.should include("../../Source/Library/Color.js")
230
+ Jsus::Middleware.settings = old_settings
231
+ end
232
+ end
208
233
  end
209
234
 
210
235
  describe "for invalid paths" do