taskwarrior-web 1.1.2 → 1.1.3
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/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
|