taskwarrior-web 1.0.8 → 1.0.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (30) hide show
  1. data/CHANGELOG.md +6 -0
  2. data/README.md +5 -1
  3. data/lib/taskwarrior-web/app.rb +14 -41
  4. data/lib/taskwarrior-web/helpers.rb +1 -1
  5. data/lib/taskwarrior-web/public/css/datepicker.css +230 -112
  6. data/lib/taskwarrior-web/public/js/application.js +2 -1
  7. data/lib/taskwarrior-web/public/js/bootstrap-datepicker.js +570 -135
  8. data/lib/taskwarrior-web/{command_builders → services/builder}/base.rb +3 -3
  9. data/lib/taskwarrior-web/{command_builders → services/builder}/v1.rb +1 -2
  10. data/lib/taskwarrior-web/{command_builders → services/builder}/v2.rb +0 -0
  11. data/lib/taskwarrior-web/{command_builder.rb → services/builder.rb} +3 -3
  12. data/lib/taskwarrior-web/{parser → services/parser}/csv.rb +0 -0
  13. data/lib/taskwarrior-web/{parser → services/parser}/json.rb +0 -0
  14. data/lib/taskwarrior-web/{parser.rb → services/parser.rb} +2 -2
  15. data/lib/taskwarrior-web/{runner.rb → services/runner.rb} +0 -0
  16. data/lib/taskwarrior-web/task.rb +11 -1
  17. data/lib/taskwarrior-web/views/projects.erb +31 -33
  18. data/lib/taskwarrior-web/views/task_form.erb +4 -4
  19. data/lib/taskwarrior-web.rb +3 -3
  20. data/spec/app/app_spec.rb +68 -1
  21. data/spec/app/helpers_spec.rb +6 -0
  22. data/spec/models/task_spec.rb +20 -0
  23. data/spec/{models/command_builders → services/builder}/base_spec.rb +19 -2
  24. data/spec/{models/command_builders → services/builder}/v1_spec.rb +7 -4
  25. data/spec/{models/command_builder_spec.rb → services/builder_spec.rb} +1 -1
  26. data/spec/services/parser_spec.rb +14 -0
  27. data/spec/{models → services}/runner_spec.rb +1 -1
  28. data/taskwarrior-web.gemspec +1 -1
  29. metadata +39 -39
  30. data/spec/models/command_builders/v2_spec.rb +0 -0
@@ -22,8 +22,9 @@ module TaskwarriorWeb::CommandBuilder::Base
22
22
  def task_command
23
23
  if TASK_COMMANDS.has_key?(@command.to_sym)
24
24
  @command_string = TASK_COMMANDS[@command.to_sym].clone
25
+ return self
25
26
  else
26
- raise InvalidCommandError
27
+ raise TaskwarriorWeb::CommandBuilder::InvalidCommandError
27
28
  end
28
29
  end
29
30
 
@@ -31,9 +32,8 @@ module TaskwarriorWeb::CommandBuilder::Base
31
32
  if @id
32
33
  @command_string.gsub!(':id', "uuid:#{@id.to_s}")
33
34
  return self
34
- else
35
- raise TaskwarriorWeb::CommandBuilder::MissingTaskIDError
36
35
  end
36
+ raise TaskwarriorWeb::CommandBuilder::MissingTaskIDError
37
37
  end
38
38
 
39
39
  def parse_params
@@ -19,9 +19,8 @@ module TaskwarriorWeb::CommandBuilder::V1
19
19
  assign_id_from_uuid
20
20
  @command_string.gsub!(':id', @id.to_s)
21
21
  return self
22
- else
23
- raise TaskwarriorWeb::CommandBuilder::MissingTaskIDError
24
22
  end
23
+ raise TaskwarriorWeb::CommandBuilder::MissingTaskIDError
25
24
  end
26
25
 
27
26
  def assign_id_from_uuid
@@ -1,7 +1,7 @@
1
1
  module TaskwarriorWeb::CommandBuilder
2
- autoload :Base, 'taskwarrior-web/command_builders/base'
3
- autoload :V1, 'taskwarrior-web/command_builders/v1'
4
- autoload :V2, 'taskwarrior-web/command_builders/v2'
2
+ autoload :Base, 'taskwarrior-web/services/builder/base'
3
+ autoload :V1, 'taskwarrior-web/services/builder/v1'
4
+ autoload :V2, 'taskwarrior-web/services/builder/v2'
5
5
 
