libdolt 0.6.0 → 0.6.2
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile.lock +5 -3
- data/lib/libdolt.rb +1 -0
- data/lib/libdolt/git/repository.rb +42 -26
- data/lib/libdolt/gitorious_repo_resolver.rb +29 -0
- data/lib/libdolt/repo_actions.rb +10 -0
- data/lib/libdolt/version.rb +1 -1
- data/lib/libdolt/view/blob.rb +0 -20
- data/lib/libdolt/view/breadcrumb.rb +3 -3
- data/lib/libdolt/view/object.rb +0 -10
- data/lib/libdolt/view/tree.rb +7 -2
- data/lib/libdolt/view/urls.rb +47 -0
- data/libdolt.gemspec +1 -0
- data/test/libdolt/git/repository_test.rb +25 -0
- data/test/libdolt/repo_actions_test.rb +40 -2
- data/test/libdolt/templates/blob_test.rb +1 -0
- data/test/libdolt/view/binary_blob_embedder_test.rb +1 -1
- data/test/libdolt/view/blob_test.rb +3 -43
- data/test/libdolt/view/breadcrumb_test.rb +1 -0
- data/test/libdolt/view/object_test.rb +0 -44
- data/test/libdolt/view/tree_test.rb +51 -1
- data/test/libdolt/view/urls_test.rb +63 -0
- data/test/test_helper.rb +1 -0
- metadata +45 -30
- data/lib/libdolt/async/when.rb +0 -128
- data/test/libdolt/async/when_test.rb +0 -112
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
libdolt (0.6.
|
4
|
+
libdolt (0.6.2)
|
5
5
|
em_pessimistic (~> 0.1)
|
6
6
|
em_rugged (~> 0.1.2)
|
7
7
|
eventmachine (~> 1.0)
|
@@ -10,6 +10,7 @@ PATH
|
|
10
10
|
makeup (~> 0)
|
11
11
|
mime-types (~> 1.19)
|
12
12
|
tzinfo (~> 0.3)
|
13
|
+
when (~> 0)
|
13
14
|
|
14
15
|
GEM
|
15
16
|
remote: http://rubygems.org/
|
@@ -18,7 +19,7 @@ GEM
|
|
18
19
|
eventmachine
|
19
20
|
em_pessimistic (0.1.2)
|
20
21
|
eventmachine (~> 1.0)
|
21
|
-
em_rugged (0.1.
|
22
|
+
em_rugged (0.1.5)
|
22
23
|
eventmachine (~> 1.0)
|
23
24
|
rugged (= 0.17.0.b6)
|
24
25
|
eventmachine (1.0.0)
|
@@ -39,9 +40,10 @@ GEM
|
|
39
40
|
redcarpet (2.1.1)
|
40
41
|
rugged (0.17.0.b6)
|
41
42
|
tilt (1.3.3)
|
42
|
-
tiltout (1.
|
43
|
+
tiltout (1.1.0)
|
43
44
|
tilt (~> 1.3)
|
44
45
|
tzinfo (0.3.33)
|
46
|
+
when (0.1.0)
|
45
47
|
yajl-ruby (1.1.0)
|
46
48
|
|
47
49
|
PLATFORMS
|
data/lib/libdolt.rb
CHANGED
@@ -17,37 +17,45 @@
|
|
17
17
|
#++
|
18
18
|
require "em_rugged/repository"
|
19
19
|
require "em_pessimistic/deferrable_child_process"
|
20
|
-
require "em/deferrable"
|
21
20
|
require "libdolt/git/blame"
|
22
21
|
require "libdolt/git/commit"
|
23
22
|
require "libdolt/git/submodule"
|
24
23
|
require "libdolt/git/tree"
|
25
|
-
require "
|
24
|
+
require "when"
|
26
25
|
|
27
26
|
module Dolt
|
28
27
|
module Git
|
29
28
|
class Repository < EMRugged::Repository
|
30
29
|
def submodules(ref)
|
31
|
-
d =
|
30
|
+
d = When.defer
|
32
31
|
gm = rev_parse("#{ref}:.gitmodules")
|
33
32
|
gm.callback do |config|
|
34
|
-
d.
|
33
|
+
d.resolve(Dolt::Git::Submodule.parse_config(config.content))
|
35
34
|
end
|
36
35
|
# Fails if .gitmodules cannot be found, which means no submodules
|
37
|
-
gm.errback { |err| d.
|
36
|
+
gm.errback { |err| d.resolve([]) }
|
38
37
|
d
|
39
38
|
end
|
40
39
|
|
40
|
+
def tree_entry(ref, path)
|
41
|
+
When.defer do |d|
|
42
|
+
rp = rev_parse("#{ref}:#{path}")
|
43
|
+
rp.callback { |object| annotate_tree(d, ref, path, object) }
|
44
|
+
rp.errback { |err| d.reject(err) }
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
41
48
|
def tree(ref, path)
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
49
|
+
When.defer do |d|
|
50
|
+
rp = rev_parse("#{ref}:#{path}")
|
51
|
+
rp.callback do |object|
|
52
|
+
if !object.is_a?(Rugged::Tree)
|
53
|
+
next d.reject(StandardError.new("Not a tree"))
|
54
|
+
end
|
55
|
+
annotate_tree(d, ref, path, object)
|
56
|
+
end
|
57
|
+
rp.errback { |err| d.reject(err) }
|
48
58
|
end
|
49
|
-
rp.errback { |err| d.fail(err) }
|
50
|
-
d
|
51
59
|
end
|
52
60
|
|
53
61
|
def blame(ref, path)
|
@@ -61,18 +69,18 @@ module Dolt
|
|
61
69
|
end
|
62
70
|
|
63
71
|
def tree_history(ref, path, limit = 1)
|
64
|
-
d =
|
72
|
+
d = When.defer
|
65
73
|
rp = rev_parse("#{ref}:#{path}")
|
66
|
-
rp.errback { |err| d.
|
74
|
+
rp.errback { |err| d.reject(err) }
|
67
75
|
rp.callback do |tree|
|
68
76
|
if tree.class != Rugged::Tree
|
69
77
|
message = "#{ref}:#{path} is not a tree (#{tree.class.to_s})"
|
70
|
-
break d.
|
78
|
+
break d.reject(Exception.new(message))
|
71
79
|
end
|
72
80
|
|
73
81
|
building = build_history(path || "./", ref, tree, limit)
|
74
|
-
building.callback { |history| d.
|
75
|
-
building.errback { |err| d.
|
82
|
+
building.callback { |history| d.resolve(history) }
|
83
|
+
building.errback { |err| d.reject(err) }
|
76
84
|
end
|
77
85
|
d
|
78
86
|
end
|
@@ -85,19 +93,27 @@ module Dolt
|
|
85
93
|
end
|
86
94
|
|
87
95
|
def build_history(path, ref, entries, limit)
|
88
|
-
d =
|
96
|
+
d = When.defer
|
89
97
|
resolve = lambda { |p| path == "" ? p : File.join(path, p) }
|
90
98
|
progress = When.all(entries.map do |e|
|
91
99
|
entry_history(ref, resolve.call(e[:name]), limit)
|
92
100
|
end)
|
93
|
-
progress.errback { |e| d.
|
101
|
+
progress.errback { |e| d.reject(e) }
|
94
102
|
progress.callback do |history|
|
95
|
-
d.
|
103
|
+
d.resolve(entries.map { |e| e.merge({ :history => history.shift }) })
|
96
104
|
end
|
97
105
|
d
|
98
106
|
end
|
99
107
|
|
100
|
-
def
|
108
|
+
def annotate_tree(d, ref, path, object)
|
109
|
+
if object.class.to_s.match(/Blob/) || !object.find { |e| e[:type].nil? }
|
110
|
+
return d.resolve(object)
|
111
|
+
end
|
112
|
+
|
113
|
+
annotate_submodules(d, ref, path, object)
|
114
|
+
end
|
115
|
+
|
116
|
+
def annotate_submodules(deferrable, ref, path, tree)
|
101
117
|
submodules(ref).callback do |submodules|
|
102
118
|
entries = tree.entries.map do |entry|
|
103
119
|
if entry[:type].nil?
|
@@ -111,21 +127,21 @@ module Dolt
|
|
111
127
|
entry
|
112
128
|
end
|
113
129
|
|
114
|
-
deferrable.
|
130
|
+
deferrable.resolve(Dolt::Git::Tree.new(tree.oid, entries))
|
115
131
|
end
|
116
132
|
end
|
117
133
|
|
118
134
|
def deferred_method(cmd, &block)
|
119
|
-
d =
|
135
|
+
d = When.defer
|
120
136
|
cmd = git(cmd)
|
121
137
|
p = EMPessimistic::DeferrableChildProcess.open(cmd)
|
122
138
|
|
123
139
|
p.callback do |output, status|
|
124
|
-
d.
|
140
|
+
d.resolve(block.call(output, status))
|
125
141
|
end
|
126
142
|
|
127
143
|
p.errback do |stderr, status|
|
128
|
-
d.
|
144
|
+
d.reject(stderr)
|
129
145
|
end
|
130
146
|
|
131
147
|
d
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#--
|
3
|
+
# Copyright (C) 2012 Gitorious AS
|
4
|
+
#
|
5
|
+
# This program is free software: you can redistribute it and/or modify
|
6
|
+
# it under the terms of the GNU Affero General Public License as published by
|
7
|
+
# the Free Software Foundation, either version 3 of the License, or
|
8
|
+
# (at your option) any later version.
|
9
|
+
#
|
10
|
+
# This program is distributed in the hope that it will be useful,
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
+
# GNU Affero General Public License for more details.
|
14
|
+
#
|
15
|
+
# You should have received a copy of the GNU Affero General Public License
|
16
|
+
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
17
|
+
#++
|
18
|
+
|
19
|
+
module Dolt
|
20
|
+
class GitoriousRepoResolver
|
21
|
+
def initialize(repository)
|
22
|
+
@repository = repository
|
23
|
+
end
|
24
|
+
|
25
|
+
def resolve(repo)
|
26
|
+
Dolt::Git::Repository.new(@repository.full_repository_path)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
data/lib/libdolt/repo_actions.rb
CHANGED
@@ -36,6 +36,16 @@ module Dolt
|
|
36
36
|
repo_action(repo, ref, path, :tree, :tree, ref, path, &block)
|
37
37
|
end
|
38
38
|
|
39
|
+
def tree_entry(repo, ref, path, &block)
|
40
|
+
repository = repo_resolver.resolve(repo)
|
41
|
+
d = repository.tree_entry(ref, path)
|
42
|
+
d.callback do |result|
|
43
|
+
key = result.class.to_s.match(/Blob/) ? :blob : :tree
|
44
|
+
block.call(nil, tpl_data(repo, ref, path, { key => result, :type => key }))
|
45
|
+
end
|
46
|
+
d.errback { |err| block.call(err, nil) }
|
47
|
+
end
|
48
|
+
|
39
49
|
def blame(repo, ref, path, &block)
|
40
50
|
repo_action(repo, ref, path, :blame, :blame, ref, path, &block)
|
41
51
|
end
|
data/lib/libdolt/version.rb
CHANGED
data/lib/libdolt/view/blob.rb
CHANGED
@@ -51,26 +51,6 @@ The content you're attempting to browse appears to be binary.
|
|
51
51
|
multiline(entityfy(content))
|
52
52
|
end
|
53
53
|
|
54
|
-
def blob_url(repository, ref, path)
|
55
|
-
repo_url(repository, "/blob/#{ref}:#{path}")
|
56
|
-
end
|
57
|
-
|
58
|
-
def blame_url(repository, ref, path)
|
59
|
-
repo_url(repository, "/blame/#{ref}:#{path}")
|
60
|
-
end
|
61
|
-
|
62
|
-
def history_url(repository, ref, path)
|
63
|
-
repo_url(repository, "/history/#{ref}:#{path}")
|
64
|
-
end
|
65
|
-
|
66
|
-
def raw_url(repository, ref, path)
|
67
|
-
repo_url(repository, "/raw/#{ref}:#{path}")
|
68
|
-
end
|
69
|
-
|
70
|
-
def tree_history_url(repository, ref, path)
|
71
|
-
repo_url(repository, "/tree_history/#{ref}:#{path}")
|
72
|
-
end
|
73
|
-
|
74
54
|
def format_whitespace(text)
|
75
55
|
text
|
76
56
|
end
|
@@ -23,10 +23,10 @@ module Dolt
|
|
23
23
|
dirs = path.split("/")
|
24
24
|
filename = dirs.pop
|
25
25
|
dir_html = accumulate_dirs(dirs, repository, ref)
|
26
|
-
url =
|
26
|
+
url = tree_url(repository, ref)
|
27
27
|
<<-HTML
|
28
28
|
<ul class="breadcrumb">
|
29
|
-
<li><a href="#{url}
|
29
|
+
<li><a href="#{url}"><i class="icon icon-file"></i> /</a></li>
|
30
30
|
#{dir_html}<li class="active">#{filename}</li>
|
31
31
|
</ul>
|
32
32
|
HTML
|
@@ -38,7 +38,7 @@ module Dolt
|
|
38
38
|
divider = "<span class=\"divider\">/</span>"
|
39
39
|
dir_html = dirs.inject("") do |html, dir|
|
40
40
|
accumulated << dir
|
41
|
-
url =
|
41
|
+
url = tree_url(repository, ref, accumulated.join('/'))
|
42
42
|
"#{html}<li><a href=\"#{url}\">#{dir}#{divider}</a></li>"
|
43
43
|
end
|
44
44
|
end
|
data/lib/libdolt/view/object.rb
CHANGED
@@ -19,16 +19,6 @@
|
|
19
19
|
module Dolt
|
20
20
|
module View
|
21
21
|
module Object
|
22
|
-
def object_url(repository, ref, path, object)
|
23
|
-
return object[:url] if object[:type] == :submodule
|
24
|
-
url = "/#{object[:type]}/#{ref}:#{object_path(path, object)}"
|
25
|
-
repo_url(repository, url)
|
26
|
-
end
|
27
|
-
|
28
|
-
def object_path(root, object)
|
29
|
-
File.join(root, object[:name]).sub(/^\//, "")
|
30
|
-
end
|
31
|
-
|
32
22
|
def object_icon_class(entry)
|
33
23
|
case entry[:type]
|
34
24
|
when :blob
|
data/lib/libdolt/view/tree.rb
CHANGED
@@ -19,8 +19,13 @@
|
|
19
19
|
module Dolt
|
20
20
|
module View
|
21
21
|
module Tree
|
22
|
-
def
|
23
|
-
|
22
|
+
def object_path(root, object)
|
23
|
+
File.join(root, object[:name]).sub(/^\//, "")
|
24
|
+
end
|
25
|
+
|
26
|
+
def object_url(repository, ref, path, object)
|
27
|
+
return object[:url] if object[:type] == :submodule
|
28
|
+
send(:"#{object[:type]}_url", repository, ref, object_path(path, object))
|
24
29
|
end
|
25
30
|
|
26
31
|
def tree_entries(tree)
|
@@ -0,0 +1,47 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#--
|
3
|
+
# Copyright (C) 2012 Gitorious AS
|
4
|
+
#
|
5
|
+
# This program is free software: you can redistribute it and/or modify
|
6
|
+
# it under the terms of the GNU Affero General Public License as published by
|
7
|
+
# the Free Software Foundation, either version 3 of the License, or
|
8
|
+
# (at your option) any later version.
|
9
|
+
#
|
10
|
+
# This program is distributed in the hope that it will be useful,
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
+
# GNU Affero General Public License for more details.
|
14
|
+
#
|
15
|
+
# You should have received a copy of the GNU Affero General Public License
|
16
|
+
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
17
|
+
#++
|
18
|
+
|
19
|
+
module Dolt
|
20
|
+
module View
|
21
|
+
module Urls
|
22
|
+
def tree_url(repository, ref, path = "")
|
23
|
+
repo_url(repository, "/tree/#{ref}:#{path}")
|
24
|
+
end
|
25
|
+
|
26
|
+
def blob_url(repository, ref, path)
|
27
|
+
repo_url(repository, "/blob/#{ref}:#{path}")
|
28
|
+
end
|
29
|
+
|
30
|
+
def blame_url(repository, ref, path)
|
31
|
+
repo_url(repository, "/blame/#{ref}:#{path}")
|
32
|
+
end
|
33
|
+
|
34
|
+
def history_url(repository, ref, path)
|
35
|
+
repo_url(repository, "/history/#{ref}:#{path}")
|
36
|
+
end
|
37
|
+
|
38
|
+
def raw_url(repository, ref, path)
|
39
|
+
repo_url(repository, "/raw/#{ref}:#{path}")
|
40
|
+
end
|
41
|
+
|
42
|
+
def tree_history_url(repository, ref, path)
|
43
|
+
repo_url(repository, "/tree_history/#{ref}:#{path}")
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
data/libdolt.gemspec
CHANGED
@@ -14,6 +14,7 @@ Gem::Specification.new do |s|
|
|
14
14
|
s.rubyforge_project = "libdolt"
|
15
15
|
|
16
16
|
s.add_dependency "eventmachine", "~>1.0"
|
17
|
+
s.add_dependency "when", "~>0"
|
17
18
|
s.add_dependency "em_pessimistic", "~>0.1"
|
18
19
|
s.add_dependency "em_rugged", "~> 0.1.2"
|
19
20
|
s.add_dependency "tzinfo", "~> 0.3"
|
@@ -64,6 +64,31 @@ describe Dolt::Git::Repository do
|
|
64
64
|
end
|
65
65
|
end
|
66
66
|
|
67
|
+
describe "#tree_entry" do
|
68
|
+
it "includes submodule data for trees" do
|
69
|
+
@repository.tree_entry("3dc532f", "vendor").callback do |tree|
|
70
|
+
assert_equal({
|
71
|
+
:type => :submodule,
|
72
|
+
:filemode => 57344,
|
73
|
+
:name => "ui",
|
74
|
+
:oid => "d167e3e1c17a27e4cf459dd380670801b0659659",
|
75
|
+
:url => "git://gitorious.org/gitorious/ui3.git"
|
76
|
+
}, tree.entries.first)
|
77
|
+
done!
|
78
|
+
end
|
79
|
+
wait!
|
80
|
+
end
|
81
|
+
|
82
|
+
it "yields blob" do
|
83
|
+
@repository.tree_entry("3dc532f", "Gemfile").callback do |blob|
|
84
|
+
assert blob.is_a?(Rugged::Blob)
|
85
|
+
assert_equal "source \"http://rubygems.org\"\n\ngemspec\n", blob.content
|
86
|
+
done!
|
87
|
+
end
|
88
|
+
wait!
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
67
92
|
describe "#blame" do
|
68
93
|
it "returns deferrable" do
|
69
94
|
deferrable = @repository.blame("master", "Gemfile")
|
@@ -17,13 +17,14 @@
|
|
17
17
|
#++
|
18
18
|
require "test_helper"
|
19
19
|
require "libdolt/repo_actions"
|
20
|
-
require "
|
20
|
+
require "when"
|
21
21
|
require "ostruct"
|
22
22
|
|
23
23
|
class Repository
|
24
24
|
attr_reader :name
|
25
25
|
def initialize(name); @name = name; end
|
26
26
|
def tree(ref, path); stub; end
|
27
|
+
def tree_entry(ref, path); stub; end
|
27
28
|
def rev_parse(rev); stub; end
|
28
29
|
def blame(ref, path); stub; end
|
29
30
|
def log(ref, path, limit); stub; end
|
@@ -36,7 +37,7 @@ class Repository
|
|
36
37
|
|
37
38
|
private
|
38
39
|
def stub
|
39
|
-
@deferred = When
|
40
|
+
@deferred = When.defer
|
40
41
|
@deferred.promise
|
41
42
|
end
|
42
43
|
end
|
@@ -52,6 +53,8 @@ class Resolver
|
|
52
53
|
end
|
53
54
|
end
|
54
55
|
|
56
|
+
class FakeBlob; end
|
57
|
+
|
55
58
|
describe Dolt::RepoActions do
|
56
59
|
before do
|
57
60
|
@resolver = Resolver.new
|
@@ -108,6 +111,41 @@ describe Dolt::RepoActions do
|
|
108
111
|
end
|
109
112
|
end
|
110
113
|
|
114
|
+
describe "#tree_entry" do
|
115
|
+
it "yields tree, repo and ref to block" do
|
116
|
+
data = nil
|
117
|
+
@actions.tree_entry("gitorious", "babd120", "") { |err, d| data = d }
|
118
|
+
repo = @resolver.resolved.last
|
119
|
+
repo.resolve_promise "Tree"
|
120
|
+
|
121
|
+
expected = {
|
122
|
+
:tree => "Tree",
|
123
|
+
:repository => "gitorious",
|
124
|
+
:ref => "babd120",
|
125
|
+
:path => "",
|
126
|
+
:type => :tree
|
127
|
+
}
|
128
|
+
assert_equal expected, data
|
129
|
+
end
|
130
|
+
|
131
|
+
it "yields tree, repo and ref to block" do
|
132
|
+
data = nil
|
133
|
+
@actions.tree_entry("gitorious", "babd120", "Gemfile") { |err, d| data = d }
|
134
|
+
repo = @resolver.resolved.last
|
135
|
+
blob = FakeBlob.new
|
136
|
+
repo.resolve_promise(blob)
|
137
|
+
|
138
|
+
expected = {
|
139
|
+
:blob => blob,
|
140
|
+
:repository => "gitorious",
|
141
|
+
:ref => "babd120",
|
142
|
+
:path => "Gemfile",
|
143
|
+
:type => :blob
|
144
|
+
}
|
145
|
+
assert_equal expected, data
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
111
149
|
describe "#blame" do
|
112
150
|
it "resolves repository" do
|
113
151
|
@actions.blame("gitorious", "master", "app")
|
@@ -21,7 +21,7 @@ require "libdolt/view/blob"
|
|
21
21
|
require "libdolt/view/binary_blob_embedder"
|
22
22
|
|
23
23
|
describe Dolt::View::BinaryBlobEmbedder do
|
24
|
-
include Dolt::View::
|
24
|
+
include Dolt::View::Urls
|
25
25
|
include Dolt::View::BinaryBlobEmbedder
|
26
26
|
include Dolt::View::SingleRepository
|
27
27
|
|
@@ -17,49 +17,13 @@
|
|
17
17
|
#++
|
18
18
|
require "test_helper"
|
19
19
|
require "libdolt/view/single_repository"
|
20
|
-
require "libdolt/view/multi_repository"
|
21
20
|
require "libdolt/view/blob"
|
21
|
+
require "libdolt/view/urls"
|
22
22
|
|
23
23
|
describe Dolt::View::Blob do
|
24
24
|
include Dolt::View::Blob
|
25
|
-
|
26
|
-
|
27
|
-
include Dolt::View::SingleRepository
|
28
|
-
|
29
|
-
it "returns blame url" do
|
30
|
-
url = blame_url("myrepo", "master", "some/path")
|
31
|
-
assert_equal "/blame/master:some/path", url
|
32
|
-
end
|
33
|
-
|
34
|
-
it "returns history url" do
|
35
|
-
url = history_url("myrepo", "master", "some/path")
|
36
|
-
assert_equal "/history/master:some/path", url
|
37
|
-
end
|
38
|
-
|
39
|
-
it "returns raw url" do
|
40
|
-
url = raw_url("myrepo", "master", "some/path")
|
41
|
-
assert_equal "/raw/master:some/path", url
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
describe "multi repo mode" do
|
46
|
-
include Dolt::View::MultiRepository
|
47
|
-
|
48
|
-
it "returns blame url" do
|
49
|
-
url = blame_url("myrepo", "master", "some/path")
|
50
|
-
assert_equal "/myrepo/blame/master:some/path", url
|
51
|
-
end
|
52
|
-
|
53
|
-
it "returns history url" do
|
54
|
-
url = history_url("myrepo", "master", "some/path")
|
55
|
-
assert_equal "/myrepo/history/master:some/path", url
|
56
|
-
end
|
57
|
-
|
58
|
-
it "returns raw url" do
|
59
|
-
url = raw_url("myrepo", "master", "some/path")
|
60
|
-
assert_equal "/myrepo/raw/master:some/path", url
|
61
|
-
end
|
62
|
-
end
|
25
|
+
include Dolt::View::Urls
|
26
|
+
include Dolt::View::SingleRepository
|
63
27
|
|
64
28
|
describe "#multiline" do
|
65
29
|
it "adds line number markup to code" do
|
@@ -89,8 +53,6 @@ describe Dolt::View::Blob do
|
|
89
53
|
end
|
90
54
|
|
91
55
|
describe "#format_binary_blob" do
|
92
|
-
include Dolt::View::SingleRepository
|
93
|
-
|
94
56
|
it "renders link to binary blob" do
|
95
57
|
content = "GIF89aK\000 \000\367\000\000\266\270\274\335\336\337\214"
|
96
58
|
html = format_binary_blob("some/file.gif", content, "gitorious", "master")
|
@@ -100,8 +62,6 @@ describe Dolt::View::Blob do
|
|
100
62
|
end
|
101
63
|
|
102
64
|
describe "#format_blob" do
|
103
|
-
include Dolt::View::SingleRepository
|
104
|
-
|
105
65
|
it "renders link to binary blob" do
|
106
66
|
content = "GIF89aK\000 \000\367\000\000\266\270\274\335\336\337\214"
|
107
67
|
html = format_blob("file.gif", content, "gitorious", "master")
|
@@ -23,44 +23,6 @@ require "libdolt/view/object"
|
|
23
23
|
describe Dolt::View::Object do
|
24
24
|
include Dolt::View::Object
|
25
25
|
|
26
|
-
describe "single repo mode" do
|
27
|
-
include Dolt::View::SingleRepository
|
28
|
-
|
29
|
-
it "returns blob url" do
|
30
|
-
object = { :type => "blob", :name => "Gemfile" }
|
31
|
-
url = object_url("myrepo", "master", "", object)
|
32
|
-
assert_equal "/blob/master:Gemfile", url
|
33
|
-
end
|
34
|
-
|
35
|
-
it "returns tree url" do
|
36
|
-
object = { :type => "tree", :name => "models" }
|
37
|
-
url = object_url("myrepo", "master", "app", object)
|
38
|
-
assert_equal "/tree/master:app/models", url
|
39
|
-
end
|
40
|
-
|
41
|
-
it "returns blob url in directory" do
|
42
|
-
object = { :type => "blob", :name => "Gemfile" }
|
43
|
-
url = object_url("myrepo", "master", "lib/mything", object)
|
44
|
-
assert_equal "/blob/master:lib/mything/Gemfile", url
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
describe "multi repo mode" do
|
49
|
-
include Dolt::View::MultiRepository
|
50
|
-
|
51
|
-
it "returns blob url" do
|
52
|
-
object = { :type => "blob", :name => "Gemfile" }
|
53
|
-
url = object_url("myrepo", "master", "", object)
|
54
|
-
assert_equal "/myrepo/blob/master:Gemfile", url
|
55
|
-
end
|
56
|
-
|
57
|
-
it "returns blob url in directory" do
|
58
|
-
object = { :type => "blob", :name => "Gemfile" }
|
59
|
-
url = object_url("myrepo", "master", "lib/mything", object)
|
60
|
-
assert_equal "/myrepo/blob/master:lib/mything/Gemfile", url
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
26
|
describe "#object_icon_class" do
|
65
27
|
it "returns blob icon type" do
|
66
28
|
assert_equal "icon-file", object_icon_class({ :type => :blob })
|
@@ -74,10 +36,4 @@ describe Dolt::View::Object do
|
|
74
36
|
assert_equal "icon-hdd", object_icon_class({ :type => :submodule })
|
75
37
|
end
|
76
38
|
end
|
77
|
-
|
78
|
-
it "links submodule object to submodule" do
|
79
|
-
url = "git://gitorious.org/gitorious/ui3.git"
|
80
|
-
object = { :type => :submodule, :url => url }
|
81
|
-
assert_equal url, object_url("gitorious", "master", "vendor", object)
|
82
|
-
end
|
83
39
|
end
|
@@ -17,17 +17,21 @@
|
|
17
17
|
#++
|
18
18
|
require "test_helper"
|
19
19
|
require "libdolt/view/single_repository"
|
20
|
+
require "libdolt/view/multi_repository"
|
20
21
|
require "libdolt/view/object"
|
21
22
|
require "libdolt/view/tree"
|
23
|
+
require "libdolt/view/urls"
|
22
24
|
require "ostruct"
|
23
25
|
|
24
26
|
describe Dolt::View::Tree do
|
25
27
|
include Dolt::Html
|
26
|
-
include Dolt::View::SingleRepository
|
27
28
|
include Dolt::View::Object
|
28
29
|
include Dolt::View::Tree
|
30
|
+
include Dolt::View::Urls
|
29
31
|
|
30
32
|
describe "#tree_entries" do
|
33
|
+
include Dolt::View::SingleRepository
|
34
|
+
|
31
35
|
before do
|
32
36
|
async = { :name => "async", :type => :tree }
|
33
37
|
disk_repo_resolver = { :type => :blob, :name => "disk_repo_resolver.rb" }
|
@@ -132,6 +136,8 @@ describe Dolt::View::Tree do
|
|
132
136
|
end
|
133
137
|
|
134
138
|
describe "#tree_context" do
|
139
|
+
include Dolt::View::SingleRepository
|
140
|
+
|
135
141
|
def context(path, maxdepth = nil)
|
136
142
|
tree_context("gitorious", "master", accumulate_path(partition_path(path, maxdepth)))
|
137
143
|
end
|
@@ -193,4 +199,48 @@ describe Dolt::View::Tree do
|
|
193
199
|
assert_equal "<a href=\"/tree/master:src/phorkie/Database\">/ Database</a>", links[3]
|
194
200
|
end
|
195
201
|
end
|
202
|
+
|
203
|
+
describe "single repo mode" do
|
204
|
+
include Dolt::View::SingleRepository
|
205
|
+
|
206
|
+
it "returns blob url" do
|
207
|
+
object = { :type => "blob", :name => "Gemfile" }
|
208
|
+
url = object_url("myrepo", "master", "", object)
|
209
|
+
assert_equal "/blob/master:Gemfile", url
|
210
|
+
end
|
211
|
+
|
212
|
+
it "returns tree url" do
|
213
|
+
object = { :type => "tree", :name => "models" }
|
214
|
+
url = object_url("myrepo", "master", "app", object)
|
215
|
+
assert_equal "/tree/master:app/models", url
|
216
|
+
end
|
217
|
+
|
218
|
+
it "returns blob url in directory" do
|
219
|
+
object = { :type => "blob", :name => "Gemfile" }
|
220
|
+
url = object_url("myrepo", "master", "lib/mything", object)
|
221
|
+
assert_equal "/blob/master:lib/mything/Gemfile", url
|
222
|
+
end
|
223
|
+
end
|
224
|
+
|
225
|
+
describe "multi repo mode" do
|
226
|
+
include Dolt::View::MultiRepository
|
227
|
+
|
228
|
+
it "returns blob url" do
|
229
|
+
object = { :type => "blob", :name => "Gemfile" }
|
230
|
+
url = object_url("myrepo", "master", "", object)
|
231
|
+
assert_equal "/myrepo/blob/master:Gemfile", url
|
232
|
+
end
|
233
|
+
|
234
|
+
it "returns blob url in directory" do
|
235
|
+
object = { :type => "blob", :name => "Gemfile" }
|
236
|
+
url = object_url("myrepo", "master", "lib/mything", object)
|
237
|
+
assert_equal "/myrepo/blob/master:lib/mything/Gemfile", url
|
238
|
+
end
|
239
|
+
end
|
240
|
+
|
241
|
+
it "links submodule object to submodule" do
|
242
|
+
url = "git://gitorious.org/gitorious/ui3.git"
|
243
|
+
object = { :type => :submodule, :url => url }
|
244
|
+
assert_equal url, object_url("gitorious", "master", "vendor", object)
|
245
|
+
end
|
196
246
|
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#--
|
3
|
+
# Copyright (C) 2012 Gitorious AS
|
4
|
+
#
|
5
|
+
# This program is free software: you can redistribute it and/or modify
|
6
|
+
# it under the terms of the GNU Affero General Public License as published by
|
7
|
+
# the Free Software Foundation, either version 3 of the License, or
|
8
|
+
# (at your option) any later version.
|
9
|
+
#
|
10
|
+
# This program is distributed in the hope that it will be useful,
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
+
# GNU Affero General Public License for more details.
|
14
|
+
#
|
15
|
+
# You should have received a copy of the GNU Affero General Public License
|
16
|
+
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
17
|
+
#++
|
18
|
+
require "test_helper"
|
19
|
+
require "libdolt/view/single_repository"
|
20
|
+
require "libdolt/view/multi_repository"
|
21
|
+
require "libdolt/view/urls"
|
22
|
+
|
23
|
+
describe Dolt::View::Urls do
|
24
|
+
include Dolt::View::Urls
|
25
|
+
|
26
|
+
describe "single repo mode" do
|
27
|
+
include Dolt::View::SingleRepository
|
28
|
+
|
29
|
+
it "returns blame url" do
|
30
|
+
url = blame_url("myrepo", "master", "some/path")
|
31
|
+
assert_equal "/blame/master:some/path", url
|
32
|
+
end
|
33
|
+
|
34
|
+
it "returns history url" do
|
35
|
+
url = history_url("myrepo", "master", "some/path")
|
36
|
+
assert_equal "/history/master:some/path", url
|
37
|
+
end
|
38
|
+
|
39
|
+
it "returns raw url" do
|
40
|
+
url = raw_url("myrepo", "master", "some/path")
|
41
|
+
assert_equal "/raw/master:some/path", url
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
describe "multi repo mode" do
|
46
|
+
include Dolt::View::MultiRepository
|
47
|
+
|
48
|
+
it "returns blame url" do
|
49
|
+
url = blame_url("myrepo", "master", "some/path")
|
50
|
+
assert_equal "/myrepo/blame/master:some/path", url
|
51
|
+
end
|
52
|
+
|
53
|
+
it "returns history url" do
|
54
|
+
url = history_url("myrepo", "master", "some/path")
|
55
|
+
assert_equal "/myrepo/history/master:some/path", url
|
56
|
+
end
|
57
|
+
|
58
|
+
it "returns raw url" do
|
59
|
+
url = raw_url("myrepo", "master", "some/path")
|
60
|
+
assert_equal "/myrepo/raw/master:some/path", url
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
data/test/test_helper.rb
CHANGED
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: libdolt
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 3
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 6
|
9
|
-
-
|
10
|
-
version: 0.6.
|
9
|
+
- 2
|
10
|
+
version: 0.6.2
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Christian Johansen
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2012-10-
|
18
|
+
date: 2012-10-10 00:00:00 +02:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -34,9 +34,23 @@ dependencies:
|
|
34
34
|
type: :runtime
|
35
35
|
version_requirements: *id001
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
|
-
name:
|
37
|
+
name: when
|
38
38
|
prerelease: false
|
39
39
|
requirement: &id002 !ruby/object:Gem::Requirement
|
40
|
+
none: false
|
41
|
+
requirements:
|
42
|
+
- - ~>
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
hash: 3
|
45
|
+
segments:
|
46
|
+
- 0
|
47
|
+
version: "0"
|
48
|
+
type: :runtime
|
49
|
+
version_requirements: *id002
|
50
|
+
- !ruby/object:Gem::Dependency
|
51
|
+
name: em_pessimistic
|
52
|
+
prerelease: false
|
53
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
40
54
|
none: false
|
41
55
|
requirements:
|
42
56
|
- - ~>
|
@@ -47,11 +61,11 @@ dependencies:
|
|
47
61
|
- 1
|
48
62
|
version: "0.1"
|
49
63
|
type: :runtime
|
50
|
-
version_requirements: *
|
64
|
+
version_requirements: *id003
|
51
65
|
- !ruby/object:Gem::Dependency
|
52
66
|
name: em_rugged
|
53
67
|
prerelease: false
|
54
|
-
requirement: &
|
68
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
55
69
|
none: false
|
56
70
|
requirements:
|
57
71
|
- - ~>
|
@@ -63,11 +77,11 @@ dependencies:
|
|
63
77
|
- 2
|
64
78
|
version: 0.1.2
|
65
79
|
type: :runtime
|
66
|
-
version_requirements: *
|
80
|
+
version_requirements: *id004
|
67
81
|
- !ruby/object:Gem::Dependency
|
68
82
|
name: tzinfo
|
69
83
|
prerelease: false
|
70
|
-
requirement: &
|
84
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
71
85
|
none: false
|
72
86
|
requirements:
|
73
87
|
- - ~>
|
@@ -78,11 +92,11 @@ dependencies:
|
|
78
92
|
- 3
|
79
93
|
version: "0.3"
|
80
94
|
type: :runtime
|
81
|
-
version_requirements: *
|
95
|
+
version_requirements: *id005
|
82
96
|
- !ruby/object:Gem::Dependency
|
83
97
|
name: makeup
|
84
98
|
prerelease: false
|
85
|
-
requirement: &
|
99
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
86
100
|
none: false
|
87
101
|
requirements:
|
88
102
|
- - ~>
|
@@ -92,11 +106,11 @@ dependencies:
|
|
92
106
|
- 0
|
93
107
|
version: "0"
|
94
108
|
type: :runtime
|
95
|
-
version_requirements: *
|
109
|
+
version_requirements: *id006
|
96
110
|
- !ruby/object:Gem::Dependency
|
97
111
|
name: htmlentities
|
98
112
|
prerelease: false
|
99
|
-
requirement: &
|
113
|
+
requirement: &id007 !ruby/object:Gem::Requirement
|
100
114
|
none: false
|
101
115
|
requirements:
|
102
116
|
- - ~>
|
@@ -107,11 +121,11 @@ dependencies:
|
|
107
121
|
- 3
|
108
122
|
version: "4.3"
|
109
123
|
type: :runtime
|
110
|
-
version_requirements: *
|
124
|
+
version_requirements: *id007
|
111
125
|
- !ruby/object:Gem::Dependency
|
112
126
|
name: json
|
113
127
|
prerelease: false
|
114
|
-
requirement: &
|
128
|
+
requirement: &id008 !ruby/object:Gem::Requirement
|
115
129
|
none: false
|
116
130
|
requirements:
|
117
131
|
- - ~>
|
@@ -122,11 +136,11 @@ dependencies:
|
|
122
136
|
- 7
|
123
137
|
version: "1.7"
|
124
138
|
type: :runtime
|
125
|
-
version_requirements: *
|
139
|
+
version_requirements: *id008
|
126
140
|
- !ruby/object:Gem::Dependency
|
127
141
|
name: mime-types
|
128
142
|
prerelease: false
|
129
|
-
requirement: &
|
143
|
+
requirement: &id009 !ruby/object:Gem::Requirement
|
130
144
|
none: false
|
131
145
|
requirements:
|
132
146
|
- - ~>
|
@@ -137,11 +151,11 @@ dependencies:
|
|
137
151
|
- 19
|
138
152
|
version: "1.19"
|
139
153
|
type: :runtime
|
140
|
-
version_requirements: *
|
154
|
+
version_requirements: *id009
|
141
155
|
- !ruby/object:Gem::Dependency
|
142
156
|
name: minitest
|
143
157
|
prerelease: false
|
144
|
-
requirement: &
|
158
|
+
requirement: &id010 !ruby/object:Gem::Requirement
|
145
159
|
none: false
|
146
160
|
requirements:
|
147
161
|
- - ~>
|
@@ -152,11 +166,11 @@ dependencies:
|
|
152
166
|
- 0
|
153
167
|
version: "2.0"
|
154
168
|
type: :development
|
155
|
-
version_requirements: *
|
169
|
+
version_requirements: *id010
|
156
170
|
- !ruby/object:Gem::Dependency
|
157
171
|
name: em-minitest-spec
|
158
172
|
prerelease: false
|
159
|
-
requirement: &
|
173
|
+
requirement: &id011 !ruby/object:Gem::Requirement
|
160
174
|
none: false
|
161
175
|
requirements:
|
162
176
|
- - ~>
|
@@ -167,11 +181,11 @@ dependencies:
|
|
167
181
|
- 1
|
168
182
|
version: "1.1"
|
169
183
|
type: :development
|
170
|
-
version_requirements: *
|
184
|
+
version_requirements: *id011
|
171
185
|
- !ruby/object:Gem::Dependency
|
172
186
|
name: rake
|
173
187
|
prerelease: false
|
174
|
-
requirement: &
|
188
|
+
requirement: &id012 !ruby/object:Gem::Requirement
|
175
189
|
none: false
|
176
190
|
requirements:
|
177
191
|
- - ~>
|
@@ -182,11 +196,11 @@ dependencies:
|
|
182
196
|
- 9
|
183
197
|
version: "0.9"
|
184
198
|
type: :development
|
185
|
-
version_requirements: *
|
199
|
+
version_requirements: *id012
|
186
200
|
- !ruby/object:Gem::Dependency
|
187
201
|
name: redcarpet
|
188
202
|
prerelease: false
|
189
|
-
requirement: &
|
203
|
+
requirement: &id013 !ruby/object:Gem::Requirement
|
190
204
|
none: false
|
191
205
|
requirements:
|
192
206
|
- - ">="
|
@@ -196,11 +210,11 @@ dependencies:
|
|
196
210
|
- 0
|
197
211
|
version: "0"
|
198
212
|
type: :development
|
199
|
-
version_requirements: *
|
213
|
+
version_requirements: *id013
|
200
214
|
- !ruby/object:Gem::Dependency
|
201
215
|
name: tiltout
|
202
216
|
prerelease: false
|
203
|
-
requirement: &
|
217
|
+
requirement: &id014 !ruby/object:Gem::Requirement
|
204
218
|
none: false
|
205
219
|
requirements:
|
206
220
|
- - ~>
|
@@ -210,7 +224,7 @@ dependencies:
|
|
210
224
|
- 1
|
211
225
|
version: "1"
|
212
226
|
type: :development
|
213
|
-
version_requirements: *
|
227
|
+
version_requirements: *id014
|
214
228
|
description: Dolt API for serving git trees and syntax highlighted blobs
|
215
229
|
email:
|
216
230
|
- christian@gitorious.org
|
@@ -226,13 +240,13 @@ files:
|
|
226
240
|
- Rakefile
|
227
241
|
- Readme.md
|
228
242
|
- lib/libdolt.rb
|
229
|
-
- lib/libdolt/async/when.rb
|
230
243
|
- lib/libdolt/disk_repo_resolver.rb
|
231
244
|
- lib/libdolt/git/blame.rb
|
232
245
|
- lib/libdolt/git/commit.rb
|
233
246
|
- lib/libdolt/git/repository.rb
|
234
247
|
- lib/libdolt/git/submodule.rb
|
235
248
|
- lib/libdolt/git/tree.rb
|
249
|
+
- lib/libdolt/gitorious_repo_resolver.rb
|
236
250
|
- lib/libdolt/repo_actions.rb
|
237
251
|
- lib/libdolt/version.rb
|
238
252
|
- lib/libdolt/view.rb
|
@@ -250,8 +264,8 @@ files:
|
|
250
264
|
- lib/libdolt/view/syntax_highlight.rb
|
251
265
|
- lib/libdolt/view/tab_width.rb
|
252
266
|
- lib/libdolt/view/tree.rb
|
267
|
+
- lib/libdolt/view/urls.rb
|
253
268
|
- libdolt.gemspec
|
254
|
-
- test/libdolt/async/when_test.rb
|
255
269
|
- test/libdolt/git/blame_test.rb
|
256
270
|
- test/libdolt/git/commit_test.rb
|
257
271
|
- test/libdolt/git/repository_test.rb
|
@@ -277,6 +291,7 @@ files:
|
|
277
291
|
- test/libdolt/view/syntax_highlight_test.rb
|
278
292
|
- test/libdolt/view/tab_width_test.rb
|
279
293
|
- test/libdolt/view/tree_test.rb
|
294
|
+
- test/libdolt/view/urls_test.rb
|
280
295
|
- test/test_helper.rb
|
281
296
|
- views/500.erb
|
282
297
|
- views/blame.erb
|
data/lib/libdolt/async/when.rb
DELETED
@@ -1,128 +0,0 @@
|
|
1
|
-
require "eventmachine"
|
2
|
-
|
3
|
-
module When
|
4
|
-
class Promise
|
5
|
-
def initialize(deferred = EM::DefaultDeferrable.new)
|
6
|
-
@deferred = deferred
|
7
|
-
end
|
8
|
-
|
9
|
-
def callback(&block)
|
10
|
-
@deferred.callback(&block)
|
11
|
-
self
|
12
|
-
end
|
13
|
-
|
14
|
-
def errback(&block)
|
15
|
-
@deferred.errback(&block)
|
16
|
-
self
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
class Resolver
|
21
|
-
def initialize(deferred = EM::DefaultDeferrable.new)
|
22
|
-
@deferred = deferred
|
23
|
-
@resolved = false
|
24
|
-
end
|
25
|
-
|
26
|
-
def resolve(*args)
|
27
|
-
mark_resolved
|
28
|
-
@deferred.succeed(*args)
|
29
|
-
end
|
30
|
-
|
31
|
-
def reject(*args)
|
32
|
-
mark_resolved
|
33
|
-
@deferred.fail(*args)
|
34
|
-
end
|
35
|
-
|
36
|
-
def resolved?
|
37
|
-
@resolved
|
38
|
-
end
|
39
|
-
|
40
|
-
private
|
41
|
-
def mark_resolved
|
42
|
-
raise StandardError.new("Already resolved") if @resolved
|
43
|
-
@resolved = true
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
class Deferred
|
48
|
-
attr_reader :resolver, :promise
|
49
|
-
|
50
|
-
def initialize
|
51
|
-
deferred = EM::DefaultDeferrable.new
|
52
|
-
@resolver = Resolver.new(deferred)
|
53
|
-
@promise = Promise.new(deferred)
|
54
|
-
end
|
55
|
-
|
56
|
-
def resolve(*args)
|
57
|
-
@resolver.resolve(*args)
|
58
|
-
end
|
59
|
-
|
60
|
-
def reject(*args)
|
61
|
-
@resolver.reject(*args)
|
62
|
-
end
|
63
|
-
|
64
|
-
def callback(&block)
|
65
|
-
@promise.callback(&block)
|
66
|
-
end
|
67
|
-
|
68
|
-
def errback(&block)
|
69
|
-
@promise.errback(&block)
|
70
|
-
end
|
71
|
-
|
72
|
-
def resolved?
|
73
|
-
@resolver.resolved?
|
74
|
-
end
|
75
|
-
|
76
|
-
def self.resolved(value)
|
77
|
-
d = self.new
|
78
|
-
d.resolve(value)
|
79
|
-
d
|
80
|
-
end
|
81
|
-
|
82
|
-
def self.rejected(value)
|
83
|
-
d = self.new
|
84
|
-
d.reject(value)
|
85
|
-
d
|
86
|
-
end
|
87
|
-
end
|
88
|
-
|
89
|
-
def self.deferred(val)
|
90
|
-
return val if val.respond_to?(:callback) && val.respond_to?(:errback)
|
91
|
-
Deferred.resolved(val).promise
|
92
|
-
end
|
93
|
-
|
94
|
-
def self.all(promises)
|
95
|
-
raise(ArgumentError, "expected enumerable promises") if !promises.is_a?(Enumerable)
|
96
|
-
resolved = 0
|
97
|
-
results = []
|
98
|
-
d = Deferred.new
|
99
|
-
|
100
|
-
attempt_resolution = lambda do |err, res|
|
101
|
-
break if d.resolved?
|
102
|
-
if err.nil?
|
103
|
-
d.resolve(res) if promises.length == resolved
|
104
|
-
else
|
105
|
-
d.reject(err)
|
106
|
-
end
|
107
|
-
end
|
108
|
-
|
109
|
-
wait_for_all(promises) do |err, result, index|
|
110
|
-
resolved += 1
|
111
|
-
results[index] = result
|
112
|
-
attempt_resolution.call(err, results)
|
113
|
-
end
|
114
|
-
|
115
|
-
attempt_resolution.call(nil, results) if promises.length == 0
|
116
|
-
d.promise
|
117
|
-
end
|
118
|
-
|
119
|
-
private
|
120
|
-
def self.wait_for_all(promises, &block)
|
121
|
-
promises.each_with_index do |p, i|
|
122
|
-
p.callback do |result|
|
123
|
-
block.call(nil, result, i)
|
124
|
-
end
|
125
|
-
p.errback { |e| block.call(e, nil, i) }
|
126
|
-
end
|
127
|
-
end
|
128
|
-
end
|
@@ -1,112 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
#--
|
3
|
-
# Copyright (C) 2012 Gitorious AS
|
4
|
-
#
|
5
|
-
# This program is free software: you can redistribute it and/or modify
|
6
|
-
# it under the terms of the GNU Affero General Public License as published by
|
7
|
-
# the Free Software Foundation, either version 3 of the License, or
|
8
|
-
# (at your option) any later version.
|
9
|
-
#
|
10
|
-
# This program is distributed in the hope that it will be useful,
|
11
|
-
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
-
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
-
# GNU Affero General Public License for more details.
|
14
|
-
#
|
15
|
-
# You should have received a copy of the GNU Affero General Public License
|
16
|
-
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
17
|
-
#++
|
18
|
-
require "test_helper"
|
19
|
-
require "libdolt/async/when"
|
20
|
-
|
21
|
-
describe When do
|
22
|
-
include EM::MiniTest::Spec
|
23
|
-
|
24
|
-
describe ".all" do
|
25
|
-
it "returns deferrable" do
|
26
|
-
d = When.all([When.deferred(42)])
|
27
|
-
assert d.respond_to?(:callback)
|
28
|
-
assert d.respond_to?(:errback)
|
29
|
-
end
|
30
|
-
|
31
|
-
it "resolves immediately if no promises" do
|
32
|
-
d = When.all([])
|
33
|
-
d.callback do |results|
|
34
|
-
assert_equal [], results
|
35
|
-
done!
|
36
|
-
end
|
37
|
-
wait!
|
38
|
-
end
|
39
|
-
|
40
|
-
it "resolves when single deferrable resolves" do
|
41
|
-
deferred = When::Deferred.new
|
42
|
-
d = When.all([deferred.promise])
|
43
|
-
resolved = false
|
44
|
-
d.callback { |results| resolved = true }
|
45
|
-
|
46
|
-
assert !resolved
|
47
|
-
deferred.resolve(42)
|
48
|
-
assert resolved
|
49
|
-
end
|
50
|
-
|
51
|
-
it "resolves when all deferrables are resolved" do
|
52
|
-
deferreds = [When::Deferred.new, When::Deferred.new, When::Deferred.new]
|
53
|
-
d = When.all(deferreds.map(&:promise))
|
54
|
-
resolved = false
|
55
|
-
d.callback { |results| resolved = true }
|
56
|
-
|
57
|
-
assert !resolved
|
58
|
-
deferreds[0].resolve(42)
|
59
|
-
assert !resolved
|
60
|
-
deferreds[1].resolve(13)
|
61
|
-
assert !resolved
|
62
|
-
deferreds[2].resolve(3)
|
63
|
-
assert resolved
|
64
|
-
end
|
65
|
-
|
66
|
-
it "rejects when single deferrable rejects" do
|
67
|
-
deferred = When::Deferred.new
|
68
|
-
d = When.all([deferred.promise])
|
69
|
-
rejected = false
|
70
|
-
d.errback { |results| rejected = true }
|
71
|
-
|
72
|
-
assert !rejected
|
73
|
-
deferred.reject(StandardError.new)
|
74
|
-
assert rejected
|
75
|
-
end
|
76
|
-
|
77
|
-
it "rejects on first rejection" do
|
78
|
-
deferreds = [When::Deferred.new, When::Deferred.new, When::Deferred.new]
|
79
|
-
d = When.all(deferreds.map(&:promise))
|
80
|
-
rejected = false
|
81
|
-
d.errback { |results| rejected = true }
|
82
|
-
|
83
|
-
deferreds[0].resolve(42)
|
84
|
-
deferreds[2].reject(StandardError.new)
|
85
|
-
deferreds[1].resolve(13)
|
86
|
-
|
87
|
-
assert rejected
|
88
|
-
end
|
89
|
-
|
90
|
-
it "proxies resolution vaule in array" do
|
91
|
-
deferred = When::Deferred.new
|
92
|
-
d = When.all([deferred.promise])
|
93
|
-
results = nil
|
94
|
-
d.callback { |res| results = res }
|
95
|
-
|
96
|
-
deferred.resolve(42)
|
97
|
-
assert_equal [42], results
|
98
|
-
end
|
99
|
-
|
100
|
-
it "orders results like input" do
|
101
|
-
deferred1 = When::Deferred.new
|
102
|
-
deferred2 = When::Deferred.new
|
103
|
-
d = When.all([deferred1.promise, deferred2.promise])
|
104
|
-
results = nil
|
105
|
-
d.callback { |res| results = res }
|
106
|
-
|
107
|
-
deferred2.resolve(42)
|
108
|
-
deferred1.resolve(13)
|
109
|
-
assert_equal [13, 42], results
|
110
|
-
end
|
111
|
-
end
|
112
|
-
end
|