libdolt 0.6.0 → 0.6.2
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/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
|