6
6
  class InvalidCommandError < Exception; end
7
7
  class MissingTaskIDError < Exception; end
@@ -1,6 +1,6 @@
1
1
  module TaskwarriorWeb::Parser
2
- autoload :Json, 'taskwarrior-web/parser/json'
3
- autoload :Csv, 'taskwarrior-web/parser/csv'
2
+ autoload :Json, 'taskwarrior-web/services/parser/json'
3
+ autoload :Csv, 'taskwarrior-web/services/parser/csv'
4
4
 
5
5
  def self.parse(results)
6
6
  if TaskwarriorWeb::Config.version > '1.9.2'
@@ -6,7 +6,8 @@ module TaskwarriorWeb
6
6
  class Task
7
7
 
8
8
  attr_accessor :entry, :project, :priority, :uuid, :description, :status,
9
- :due, :start, :end, :tags, :depends, :wait, :annotations
9
+ :due, :start, :end, :tags, :depends, :wait, :annotations,
10
+ :errors
10
11
  alias :annotate= :annotations=
11
12
 
12
13
  ####################################
@@ -28,10 +29,19 @@ module TaskwarriorWeb
28
29
  end
29
30
 
30
31
  # Make sure that the tags are an array.
32
+ def tags
33
+ @tags ? @tags : []
34
+ end
31
35
  def tags=(value)
32
36
  @tags = value.is_a?(String) ? value.split(/\W+/).reject(&:empty?) : value
33
37
  end
34
38
 
39
+ def is_valid?
40
+ self.errors = []
41
+ self.errors << 'You must provide a description' if self.description.nil? || self.description.empty?
42
+ self.errors.empty?
43
+ end
44
+
35
45
  def to_hash
36
46
  Hash[instance_variables.map { |var| [var[1..-1].to_sym, instance_variable_get(var)] }]
37
47
  end
@@ -13,40 +13,38 @@
13
13
  <div id="listing">
14
14
  <% @tasks.each do |proj, tasks| %>
15
15
  <% doneness = (tasks.select { |t| t.status == 'completed' }.count.to_f / tasks.count.to_f) * 100 %>
16
- <% unless doneness == 100.0 %>
17
- <section class="project-container" id="project-<%= idify(proj) %>">
18
- <h2 class="project <%= doneness == 100.0 ? 'done' : 'pending' %>">
19
- <%= proj %>&nbsp;
20
- <a href="/projects/<%= linkify(proj) %>"><i class="icon-circle-arrow-right"></i></a>
21
- </h2>
22
- <div class="progress progress-striped">
23
- <div class="bar" style="width: <%= doneness.to_i %>%;"></div>&nbsp;<%= doneness.to_i %>%
24
- </div>
25
- <table class="table table-striped table-hover">
26
- <thead>
27
- <tr>
28
- <th>Description</th>
29
- <th>Due</th>
30
- <th>Tags</th>
31
- <th>Priority</th>
32
- </tr>
33
- </thead>
34
- <tbody>
35
- <% tasks.each do |task| %>
36
- <% if task.status == 'pending' %>
37
- <tr class="<%= colorize_date(task.due) %>">
38
- <td><%= task.description %></td>
39
- <td><%= format_date(task.due) unless task.due.nil? %></td>
40
- <td><%= task.tags.join(', ') unless task.tags.nil? %></td>
41
- <td><%= task.priority unless task.priority.nil? %></td>
42
- </tr>
43
- <% end %>
16
+ <section class="project-container" id="project-<%= idify(proj) %>">
17
+ <h2 class="project <%= doneness == 100 ? 'done' : 'pending' %>">
18
+ <%= proj %>&nbsp;
19
+ <a href="/projects/<%= linkify(proj) %>"><i class="icon-circle-arrow-right"></i></a>
20
+ </h2>
21
+ <div class="progress progress-striped">
22
+ <div class="bar" style="width: <%= doneness.to_i %>%;"></div>&nbsp;<%= doneness.to_i %>%
23
+ </div>
24
+ <table class="table table-striped table-hover">
25
+ <thead>
26
+ <tr>
27
+ <th>Description</th>
28
+ <th>Due</th>
29
+ <th>Tags</th>
30
+ <th>Priority</th>
31
+ </tr>
32
+ </thead>
33
+ <tbody>
34
+ <% tasks.each do |task| %>
35
+ <% if task.status == 'pending' %>
36
+ <tr class="<%= colorize_date(task.due) %>">
37
+ <td><%= task.description %></td>
38
+ <td><%= format_date(task.due) unless task.due.nil? %></td>
39
+ <td><%= task.tags.join(', ') unless task.tags.nil? %></td>
40
+ <td><%= task.priority unless task.priority.nil? %></td>
41
+ </tr>
44
42
  <% end %>
