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.
@@ -1,3 +1,8 @@
1
+ ## v1.1.3 (12/11/12)
2
+
3
+ * Added CRUD links to waiting tab
4
+ * Set rack-protection dependency version (to fix weird static assets 404 issue)
5
+
1
6
  ## v1.1.2 (12/7/12)
2
7
 
3
8
  * Fixed dumb but annoying timezone issue
@@ -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(:description => filter)
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
- forward '/tasks/new'
63
+ erb :new_task
69
64
  end
70
65
 
71
66
  get '/tasks/:uuid/?' do
72
- not_found if !TaskwarriorWeb::Config.supports?(:editing)
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 if !TaskwarriorWeb::Config.supports?(:editing)
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
- forward "/tasks/#{@task.uuid}"
87
+ erb :edit_task
93
88
  end
94
89
 
95
90
  get '/tasks/:uuid/delete/?' do
96
- not_found if !TaskwarriorWeb::Config.supports?(:editing)
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 if !TaskwarriorWeb::Config.supports?(:editing)
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(:description => filter).count
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
- # Run queries on tasks.
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
- results = Command.new(:query, nil, *args).run
64
- Parser.parse(results).each { |result| tasks << Task.new(result) }
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
- # Get the number of tasks for some paramters
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
- <br /><br />
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
- <link rel="stylesheet" href="/css/bootstrap.min.css">
7
- <link rel="stylesheet" href="/css/datepicker.css">
8
- <link rel="stylesheet" href="/css/styles.css">
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
- <script type="text/javascript" src="/js/jquery.min.js"></script>
12
- <script type="text/javascript" src="/js/bootstrap.js"></script>
13
- <script type="text/javascript" src="/js/bootstrap-datepicker.js"></script>
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">
@@ -1,4 +1,4 @@
1
- <% can_edit = @can_edit && params[:status] == 'pending' %>
1
+ <% can_edit = @can_edit && params[:status].in?(['pending', 'waiting']) %>
2
2
 
3
3
  <div id="listing">
4
4
  <table class="table table-striped table-hover">
@@ -1,3 +1,9 @@
1
+ <script>
2
+ $(document).ready(function() {
3
+ $('input[name="task[description]"]').focus();
4
+ });
5
+ </script>
6
+
1
7
  <form id="new-task-form" class="form-horizontal" action="/tasks" method="post">
2
8
 
3
9
  <%= erb :_task_form %>
@@ -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 include('<form')
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).once.and_return(task)
73
+ TaskwarriorWeb::Task.should_receive(:new).any_number_of_times.and_return(task)
74
74
  post '/tasks', :task => {}
75
- last_response.body.should include('form')
76
- last_response.body.should include('tag1, tag2')
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).once.and_return(task)
82
+ TaskwarriorWeb::Task.should_receive(:new).any_number_of_times.and_return(task)
82
83
  post '/tasks', :task => {}
83
- last_response.body.should include('You must provide a description')
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
@@ -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 == '1/11/2012'
20
- helpers.format_date('2012-01-11').should == '1/11/2012'
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 == '11/12/2012'
28
- helpers.format_date('2012-12-11').should == '11/12/2012'
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 == '11/1/2012'
34
- helpers.format_date('2012-12-02 12:23:00').should == '2/12/2012'
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 =~ /uuid:34588/
19
+ @command.command_string.should match(/uuid:34588/)
20
20
  end
21
21
 
22
22
  it 'should return itself' do
@@ -9,7 +9,7 @@ describe TaskwarriorWeb::Runner do
9
9
  @object = TestCommandClass.new
10
10
  end
11
11
 
12
- describe 'include' do
12
+ describe '.included' do
13
13
  it 'should make the class respond to the run command' do
14
14
  @object.should respond_to(:run)
15
15
  end
@@ -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.2'
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.2
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-07 00:00:00.000000000 Z
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: &70206370788540 !ruby/object:Gem::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: *70206370788540
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: &70206370787820 !ruby/object:Gem::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: *70206370787820
46
+ version_requirements: *70125172701620
36
47
  - !ruby/object:Gem::Dependency
37
48
  name: vegas
38
- requirement: &70206370787120 !ruby/object:Gem::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: *70206370787120
57
+ version_requirements: *70125172699760
47
58
  - !ruby/object:Gem::Dependency
48
59
  name: rinku
49
- requirement: &70206370786420 !ruby/object:Gem::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: *70206370786420
68
+ version_requirements: *70125172698080
58
69
  - !ruby/object:Gem::Dependency
59
70
  name: versionomy
60
- requirement: &70206370785500 !ruby/object:Gem::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: *70206370785500
79
+ version_requirements: *70125172696940
69
80
  - !ruby/object:Gem::Dependency
70
81
  name: activesupport
71
- requirement: &70206370784480 !ruby/object:Gem::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: *70206370784480
90
+ version_requirements: *70125172695900
80
91
  - !ruby/object:Gem::Dependency
81
92
  name: sinatra-simple-navigation
82
- requirement: &70206370783620 !ruby/object:Gem::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: *70206370783620
101
+ version_requirements: *70125172694160
91
102
  - !ruby/object:Gem::Dependency
92
103
  name: rack-flash3
93
- requirement: &70206370782760 !ruby/object:Gem::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: *70206370782760
112
+ version_requirements: *70125172692900
102
113
  - !ruby/object:Gem::Dependency
103
114
  name: rake
104
- requirement: &70206370781900 !ruby/object:Gem::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: *70206370781900
123
+ version_requirements: *70125172692020
113
124
  - !ruby/object:Gem::Dependency
114
125
  name: rack-test
115
- requirement: &70206370781160 !ruby/object:Gem::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: *70206370781160
134
+ version_requirements: *70125172690920
124
135
  - !ruby/object:Gem::Dependency
125
136
  name: rspec
126
- requirement: &70206370780320 !ruby/object:Gem::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: *70206370780320
145
+ version_requirements: *70125172689960
135
146
  - !ruby/object:Gem::Dependency
136
147
  name: rspec-html-matchers
137
- requirement: &70206370779420 !ruby/object:Gem::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: *70206370779420
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: 3722492291802643643
248
+ hash: 3014724563927627498
238
249
  requirements: []
239
250
  rubyforge_project: taskwarrior-web
240
251
  rubygems_version: 1.8.11