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.
@@ -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