45
- </tbody>
46
- </table>
47
- </section>
48
- <hr class="section-separator" />
49
- <% end %>
43
+ <% end %>
44
+ </tbody>
45
+ </table>
46
+ </section>
47
+ <hr class="section-separator" />
50
48
  <% end %>
51
49
  </div>
52
50
  </div>
@@ -3,28 +3,28 @@
3
3
  <div class="control-group">
4
4
  <label for="task-description" class="control-label">Description</label>
5
5
  <div class="controls">
6
- <input type="textfield" id="task-description" name="task[description]" value="<%= @task[:description] unless @task.nil? %>" />
6
+ <input type="textfield" id="task-description" name="task[description]" value="<%= @task.description unless @task.nil? %>" />
7
7
  </div>
8
8
  </div>
9
9
 
10
10
  <div class="control-group">
11
11
  <label for="task-project" class="control-label">Project</label>
12
12
  <div class="controls">
13
- <input type="textfield" id="task-project" name="task[project]" value="<%= @task[:project] unless @task.nil? %>" autocomplete="off" />
13
+ <input type="textfield" id="task-project" name="task[project]" value="<%= @task.project unless @task.nil? %>" autocomplete="off" />
14
14
  </div>
15
15
  </div>
16
16
 
17
17
  <div class="control-group">
18
18
  <label for="task-due" class="control-label">Due Date</label>
19
19
  <div class="controls">
20
- <input class="date-picker" type="textfield" id="task-due" name="task[due]" value="<%= @task[:due] unless @task.nil? %>" data-date-format="<%= @date_format %>" />
20
+ <input class="date-picker" type="textfield" id="task-due" name="task[due]" value="<%= @task.due unless @task.nil? %>" data-date-format="<%= @date_format %>" />
21
21
  </div>
22
22
  </div>
23
23
 
24
24
  <div class="control-group">
25
25
  <label for="task-tags" class="control-label">Tags</label>
26
26
  <div class="controls">
27
- <input type="textfield" id="task-tags" name="task[tags]" value="<%= @task[:tags] unless @task.nil? %>" autocomplete="off" />
27
+ <input type="textfield" id="task-tags" name="task[tags]" value="<%= @task.tags.join(', ') unless @task.nil? %>" autocomplete="off" />
28
28
  <div class="description">Enter tags separated by commas or spaces (e.g. <em>each, word will,be a tag</em>)</div>
29
29
  </div>
30
30
  </div>
@@ -8,10 +8,10 @@ module TaskwarriorWeb
8
8
  autoload :Helpers, 'taskwarrior-web/helpers'
9
9
  autoload :Task, 'taskwarrior-web/task'
10
10
  autoload :Config, 'taskwarrior-web/config'
11
- autoload :CommandBuilder, 'taskwarrior-web/command_builder'
12
11
  autoload :Command, 'taskwarrior-web/command'
13
- autoload :Runner, 'taskwarrior-web/runner'
14
- autoload :Parser, 'taskwarrior-web/parser'
12
+ autoload :CommandBuilder, 'taskwarrior-web/services/builder'
13
+ autoload :Runner, 'taskwarrior-web/services/runner'
14
+ autoload :Parser, 'taskwarrior-web/services/parser'
15
15
 
16
16
  class UnrecognizedTaskVersion < Exception; end
17
17
  end
data/spec/app/app_spec.rb CHANGED
@@ -3,7 +3,7 @@ require 'taskwarrior-web'
3
3
 
4
4
  set :environment, :test
5
5
 
6
- describe "My App" do
6
+ describe TaskwarriorWeb::App do
7
7
  include Rack::Test::Methods
8
8
 
9
9
  def app
