taskwarrior-web 1.1.2 → 1.1.3
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.md +5 -0
- data/lib/taskwarrior-web/app.rb +13 -22
- data/lib/taskwarrior-web/helpers.rb +10 -5
- data/lib/taskwarrior-web/model/task.rb +18 -4
- data/lib/taskwarrior-web/views/404.erb +2 -3
- data/lib/taskwarrior-web/views/layout.erb +6 -7
- data/lib/taskwarrior-web/views/listing.erb +1 -1
- data/lib/taskwarrior-web/views/new_task.erb +6 -0
- data/spec/app/app_spec.rb +109 -6
- data/spec/app/helpers_spec.rb +14 -6
- data/spec/services/builder/base_spec.rb +1 -1
- data/spec/services/runner_spec.rb +1 -1
- data/taskwarrior-web.gemspec +2 -1
- metadata +38 -27
data/CHANGELOG.md
CHANGED
data/lib/taskwarrior-web/app.rb
CHANGED
@@ -31,17 +31,12 @@ class TaskwarriorWeb::App < Sinatra::Base
|
|
31
31
|
protected! if TaskwarriorWeb::Config.property('task-web.user')
|
32
32
|
end
|
33
33
|
|
34
|
-
# Redirects
|
35
|
-
get('/') { redirect to('/tasks/pending') }
|
36
|
-
get('/tasks/?') { redirect to('/tasks/pending') }
|
37
|
-
get('/projects/?') { redirect to('/projects/overview') }
|
38
|
-
|
39
34
|
# Task routes
|
40
35
|
get '/tasks/:status/?' do
|
41
36
|
pass unless ['pending', 'waiting', 'completed', 'deleted'].include?(params[:status])
|
42
37
|
@title = "Tasks"
|
43
38
|
if params[:status] == 'pending' && filter = TaskwarriorWeb::Config.property('task-web.filter')
|
44
|
-
@tasks = TaskwarriorWeb::Task.query(
|
39
|
+
@tasks = TaskwarriorWeb::Task.query(filter)
|
45
40
|
else
|
46
41
|
@tasks = TaskwarriorWeb::Task.find_by_status(params[:status])
|
47
42
|
end
|
@@ -65,11 +60,11 @@ class TaskwarriorWeb::App < Sinatra::Base
|
|
65
60
|
end
|
66
61
|
|
67
62
|
flash.now[:error] = @task._errors.join(', ')
|
68
|
-
|
63
|
+
erb :new_task
|
69
64
|
end
|
70
65
|
|
71
66
|
get '/tasks/:uuid/?' do
|
72
|
-
not_found
|
67
|
+
not_found unless TaskwarriorWeb::Config.supports?(:editing)
|
73
68
|
tasks = TaskwarriorWeb::Task.find_by_uuid(params[:uuid])
|
74
69
|
not_found if tasks.empty?
|
75
70
|
@task = tasks.first
|
@@ -78,7 +73,7 @@ class TaskwarriorWeb::App < Sinatra::Base
|
|
78
73
|
end
|
79
74
|
|
80
75
|
patch '/tasks/:uuid/?' do
|
81
|
-
not_found
|
76
|
+
not_found unless TaskwarriorWeb::Config.supports?(:editing)
|
82
77
|
not_found if TaskwarriorWeb::Task.find_by_uuid(params[:uuid]).empty?
|
83
78
|
|
84
79
|
@task = TaskwarriorWeb::Task.new(params[:task])
|
@@ -89,11 +84,11 @@ class TaskwarriorWeb::App < Sinatra::Base
|
|
89
84
|
end
|
90
85
|
|
91
86
|
flash.now[:error] = @task._errors.join(', ')
|
92
|
-
|
87
|
+
erb :edit_task
|
93
88
|
end
|
94
89
|
|
95
90
|
get '/tasks/:uuid/delete/?' do
|
96
|
-
not_found
|
91
|
+
not_found unless TaskwarriorWeb::Config.supports?(:editing)
|
97
92
|
tasks = TaskwarriorWeb::Task.find_by_uuid(params[:uuid])
|
98
93
|
not_found if tasks.empty?
|
99
94
|
@task = tasks.first
|
@@ -102,7 +97,7 @@ class TaskwarriorWeb::App < Sinatra::Base
|
|
102
97
|
end
|
103
98
|
|
104
99
|
delete '/tasks/:uuid' do
|
105
|
-
not_found
|
100
|
+
not_found unless TaskwarriorWeb::Config.supports?(:editing)
|
106
101
|
tasks = TaskwarriorWeb::Task.find_by_uuid(params[:uuid])
|
107
102
|
not_found if tasks.empty?
|
108
103
|
@task = tasks.first
|
@@ -128,24 +123,20 @@ class TaskwarriorWeb::App < Sinatra::Base
|
|
128
123
|
erb :project
|
129
124
|
end
|
130
125
|
|
126
|
+
# Redirects
|
127
|
+
get('/') { redirect to('/tasks/pending') }
|
128
|
+
get('/tasks/?') { redirect to('/tasks/pending') }
|
129
|
+
get('/projects/?') { redirect to('/projects/overview') }
|
130
|
+
|
131
131
|
# AJAX callbacks
|
132
132
|
get('/ajax/projects/?') { TaskwarriorWeb::Command.new(:projects).run.split("\n").to_json }
|
133
133
|
get('/ajax/count/?') { task_count }
|
134
134
|
post('/ajax/task-complete/:id/?') { TaskwarriorWeb::Command.new(:complete, params[:id]).run }
|
135
|
-
|
136
|
-
get '/ajax/badge/?' do
|
137
|
-
if filter = TaskwarriorWeb::Config.property('task-web.filter.badge')
|
138
|
-
total = TaskwarriorWeb::Task.query(:description => filter).count
|
139
|
-
else
|
140
|
-
total = task_count
|
141
|
-
end
|
142
|
-
total == 0 ? '' : total.to_s
|
143
|
-
end
|
135
|
+
get('/ajax/badge/?') { badge_count }
|
144
136
|
|
145
137
|
# Error handling
|
146
138
|
not_found do
|
147
139
|
@title = 'Page Not Found'
|
148
|
-
@referrer = request.referrer
|
149
140
|
erb :'404'
|
150
141
|
end
|
151
142
|
end
|
@@ -36,13 +36,22 @@ module TaskwarriorWeb::App::Helpers
|
|
36
36
|
|
37
37
|
def task_count
|
38
38
|
if filter = TaskwarriorWeb::Config.property('task-web.filter')
|
39
|
-
total = TaskwarriorWeb::Task.query(
|
39
|
+
total = TaskwarriorWeb::Task.query(filter).count
|
40
40
|
else
|
41
41
|
total = TaskwarriorWeb::Task.count(:status => :pending)
|
42
42
|
end
|
43
43
|
total.to_s
|
44
44
|
end
|
45
45
|
|
46
|
+
def badge_count
|
47
|
+
if filter = TaskwarriorWeb::Config.property('task-web.filter.badge')
|
48
|
+
total = TaskwarriorWeb::Task.query(filter).count
|
49
|
+
else
|
50
|
+
total = task_count
|
51
|
+
end
|
52
|
+
total == 0 ? '' : total.to_s
|
53
|
+
end
|
54
|
+
|
46
55
|
def progress_bar(tasks)
|
47
56
|
return 0 if tasks.empty?
|
48
57
|
doneness = (tasks.select { |t| t.status == 'completed' }.count.to_f / tasks.count.to_f) * 100
|
@@ -71,8 +80,4 @@ module TaskwarriorWeb::App::Helpers
|
|
71
80
|
values = [TaskwarriorWeb::Config.property('task-web.user'), TaskwarriorWeb::Config.property('task-web.passwd')]
|
72
81
|
@auth.provided? && @auth.basic? && @auth.credentials && @auth.credentials == values
|
73
82
|
end
|
74
|
-
|
75
|
-
def forward(url, method = 'GET')
|
76
|
-
call env.merge('REQUEST_METHOD' => method, 'PATH_INFO' => url)
|
77
|
-
end
|
78
83
|
end
|
@@ -57,15 +57,29 @@ module TaskwarriorWeb
|
|
57
57
|
# CLASS METHODS FOR QUERYING TASKS
|
58
58
|
##################################
|
59
59
|
|
60
|
-
|
60
|
+
##
|
61
|
+
# Run queries, returns an array of tasks that meet the criteria.
|
62
|
+
#
|
63
|
+
# Filters can either be a hash of conditions, or an already-constructed
|
64
|
+
# taskwarrior filter string.
|
65
|
+
#
|
66
|
+
# For example:
|
67
|
+
# { :description => 'test', 'project.not' => '' }
|
68
|
+
# 'description:test project.not:'
|
69
|
+
|
61
70
|
def self.query(*args)
|
62
71
|
tasks = []
|
63
|
-
|
64
|
-
|
72
|
+
if !args.empty? && args.first.is_a?(String)
|
73
|
+
command = Command.new(:query, nil, :description => args.first)
|
74
|
+
else
|
75
|
+
command = Command.new(:query, nil, *args)
|
76
|
+
end
|
77
|
+
Parser.parse(command.run).each { |result| tasks << Task.new(result) }
|
65
78
|
tasks
|
66
79
|
end
|
67
80
|
|
68
|
-
|
81
|
+
##
|
82
|
+
# Get the number of tasks for some paramters.
|
69
83
|
def self.count(*args)
|
70
84
|
self.query(*args).count
|
71
85
|
end
|
@@ -1,3 +1,2 @@
|
|
1
|
-
Aww bummer. Taskwarrior doesn't know what to do with <%= @current_page
|
2
|
-
<
|
3
|
-
<a href="<%= @referrer %>">Go back from whence you came</a>
|
1
|
+
<p>Aww bummer. Taskwarrior doesn't know what to do with <%= @current_page %>.</p>
|
2
|
+
<p>Go <a href="<%= back %>">back</a> or <a href="/tasks">to the main task page</a>.</p>
|
@@ -3,15 +3,14 @@
|
|
3
3
|
<title><%= @title %> | TaskwarriorWeb</title>
|
4
4
|
|
5
5
|
<!-- Styles -->
|
6
|
-
|
7
|
-
|
8
|
-
|
6
|
+
<% ['bootstrap.min', 'datepicker', 'styles'].each do |file| %>
|
7
|
+
<link rel="stylesheet" href="<%= url("/css/#{file}.css") %>">
|
8
|
+
<% end %>
|
9
9
|
|
10
10
|
<!-- Scripts -->
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
<script type="text/javascript" src="/js/application.js"></script>
|
11
|
+
<% ['jquery.min', 'bootstrap', 'bootstrap-datepicker', 'application'].each do |file| %>
|
12
|
+
<link rel="stylesheet" href="<%= url("/js/#{file}.js") %>">
|
13
|
+
<% end %>
|
15
14
|
</head>
|
16
15
|
|
17
16
|
<body data-spy="scroll" data-offset="60" data-target="#sidebar">
|
data/spec/app/app_spec.rb
CHANGED
@@ -31,7 +31,7 @@ describe TaskwarriorWeb::App do
|
|
31
31
|
describe 'GET /tasks/new' do
|
32
32
|
it 'should display a new task form' do
|
33
33
|
get '/tasks/new'
|
34
|
-
last_response.body.should
|
34
|
+
last_response.body.should have_tag('form', :with => { :action => '/tasks' })
|
35
35
|
end
|
36
36
|
|
37
37
|
it 'should display a 200 status code' do
|
@@ -70,17 +70,18 @@ describe TaskwarriorWeb::App do
|
|
70
70
|
|
71
71
|
it 'should render the task form' do
|
72
72
|
task = TaskwarriorWeb::Task.new({:tags => 'tag1, tag2'})
|
73
|
-
TaskwarriorWeb::Task.should_receive(:new).
|
73
|
+
TaskwarriorWeb::Task.should_receive(:new).any_number_of_times.and_return(task)
|
74
74
|
post '/tasks', :task => {}
|
75
|
-
last_response.body.should
|
76
|
-
|
75
|
+
last_response.body.should have_tag('form') do
|
76
|
+
with_tag('input', :with => { :name => 'task[tags]' , :value => 'tag1, tag2' })
|
77
|
+
end
|
77
78
|
end
|
78
79
|
|
79
80
|
it 'should display errors messages' do
|
80
81
|
task = TaskwarriorWeb::Task.new
|
81
|
-
TaskwarriorWeb::Task.should_receive(:new).
|
82
|
+
TaskwarriorWeb::Task.should_receive(:new).any_number_of_times.and_return(task)
|
82
83
|
post '/tasks', :task => {}
|
83
|
-
last_response.body.should
|
84
|
+
last_response.body.should have_tag('.alert-error')
|
84
85
|
end
|
85
86
|
end
|
86
87
|
end
|
@@ -129,6 +130,31 @@ describe TaskwarriorWeb::App do
|
|
129
130
|
last_response.should be_not_found
|
130
131
|
end
|
131
132
|
end
|
133
|
+
|
134
|
+
context 'given an existing task' do
|
135
|
+
before do
|
136
|
+
TaskwarriorWeb::Task.should_receive(:find_by_uuid).and_return(['hello'])
|
137
|
+
end
|
138
|
+
|
139
|
+
it 'should render an error message if the task is invalid' do
|
140
|
+
patch '/tasks/23455', :task => { :tags => 'test, tags' }
|
141
|
+
last_response.body.should have_tag('form')
|
142
|
+
last_response.body.should have_tag('#flash-messages') do
|
143
|
+
with_tag('.alert-error', :text => /description/)
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
it 'should save the task and redirect if the task is valid' do
|
148
|
+
task = TaskwarriorWeb::Task.new({ :description => 'Test task' })
|
149
|
+
task.should_receive(:is_valid?).and_return(true)
|
150
|
+
task.should_receive(:save!).once.and_return('A message!')
|
151
|
+
TaskwarriorWeb::Task.should_receive(:new).and_return(task)
|
152
|
+
patch '/tasks/2356', :task => { :description => 'Test task' }
|
153
|
+
last_response.should be_redirect
|
154
|
+
follow_redirect!
|
155
|
+
last_request.url.should =~ /\/tasks\/?$/
|
156
|
+
end
|
157
|
+
end
|
132
158
|
end
|
133
159
|
|
134
160
|
describe 'GET /tasks/:uuid/delete' do
|
@@ -230,6 +256,34 @@ describe TaskwarriorWeb::App do
|
|
230
256
|
end
|
231
257
|
end
|
232
258
|
|
259
|
+
describe 'GET /ajax/badge' do
|
260
|
+
context 'given a filter specified in .taskrc' do
|
261
|
+
before do
|
262
|
+
TaskwarriorWeb::Config.should_receive(:property).with('task-web.filter.badge').and_return('a filter')
|
263
|
+
end
|
264
|
+
|
265
|
+
it 'should get the count by runnng the filter' do
|
266
|
+
TaskwarriorWeb::Task.should_receive(:query).once.with('a filter').and_return([])
|
267
|
+
get '/ajax/badge'
|
268
|
+
end
|
269
|
+
end
|
270
|
+
|
271
|
+
it 'should return the count as a string' do
|
272
|
+
TaskwarriorWeb::Config.should_receive(:property).with('task-web.filter.badge').and_return('a filter')
|
273
|
+
TaskwarriorWeb::Task.should_receive(:query).with('a filter').and_return(['test'])
|
274
|
+
get '/ajax/badge'
|
275
|
+
last_response.body.should eq('1')
|
276
|
+
last_response.body.should be_a(String)
|
277
|
+
end
|
278
|
+
|
279
|
+
it 'should return an empty string if the count is zero' do
|
280
|
+
TaskwarriorWeb::Config.should_receive(:property).with('task-web.filter.badge').and_return('a filter')
|
281
|
+
TaskwarriorWeb::Task.should_receive(:query).with('a filter').and_return([])
|
282
|
+
get '/ajax/badge'
|
283
|
+
last_response.body.should eq('')
|
284
|
+
end
|
285
|
+
end
|
286
|
+
|
233
287
|
describe 'not_found' do
|
234
288
|
it 'should set the title to "Not Found"' do
|
235
289
|
get '/page-not-found'
|
@@ -241,4 +295,53 @@ describe TaskwarriorWeb::App do
|
|
241
295
|
last_response.should be_not_found
|
242
296
|
end
|
243
297
|
end
|
298
|
+
|
299
|
+
end
|
300
|
+
|
301
|
+
describe 'HTTP authentication' do
|
302
|
+
include Rack::Test::Methods
|
303
|
+
|
304
|
+
def app
|
305
|
+
TaskwarriorWeb::App
|
306
|
+
end
|
307
|
+
|
308
|
+
before do
|
309
|
+
TaskwarriorWeb::Config.should_receive(:property).with('task-web.filter').any_number_of_times.and_return(nil)
|
310
|
+
TaskwarriorWeb::Runner.should_receive(:run).any_number_of_times.and_return('{}')
|
311
|
+
end
|
312
|
+
|
313
|
+
context 'when credentials are specified in .taskrc' do
|
314
|
+
before do
|
315
|
+
TaskwarriorWeb::Config.should_receive(:property).with('task-web.user').any_number_of_times.and_return('test_user')
|
316
|
+
TaskwarriorWeb::Config.should_receive(:property).with('task-web.passwd').and_return('test_pass')
|
317
|
+
end
|
318
|
+
|
319
|
+
it 'should ask for authentication' do
|
320
|
+
get '/tasks/new'
|
321
|
+
last_response.should be_client_error
|
322
|
+
end
|
323
|
+
|
324
|
+
it 'should only accept the configured credentials' do
|
325
|
+
authorize 'bad', 'user'
|
326
|
+
get '/tasks/new'
|
327
|
+
last_response.should be_client_error
|
328
|
+
end
|
329
|
+
|
330
|
+
it 'should pass when the correct credentials are given' do
|
331
|
+
authorize 'test_user', 'test_pass'
|
332
|
+
get '/tasks/new'
|
333
|
+
last_response.should be_ok
|
334
|
+
end
|
335
|
+
end
|
336
|
+
|
337
|
+
context 'when no credentials are specified in .taskrc' do
|
338
|
+
before do
|
339
|
+
TaskwarriorWeb::Config.should_receive(:property).with('task-web.user').any_number_of_times.and_return(nil)
|
340
|
+
end
|
341
|
+
|
342
|
+
it 'should bypass authentication' do
|
343
|
+
get '/tasks/new'
|
344
|
+
last_response.should be_ok
|
345
|
+
end
|
346
|
+
end
|
244
347
|
end
|
data/spec/app/helpers_spec.rb
CHANGED
@@ -16,22 +16,30 @@ describe TaskwarriorWeb::App::Helpers do
|
|
16
16
|
end
|
17
17
|
|
18
18
|
it 'should format various dates and times to the default format' do
|
19
|
-
helpers.format_date('2012-01-11 12:23:00').should
|
20
|
-
helpers.format_date('2012-01-11').should
|
19
|
+
helpers.format_date('2012-01-11 12:23:00').should eq('1/11/2012')
|
20
|
+
helpers.format_date('2012-01-11').should eq('1/11/2012')
|
21
|
+
helpers.format_date('20121231T230000Z').should eq(Time.parse('20121231T230000Z').localtime.strftime('%-m/%-d/%Y'))
|
22
|
+
|
23
|
+
# This test will fail if run in UTC :-)
|
24
|
+
if Time.current.zone == 'UTC'
|
25
|
+
helpers.format_date('20121231T230000Z').should eq(Time.parse('20121231T230000Z').strftime('%-m/%-d/%Y'))
|
26
|
+
else
|
27
|
+
helpers.format_date('20121231T230000Z').should_not eq(Time.parse('20121231T230000Z').strftime('%-m/%-d/%Y'))
|
28
|
+
end
|
21
29
|
end
|
22
30
|
end
|
23
31
|
|
24
32
|
context 'with a specified date format' do
|
25
33
|
it 'should format dates using the specified format' do
|
26
34
|
TaskwarriorWeb::Config.should_receive(:dateformat).any_number_of_times.and_return('%d/%-m/%Y')
|
27
|
-
helpers.format_date('2012-12-11 12:23:00').should
|
28
|
-
helpers.format_date('2012-12-11').should
|
35
|
+
helpers.format_date('2012-12-11 12:23:00').should eq('11/12/2012')
|
36
|
+
helpers.format_date('2012-12-11').should eq('11/12/2012')
|
29
37
|
end
|
30
38
|
|
31
39
|
it 'should convert Taskwarrior formats to Ruby formats correctly' do
|
32
40
|
TaskwarriorWeb::Config.should_receive(:file).any_number_of_times.and_return({'dateformat' => 'd/m/Y'})
|
33
|
-
helpers.format_date('2012-01-11 12:23:00').should
|
34
|
-
helpers.format_date('2012-12-02 12:23:00').should
|
41
|
+
helpers.format_date('2012-01-11 12:23:00').should eq('11/1/2012')
|
42
|
+
helpers.format_date('2012-12-02 12:23:00').should eq('2/12/2012')
|
35
43
|
end
|
36
44
|
end
|
37
45
|
end
|
@@ -16,7 +16,7 @@ describe TaskwarriorWeb::CommandBuilder::Base do
|
|
16
16
|
|
17
17
|
it 'should insert the task id into the command' do
|
18
18
|
@command.task_command.substitute_parts
|
19
|
-
@command.command_string.should
|
19
|
+
@command.command_string.should match(/uuid:34588/)
|
20
20
|
end
|
21
21
|
|
22
22
|
it 'should return itself' do
|
data/taskwarrior-web.gemspec
CHANGED
@@ -3,7 +3,7 @@ $:.push File.expand_path("../lib", __FILE__)
|
|
3
3
|
|
4
4
|
Gem::Specification.new do |s|
|
5
5
|
s.name = "taskwarrior-web"
|
6
|
-
s.version = '1.1.
|
6
|
+
s.version = '1.1.3'
|
7
7
|
s.platform = Gem::Platform::RUBY
|
8
8
|
s.authors = ["Jake Bell"]
|
9
9
|
s.email = ["jake@theunraveler.com"]
|
@@ -16,6 +16,7 @@ Gem::Specification.new do |s|
|
|
16
16
|
s.required_ruby_version = '>= 1.9.0'
|
17
17
|
|
18
18
|
s.add_dependency('sinatra')
|
19
|
+
s.add_dependency('rack-protection', '= 1.2.0')
|
19
20
|
s.add_dependency('parseconfig')
|
20
21
|
s.add_dependency('vegas')
|
21
22
|
s.add_dependency('rinku')
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: taskwarrior-web
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1.
|
4
|
+
version: 1.1.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-12-
|
12
|
+
date: 2012-12-11 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: sinatra
|
16
|
-
requirement: &
|
16
|
+
requirement: &70125172704420 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,21 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70125172704420
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: rack-protection
|
27
|
+
requirement: &70125172702900 !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - =
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 1.2.0
|
33
|
+
type: :runtime
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *70125172702900
|
25
36
|
- !ruby/object:Gem::Dependency
|
26
37
|
name: parseconfig
|
27
|
-
requirement: &
|
38
|
+
requirement: &70125172701620 !ruby/object:Gem::Requirement
|
28
39
|
none: false
|
29
40
|
requirements:
|
30
41
|
- - ! '>='
|
@@ -32,10 +43,10 @@ dependencies:
|
|
32
43
|
version: '0'
|
33
44
|
type: :runtime
|
34
45
|
prerelease: false
|
35
|
-
version_requirements: *
|
46
|
+
version_requirements: *70125172701620
|
36
47
|
- !ruby/object:Gem::Dependency
|
37
48
|
name: vegas
|
38
|
-
requirement: &
|
49
|
+
requirement: &70125172699760 !ruby/object:Gem::Requirement
|
39
50
|
none: false
|
40
51
|
requirements:
|
41
52
|
- - ! '>='
|
@@ -43,10 +54,10 @@ dependencies:
|
|
43
54
|
version: '0'
|
44
55
|
type: :runtime
|
45
56
|
prerelease: false
|
46
|
-
version_requirements: *
|
57
|
+
version_requirements: *70125172699760
|
47
58
|
- !ruby/object:Gem::Dependency
|
48
59
|
name: rinku
|
49
|
-
requirement: &
|
60
|
+
requirement: &70125172698080 !ruby/object:Gem::Requirement
|
50
61
|
none: false
|
51
62
|
requirements:
|
52
63
|
- - ! '>='
|
@@ -54,10 +65,10 @@ dependencies:
|
|
54
65
|
version: '0'
|
55
66
|
type: :runtime
|
56
67
|
prerelease: false
|
57
|
-
version_requirements: *
|
68
|
+
version_requirements: *70125172698080
|
58
69
|
- !ruby/object:Gem::Dependency
|
59
70
|
name: versionomy
|
60
|
-
requirement: &
|
71
|
+
requirement: &70125172696940 !ruby/object:Gem::Requirement
|
61
72
|
none: false
|
62
73
|
requirements:
|
63
74
|
- - ! '>='
|
@@ -65,10 +76,10 @@ dependencies:
|
|
65
76
|
version: '0'
|
66
77
|
type: :runtime
|
67
78
|
prerelease: false
|
68
|
-
version_requirements: *
|
79
|
+
version_requirements: *70125172696940
|
69
80
|
- !ruby/object:Gem::Dependency
|
70
81
|
name: activesupport
|
71
|
-
requirement: &
|
82
|
+
requirement: &70125172695900 !ruby/object:Gem::Requirement
|
72
83
|
none: false
|
73
84
|
requirements:
|
74
85
|
- - ! '>='
|
@@ -76,10 +87,10 @@ dependencies:
|
|
76
87
|
version: '0'
|
77
88
|
type: :runtime
|
78
89
|
prerelease: false
|
79
|
-
version_requirements: *
|
90
|
+
version_requirements: *70125172695900
|
80
91
|
- !ruby/object:Gem::Dependency
|
81
92
|
name: sinatra-simple-navigation
|
82
|
-
requirement: &
|
93
|
+
requirement: &70125172694160 !ruby/object:Gem::Requirement
|
83
94
|
none: false
|
84
95
|
requirements:
|
85
96
|
- - ! '>='
|
@@ -87,10 +98,10 @@ dependencies:
|
|
87
98
|
version: '0'
|
88
99
|
type: :runtime
|
89
100
|
prerelease: false
|
90
|
-
version_requirements: *
|
101
|
+
version_requirements: *70125172694160
|
91
102
|
- !ruby/object:Gem::Dependency
|
92
103
|
name: rack-flash3
|
93
|
-
requirement: &
|
104
|
+
requirement: &70125172692900 !ruby/object:Gem::Requirement
|
94
105
|
none: false
|
95
106
|
requirements:
|
96
107
|
- - ! '>='
|
@@ -98,10 +109,10 @@ dependencies:
|
|
98
109
|
version: '0'
|
99
110
|
type: :runtime
|
100
111
|
prerelease: false
|
101
|
-
version_requirements: *
|
112
|
+
version_requirements: *70125172692900
|
102
113
|
- !ruby/object:Gem::Dependency
|
103
114
|
name: rake
|
104
|
-
requirement: &
|
115
|
+
requirement: &70125172692020 !ruby/object:Gem::Requirement
|
105
116
|
none: false
|
106
117
|
requirements:
|
107
118
|
- - ! '>='
|
@@ -109,10 +120,10 @@ dependencies:
|
|
109
120
|
version: '0'
|
110
121
|
type: :development
|
111
122
|
prerelease: false
|
112
|
-
version_requirements: *
|
123
|
+
version_requirements: *70125172692020
|
113
124
|
- !ruby/object:Gem::Dependency
|
114
125
|
name: rack-test
|
115
|
-
requirement: &
|
126
|
+
requirement: &70125172690920 !ruby/object:Gem::Requirement
|
116
127
|
none: false
|
117
128
|
requirements:
|
118
129
|
- - ! '>='
|
@@ -120,10 +131,10 @@ dependencies:
|
|
120
131
|
version: '0'
|
121
132
|
type: :development
|
122
133
|
prerelease: false
|
123
|
-
version_requirements: *
|
134
|
+
version_requirements: *70125172690920
|
124
135
|
- !ruby/object:Gem::Dependency
|
125
136
|
name: rspec
|
126
|
-
requirement: &
|
137
|
+
requirement: &70125172689960 !ruby/object:Gem::Requirement
|
127
138
|
none: false
|
128
139
|
requirements:
|
129
140
|
- - ! '>='
|
@@ -131,10 +142,10 @@ dependencies:
|
|
131
142
|
version: '0'
|
132
143
|
type: :development
|
133
144
|
prerelease: false
|
134
|
-
version_requirements: *
|
145
|
+
version_requirements: *70125172689960
|
135
146
|
- !ruby/object:Gem::Dependency
|
136
147
|
name: rspec-html-matchers
|
137
|
-
requirement: &
|
148
|
+
requirement: &70125172689140 !ruby/object:Gem::Requirement
|
138
149
|
none: false
|
139
150
|
requirements:
|
140
151
|
- - ! '>='
|
@@ -142,7 +153,7 @@ dependencies:
|
|
142
153
|
version: '0'
|
143
154
|
type: :development
|
144
155
|
prerelease: false
|
145
|
-
version_requirements: *
|
156
|
+
version_requirements: *70125172689140
|
146
157
|
description: This gem provides a graphical frontend for the Taskwarrior task manager.
|
147
158
|
It is based on Sinatra.
|
148
159
|
email:
|
@@ -234,7 +245,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
234
245
|
version: '0'
|
235
246
|
segments:
|
236
247
|
- 0
|
237
|
-
hash:
|
248
|
+
hash: 3014724563927627498
|
238
249
|
requirements: []
|
239
250
|
rubyforge_project: taskwarrior-web
|
240
251
|
rubygems_version: 1.8.11
|