@@ -37,6 +37,73 @@ describe "My App" do
37
37
  end
38
38
  end
39
39
 
40
+ describe 'GET /tasks/new' do
41
+ it 'should display a new task form' do
42
+ get '/tasks/new'
43
+ last_response.body.should =~ /form/
44
+ end
45
+
46
+ it 'should display a 200 status code' do
47
+ get '/tasks/new'
48
+ last_response.should be_ok
49
+ end
50
+ end
51
+
52
+ describe 'POST /tasks' do
53
+ context 'given a valid task' do
54
+ it 'should save the task' do
55
+ task = TaskwarriorWeb::Task.new({:description => 'Test task'})
56
+ task.should_receive(:save!).once
57
+ TaskwarriorWeb::Task.should_receive(:new).once.and_return(task)
58
+ post '/tasks', :task => {:description => 'Test task'}
59
+ end
60
+
61
+ it 'should redirect to the task listing page' do
62
+ task = TaskwarriorWeb::Task.new
63
+ task.should_receive(:is_valid?).and_return(true)
64
+ task.should_receive(:save!)
65
+ TaskwarriorWeb::Task.should_receive(:new).once.and_return(task)
66
+ post '/tasks', :task => {}
67
+ follow_redirect!
68
+ last_request.url.should =~ /\/tasks$/
69
+ end
70
+ end
71
+
72
+ context 'given an invalid task' do
73
+ it 'should not save the task' do
74
+ task = TaskwarriorWeb::Task.new
75
+ task.should_not_receive(:save!)
76
+ TaskwarriorWeb::Task.should_receive(:new).once.and_return(task)
77
+ post '/tasks', :task => {}
78
+ end
79
+
80
+ it 'should render the task form' do
81
+ task = TaskwarriorWeb::Task.new({:tags => 'tag1, tag2'})
82
+ TaskwarriorWeb::Task.should_receive(:new).once.and_return(task)
83
+ post '/tasks', :task => {}
84
+ last_response.body.should =~ /form/
85
+ last_response.body.should =~ /tag1, tag2/
86
+ end
87
+
88
+ it 'should display errors messages' do
89
+ task = TaskwarriorWeb::Task.new
90
+ TaskwarriorWeb::Task.should_receive(:new).once.and_return(task)
91
+ post '/tasks', :task => {}
92
+ last_response.body.should =~ /You must provide a description/
93
+ end
94
+ end
95
+ end
96
+
97
+ describe 'GET /ajax/projects' do
98
+ it 'should return a list of projects as JSON' do
99
+ command = TaskwarriorWeb::Command.new(:projects)
100
+ command.should_receive(:run).and_return("Project One\nProject Two")
101
+ TaskwarriorWeb::Command.should_receive(:new).with(:projects).and_return(command)
102
+ get '/ajax/projects'
103
+ last_response.body.should eq(['Project One', 'Project Two'].to_json)
104
+ end
105
+ end
106
+
40
107
  describe 'GET /ajax/count' do
41
108
  it 'should return the current pending task count' do
42
109
  TaskwarriorWeb::Task.should_receive(:count).and_return(15)
@@ -61,5 +61,11 @@ describe TaskwarriorWeb::App::Helpers do
61
61
  helpers.auto_link('hello')
62
62
  end
63
63
  end
64
+
65
+ describe '#subnav' do
66
+ it 'should be empty for an unrecognized type' do
67
+ helpers.subnav('something').should be_empty
68
+ end
69
+ end
64
70
  end
65
71
 
@@ -18,6 +18,26 @@ describe TaskwarriorWeb::Task do
18
18
  end
19
19
  end
20
20
 
21
+ describe '#save!' do
22
+ it 'should save the task' do
23
+ task = TaskwarriorWeb::Task.new
24
+ command = TaskwarriorWeb::Command.new(:add)
25
+ command.should_receive(:run).once
26
+ TaskwarriorWeb::Command.should_receive(:new).once.with(:add, nil, task.to_hash).and_return(command)
27
+ task.save!
28
+ end
29
+ end
30
+
31
+ describe '#complete!' do
32
+ it 'should complete the task' do
33
+ task = TaskwarriorWeb::Task.new({:uuid => 15})
34
+ command = TaskwarriorWeb::Command.new(:complete)
35
+ command.should_receive(:run).once
36
+ TaskwarriorWeb::Command.should_receive(:new).once.with(:complete, 15).and_return(command)
37
+ task.complete!
38
+ end
39
+ end
40
+
21
41
  describe '.query' do
22
42
  before do
23
43
  @command = TaskwarriorWeb::Command.new(:query)
@@ -2,11 +2,28 @@ require File.dirname(__FILE__) + '/../../spec_helper'
2
2
  require 'taskwarrior-web/command'
3
3
 
4
4
  describe TaskwarriorWeb::CommandBuilder::Base do
5
+ describe '#task_command' do
6
+ it 'should throw and exception for invalid commands' do
7
+ command = TaskwarriorWeb::Command.new(:does_not_exist)
8
+ expect { command.task_command }.to raise_error(TaskwarriorWeb::CommandBuilder::InvalidCommandError)
9
+ end
10
+ end
11
+
5
12
  describe '#substitute_parts' do
6
13
  before do
7
14
  @command = TaskwarriorWeb::Command.new(:complete, 34588)
8
15
  end
9
16
 
17
+ it 'should insert the task id into the command' do
18
+ @command.task_command.substitute_parts
19
+ @command.command_string.should =~ /uuid:34588/
20
+ end
21
+
22
+ it 'should return itself' do
23
+ @command.task_command
24
+ @command.task_command.substitute_parts.should eq(@command)
25
+ end
26
+
10
27
  it 'should throw an error if the command has no task ID' do
11
28
  @command.id = nil
12
29
  expect { @command.substitute_parts }.to raise_error(TaskwarriorWeb::CommandBuilder::MissingTaskIDError)
@@ -15,9 +32,9 @@ describe TaskwarriorWeb::CommandBuilder::Base do
15
32
 
16
33
  describe '#parse_params' do
17
34
  it 'should create a string from the passed paramters' do
18
- command = TaskwarriorWeb::Command.new(:query, nil, :test => 14, :none => :none, :hello => :hi)
35
+ command = TaskwarriorWeb::Command.new(:query, nil, :test => 14, :none => :none, :hello => :hi, :array => [:first, :second])
19
36
  command.parse_params
20
- command.params.should eq(' test:\"14\" none:\"none\" hello:\"hi\"')
37
+ command.params.should eq(' test:\"14\" none:\"none\" hello:\"hi\" array:\"first\" array:\"second\"')
21
38
  end
22
39
 
23
40
  it 'should prefix tags with the tag.indicator if specified' do
@@ -1,5 +1,5 @@
1
1
  require File.dirname(__FILE__) + '/../../spec_helper'
2
- require 'taskwarrior-web/command_builders/v1'
2
+ require 'taskwarrior-web/services/builder/v1'
3
3
  require 'taskwarrior-web/command'
4
4
  require 'ostruct'
5
5
 
@@ -14,9 +14,12 @@ describe TaskwarriorWeb::CommandBuilder::V1 do
14
14
 
15
15
  it 'should replace the :id string with the given task ID' do
16
16
  TaskwarriorWeb::Task.should_receive(:query).and_return([OpenStruct.new(:uuid => 34588)])
17
- @command.task_command
18
- @command.substitute_parts
19
- @command.command_string.should eq('1 done')
17
+ @command.task_command.substitute_parts.command_string.should eq('1 done')
18
+ end
19
+
20
+ it 'should throw an error if there is no id' do
21
+ command = TaskwarriorWeb::Command.new(:complete)
22
+ expect { command.substitute_parts }.to raise_error(TaskwarriorWeb::CommandBuilder::MissingTaskIDError)
20
23
  end
21
24
  end
22
25
  end
@@ -1,5 +1,5 @@
1
1
  require File.dirname(__FILE__) + '/../spec_helper'
2
- require 'taskwarrior-web/command_builder'
2
+ require 'taskwarrior-web/services/builder'
3
3
 
4
4
  RSpec::Mocks::setup(TaskwarriorWeb::Config)
5
5
 
@@ -0,0 +1,14 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+ require 'taskwarrior-web/services/parser'
3
+
4
+ describe TaskwarriorWeb::Parser do
5
+ describe '.parse' do
6
+ context 'when the task version is <= 1.9.2' do
7
+ it 'should parse output as CSV' do
8
+ TaskwarriorWeb::Config.should_receive(:version).and_return('1.0.0')
9
+ TaskwarriorWeb::Parser::Csv.should_receive(:parse).once.with('hello')
10
+ TaskwarriorWeb::Parser.parse('hello')
11
+ end
12
+ end
13
+ end
14
+ end
@@ -1,5 +1,5 @@
1
1
  require File.dirname(__FILE__) + '/../spec_helper'
2
- require 'taskwarrior-web/runner'
2
+ require 'taskwarrior-web/services/runner'
3
3
 
4
4
  describe TaskwarriorWeb::Runner do
5
5
  before do
@@ -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.0.8'
6
+ s.version = '1.0.9'
7
7
  s.platform = Gem::Platform::RUBY
8
8
  s.authors = ["Jake Bell"]
9
9
  s.email = ["jake@theunraveler.com"]
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.0.8
4
+ version: 1.0.9
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-11-18 00:00:00.000000000 Z
12
+ date: 2012-11-19 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: sinatra
16
- requirement: &70238927264800 !ruby/object:Gem::Requirement
16
+ requirement: &70214969400280 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70238927264800
24
+ version_requirements: *70214969400280
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: thin
27
- requirement: &70238927264240 !ruby/object:Gem::Requirement
27
+ requirement: &70214969399720 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '0'
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *70238927264240
35
+ version_requirements: *70214969399720
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: parseconfig
38
- requirement: &70238927263740 !ruby/object:Gem::Requirement
38
+ requirement: &70214969399240 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '0'
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *70238927263740
46
+ version_requirements: *70214969399240
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: vegas
49
- requirement: &70238927263260 !ruby/object:Gem::Requirement
49
+ requirement: &70214969398760 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: '0'
55
55
  type: :runtime
56
56
  prerelease: false
57
- version_requirements: *70238927263260
57
+ version_requirements: *70214969398760
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: rinku
60
- requirement: &70238927262640 !ruby/object:Gem::Requirement
60
+ requirement: &70214969398260 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ! '>='
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: '0'
66
66
  type: :runtime
67
67
  prerelease: false
68
- version_requirements: *70238927262640
68
+ version_requirements: *70214969398260
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: versionomy
71
- requirement: &70238927262220 !ruby/object:Gem::Requirement
71
+ requirement: &70214969397720 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ! '>='
@@ -76,10 +76,10 @@ dependencies:
76
76
  version: '0'
77
77
  type: :runtime
78
78
  prerelease: false
79
- version_requirements: *70238927262220
79
+ version_requirements: *70214969397720
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: rake
82
- requirement: &70238927261580 !ruby/object:Gem::Requirement
82
+ requirement: &70214969397240 !ruby/object:Gem::Requirement
83
83
  none: false
84
84
  requirements:
85
85
  - - ! '>='
@@ -87,10 +87,10 @@ dependencies:
87
87
  version: '0'
88
88
  type: :development
89
89
  prerelease: false
90
- version_requirements: *70238927261580
90
+ version_requirements: *70214969397240
91
91
  - !ruby/object:Gem::Dependency
92
92
  name: rack-test
93
- requirement: &70238927260920 !ruby/object:Gem::Requirement
93
+ requirement: &70214969396600 !ruby/object:Gem::Requirement
94
94
  none: false
95
95
  requirements:
96
96
  - - ! '>='
@@ -98,10 +98,10 @@ dependencies:
98
98
  version: '0'
99
99
  type: :development
100
100
  prerelease: false
101
- version_requirements: *70238927260920
101
+ version_requirements: *70214969396600
102
102
  - !ruby/object:Gem::Dependency
103
103
  name: rspec
104
- requirement: &70238927260440 !ruby/object:Gem::Requirement
104
+ requirement: &70214969395900 !ruby/object:Gem::Requirement
105
105
  none: false
106
106
  requirements:
107
107
  - - ! '>='
@@ -109,7 +109,7 @@ dependencies:
109
109
  version: '0'
110
110
  type: :development
111
111
  prerelease: false
112
- version_requirements: *70238927260440
112
+ version_requirements: *70214969395900
113
113
  description: This gem provides a graphical frontend for the Taskwarrior task manager.
114
114
  It is based on Sinatra.
115
115
  email:
@@ -132,15 +132,8 @@ files:
132
132
  - lib/taskwarrior-web.rb
133
133
  - lib/taskwarrior-web/app.rb
134
134
  - lib/taskwarrior-web/command.rb
135
- - lib/taskwarrior-web/command_builder.rb
136
- - lib/taskwarrior-web/command_builders/base.rb
137
- - lib/taskwarrior-web/command_builders/v1.rb
138
- - lib/taskwarrior-web/command_builders/v2.rb
139
135
  - lib/taskwarrior-web/config.rb
140
136
  - lib/taskwarrior-web/helpers.rb
141
- - lib/taskwarrior-web/parser.rb
142
- - lib/taskwarrior-web/parser/csv.rb
143
- - lib/taskwarrior-web/parser/json.rb
144
137
  - lib/taskwarrior-web/public/css/bootstrap-responsive.min.css
145
138
  - lib/taskwarrior-web/public/css/bootstrap.min.css
146
139
  - lib/taskwarrior-web/public/css/datepicker.css
@@ -153,7 +146,14 @@ files:
153
146
  - lib/taskwarrior-web/public/js/bootstrap-datepicker.js
154
147
  - lib/taskwarrior-web/public/js/bootstrap.js
155
148
  - lib/taskwarrior-web/public/js/jquery.min.js
156
- - lib/taskwarrior-web/runner.rb
149
+ - lib/taskwarrior-web/services/builder.rb
150
+ - lib/taskwarrior-web/services/builder/base.rb
151
+ - lib/taskwarrior-web/services/builder/v1.rb
152
+ - lib/taskwarrior-web/services/builder/v2.rb
153
+ - lib/taskwarrior-web/services/parser.rb
154
+ - lib/taskwarrior-web/services/parser/csv.rb
155
+ - lib/taskwarrior-web/services/parser/json.rb
156
+ - lib/taskwarrior-web/services/runner.rb
157
157
  - lib/taskwarrior-web/task.rb
158
158
  - lib/taskwarrior-web/views/404.erb
159
159
  - lib/taskwarrior-web/views/_subnav.erb
@@ -166,14 +166,14 @@ files:
166
166
  - spec/app/app_spec.rb
167
167
  - spec/app/helpers_spec.rb
168
168
  - spec/files/taskrc
169
- - spec/models/command_builder_spec.rb
170
- - spec/models/command_builders/base_spec.rb
171
- - spec/models/command_builders/v1_spec.rb
172
- - spec/models/command_builders/v2_spec.rb
173
169
  - spec/models/command_spec.rb
174
170
  - spec/models/config_spec.rb
175
- - spec/models/runner_spec.rb
176
171
  - spec/models/task_spec.rb
172
+ - spec/services/builder/base_spec.rb
173
+ - spec/services/builder/v1_spec.rb
174
+ - spec/services/builder_spec.rb
175
+ - spec/services/parser_spec.rb
176
+ - spec/services/runner_spec.rb
177
177
  - spec/spec_helper.rb
178
178
  - taskwarrior-web.gemspec
179
179
  homepage: http://github.com/theunraveler/taskwarrior-web
@@ -196,7 +196,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
196
196
  version: '0'
197
197
  segments:
198
198
  - 0
199
- hash: -3912331200158968927
199
+ hash: -561964061204943881
200
200
  requirements: []
201
201
  rubyforge_project: taskwarrior-web
202
202
  rubygems_version: 1.8.11
@@ -207,12 +207,12 @@ test_files:
207
207
  - spec/app/app_spec.rb
208
208
  - spec/app/helpers_spec.rb
209
209
  - spec/files/taskrc
210
- - spec/models/command_builder_spec.rb
211
- - spec/models/command_builders/base_spec.rb
212
- - spec/models/command_builders/v1_spec.rb
213
- - spec/models/command_builders/v2_spec.rb
214
210
  - spec/models/command_spec.rb
215
211
  - spec/models/config_spec.rb
216
- - spec/models/runner_spec.rb
217
212
  - spec/models/task_spec.rb
213
+ - spec/services/builder/base_spec.rb
214
+ - spec/services/builder/v1_spec.rb
215
+ - spec/services/builder_spec.rb
216
+ - spec/services/parser_spec.rb
217
+ - spec/services/runner_spec.rb
218
218
  - spec/spec_helper.rb