teambox-things-sync 0.1.1 → 0.1.2

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/Rakefile CHANGED
@@ -1,5 +1,6 @@
1
+ require 'rubygems'
2
+
1
3
  begin
2
- require 'rubygems'
3
4
  require 'jeweler'
4
5
  Jeweler::Tasks.new do |gemspec|
5
6
  gemspec.name = "teambox-things-sync"
@@ -14,3 +15,11 @@ begin
14
15
  rescue LoadError
15
16
  puts "Jeweler not available. Install it with: gem install jeweler"
16
17
  end
18
+
19
+ namespace :command do
20
+ desc "Run command with using current folder files (not gem)'"
21
+ task :test do
22
+ require 'lib/teambox-things-sync.rb'
23
+ require 'lib/teambox-things-sync/command'
24
+ end
25
+ end
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.1
1
+ 0.1.2
@@ -6,10 +6,45 @@ require 'timeout'
6
6
  module TeamboxThingsSync
7
7
  autoload :Base, File.dirname(__FILE__) + '/teambox-things-sync/base'
8
8
  autoload :ConfigStore, File.dirname(__FILE__) + '/teambox-things-sync/config_store'
9
- autoload :TaskListCache, File.dirname(__FILE__) + '/teambox-things-sync/task_list_cache'
9
+ module Cache
10
+ autoload :BaseCache, File.dirname(__FILE__) + '/teambox-things-sync/cache/base_cache'
11
+ autoload :TaskListCache, File.dirname(__FILE__) + '/teambox-things-sync/cache/task_list_cache'
12
+ autoload :UserNameCache, File.dirname(__FILE__) + '/teambox-things-sync/cache/user_name_cache'
13
+ end
10
14
  end
11
15
 
12
16
  module Things
13
- additional_properties = %{properties :tag_names, :due_date}
14
- Todo.module_eval(additional_properties)
17
+ # adds additional properties that doesn't exist in original gem
18
+ additional_properties = %{properties :tag_names, :due_date}
19
+ Todo.module_eval(additional_properties)
20
+
21
+ class Todo
22
+
23
+ attr_accessor :was_in_today
24
+
25
+ # Moves todo to Today list if it's due today or in the past, or user
26
+ # put it there manually
27
+ def move_to_today_if_necessary
28
+ tomorrow_midnight = Time.parse((Date.today+1).to_s)
29
+ if (self.due_date && self.due_date < tomorrow_midnight) || was_in_today
30
+ self.move(Things::List.today)
31
+ end
32
+ end
33
+
34
+ def remember_today_listing
35
+ @was_in_today = Things::Todo.today.any? {|t| t.name == self.name}
36
+ end
37
+
38
+ def self.find(name_or_id)
39
+ todo = super
40
+ todo.remember_today_listing if todo
41
+ return todo
42
+ end
43
+
44
+ def save
45
+ todo = super
46
+ todo.move_to_today_if_necessary if todo
47
+ return todo
48
+ end
49
+ end
15
50
  end
@@ -60,7 +60,10 @@ module TeamboxThingsSync
60
60
  def mark_as_done_at_remote(project)
61
61
  @client.tasks.each do |task|
62
62
  things_todo = Things::Todo.find(task.name)
63
- if !things_todo.nil? && things_todo.completed? && is_task_open?(task.status)
63
+
64
+ #TODO: clean it up
65
+ if !things_todo.nil? && things_todo.completed? && is_task_open?(task.status) &&
66
+ !Things::App.lists.trash.reference.todos.name.get.include?(things_todo.name)
64
67
  # API isn't great right now, so we update task as resolved
65
68
  # and add the new comment to it
66
69
  @client.update_project_task(project.permalink, task.id, {:status => 3})
@@ -74,7 +77,9 @@ module TeamboxThingsSync
74
77
 
75
78
  # fetches current task data from remote
76
79
  def fetch_tasks_from_remote(project, person_id)
77
- task_list_cache = TaskListCache.new(@client, project.permalink)
80
+ task_list_cache = Cache::TaskListCache.new(@client,
81
+ {:project_permalink => project.permalink})
82
+ @user_name_cache = Cache::UserNameCache.new(@client)
78
83
  @client.tasks.each do |task|
79
84
  # grab only tasks assigned to current user
80
85
  if task.assigned_id == person_id
@@ -82,9 +87,10 @@ module TeamboxThingsSync
82
87
  # update only those that aren't completed in both local and remote
83
88
  if is_task_open?(task.status) || !things_todo.completed?
84
89
  things_todo.project = Base.find_or_create_project_in_things(project.name)
85
- things_todo.notes = "Don't edit this field!\n" +
86
- task_url(project.permalink, task.task_list_id, task.id)
87
-
90
+ things_todo.notes = build_notes(project.permalink,
91
+ task.task_list_id, task.id)
92
+ things_todo.tag_names = task_list_cache[task.task_list_id]
93
+
88
94
  unless task.due_on.nil?
89
95
  things_todo.due_date = Time.parse(task.due_on)
90
96
  end
@@ -95,9 +101,8 @@ module TeamboxThingsSync
95
101
  else
96
102
  things_todo.open
97
103
  end
98
-
99
- things_todo.tag_names = task_list_cache[task.task_list_id]
100
- things_todo.save
104
+
105
+ things_todo.save
101
106
  log "\"#{task.name}\" has been saved in Things.app"
102
107
  end
103
108
  end
@@ -113,6 +118,16 @@ module TeamboxThingsSync
113
118
  # end
114
119
  end
115
120
 
121
+ def build_notes(project_permalink, task_list_id, task_id)
122
+ notes = task_url(project_permalink, task_list_id, task_id)+"\n\n"
123
+ @client.project_task_comments(project_permalink, task_id).reverse.each do |c|
124
+ unless c.body.nil? || c.body.empty?
125
+ notes << "#{@user_name_cache[c.user_id]} @ #{c.updated_at}:\n #{c.body} \n----------\n\n"
126
+ end
127
+ end
128
+ notes
129
+ end
130
+
116
131
  # finds person_id in given project
117
132
  def find_person_id(project_permalink)
118
133
  project_people = @client.project_people(project_permalink)
@@ -0,0 +1,19 @@
1
+ module TeamboxThingsSync
2
+ # saves unnecessary API queries for task list names
3
+ module Cache
4
+ class BaseCache
5
+ def initialize(client, config = {})
6
+ @data = {}
7
+ @client = client
8
+ @config = config
9
+ end
10
+
11
+ def [](id)
12
+ if @data[id].nil?
13
+ @data[id] = query_api(id)
14
+ end
15
+ @data[id]
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,9 @@
1
+ module TeamboxThingsSync
2
+ module Cache
3
+ class TaskListCache < BaseCache
4
+ def query_api(id)
5
+ @client.project_task_list(@config[:project_permalink], id).name
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,10 @@
1
+ module TeamboxThingsSync
2
+ module Cache
3
+ class UserNameCache < BaseCache
4
+ def query_api(id)
5
+ user = @client.user(id)
6
+ "#{user.first_name} #{user.last_name}"
7
+ end
8
+ end
9
+ end
10
+ end
data/spec/spec_helper.rb CHANGED
@@ -5,4 +5,11 @@ require 'things'
5
5
  require 'time'
6
6
  require 'timeout'
7
7
  require 'rspec'
8
- Dir["#{File.dirname(__FILE__)}/../lib/*.rb"].each {|f| require f}
8
+
9
+ Dir["#{File.dirname(__FILE__)}/../lib/*.rb"].each {|f| require f}
10
+
11
+ module Things
12
+ def self.names_of_todos_in_today_list
13
+ Things::App.lists.today.reference.todos.name.get
14
+ end
15
+ end
@@ -0,0 +1,14 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
+
3
+ describe "TeamboxThingsSync::Cache::TaskListCache" do
4
+ it "should query teambox api, get and return task name" do
5
+ @client = double
6
+ to_return = Hashie::Mash.new(:name => "test")
7
+
8
+ task_list_cache = TeamboxThingsSync::Cache::TaskListCache.new(@client,
9
+ {:project_permalink => "testing"})
10
+ @client.should_receive(:project_task_list).with("testing", 1).
11
+ and_return(to_return)
12
+ task_list_cache[1].should == "test"
13
+ end
14
+ end
@@ -0,0 +1,15 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
+
3
+ describe "TeamboxThingsSync::Cache::UserNameCache" do
4
+ it "should query teambox api, get and return user name" do
5
+ @client = double
6
+ to_return = Hashie::Mash.new(:first_name => "John", :last_name => "Smith")
7
+
8
+ user_name_cache = TeamboxThingsSync::Cache::UserNameCache.new(@client)
9
+ @client.should_receive(:user).with(22).
10
+ and_return(to_return)
11
+ user_name_cache[22].should == "John Smith"
12
+ @client.should_not_receive(:user)
13
+ user_name_cache[22]
14
+ end
15
+ end
@@ -1,5 +1,73 @@
1
1
  require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
2
 
3
- describe TeamboxThingsSync do
4
- pending
5
- end
3
+ describe "Things::Todo" do
4
+
5
+ describe "#move_to_today_if_necessary" do
6
+
7
+ before do
8
+ Things::App.instance.empty_trash
9
+ @todo = TeamboxThingsSync::Base.find_or_create_todo_in_things('TEST - Foo')
10
+ end
11
+
12
+ it "should be moved to Today if due date is today" do
13
+ @todo.due_date = Time.now
14
+ @todo.save
15
+ Things::names_of_todos_in_today_list.should include(@todo.name)
16
+ end
17
+
18
+ it "should be moved to Today if due date is in the past" do
19
+ @todo.due_date = Time.now-60*60*24*2
20
+ @todo.save
21
+ Things::names_of_todos_in_today_list.should include(@todo.name)
22
+ end
23
+
24
+ it "should not be moved to Today if due date is in the future" do
25
+ @todo.due_date = Time.now+60*60*24
26
+ @todo.save
27
+ Things::names_of_todos_in_today_list.should_not include(@todo.name)
28
+ end
29
+
30
+ it "should be moved to Today if user put it manually into Today and then it was resetted by Things::Todo" do
31
+ @todo.save
32
+ @todo.move(Things::List.today)
33
+ @todo = TeamboxThingsSync::Base.find_or_create_todo_in_things('TEST - Foo')
34
+ @todo.save
35
+ Things::names_of_todos_in_today_list.should include(@todo.name)
36
+ end
37
+
38
+ after do
39
+ @todo.delete
40
+ Things::App.instance.empty_trash
41
+ end
42
+
43
+ end
44
+
45
+ describe "#remember_today_listing" do
46
+
47
+ before do
48
+ Things::App.instance.empty_trash
49
+ @todo = TeamboxThingsSync::Base.find_or_create_todo_in_things('TEST - Foo')
50
+ @todo.save
51
+ end
52
+
53
+ it "should return true if todo existed in Today before updating" do
54
+ @todo.move(Things::List.today)
55
+ @todo = TeamboxThingsSync::Base.find_or_create_todo_in_things('TEST - Foo')
56
+ @todo.save
57
+ @todo.was_in_today.should be_true
58
+ end
59
+
60
+ it "should return false if todo didn't exist in Today before updating" do
61
+ @todo = TeamboxThingsSync::Base.find_or_create_todo_in_things('TEST - Foo')
62
+ @todo.save
63
+ @todo.was_in_today.should be_false
64
+ end
65
+
66
+ after do
67
+ @todo.delete
68
+ Things::App.instance.empty_trash
69
+ end
70
+
71
+ end
72
+
73
+ end
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{teambox-things-sync}
8
- s.version = "0.1.1"
8
+ s.version = "0.1.2"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Arkadiusz Holko"]
12
- s.date = %q{2010-09-15}
12
+ s.date = %q{2010-09-17}
13
13
  s.default_executable = %q{teambox-things-sync}
14
14
  s.email = %q{fastred@fastred.org}
15
15
  s.executables = ["teambox-things-sync"]
@@ -28,12 +28,15 @@ Gem::Specification.new do |s|
28
28
  "bin/teambox-things-sync",
29
29
  "lib/teambox-things-sync.rb",
30
30
  "lib/teambox-things-sync/base.rb",
31
+ "lib/teambox-things-sync/cache/base_cache.rb",
32
+ "lib/teambox-things-sync/cache/task_list_cache.rb",
33
+ "lib/teambox-things-sync/cache/user_name_cache.rb",
31
34
  "lib/teambox-things-sync/command.rb",
32
35
  "lib/teambox-things-sync/config_store.rb",
33
- "lib/teambox-things-sync/task_list_cache.rb",
34
36
  "spec/spec_helper.rb",
35
37
  "spec/teambox-things-sync/base_spec.rb",
36
- "spec/teambox-things-sync/task_list_cache_spec.rb",
38
+ "spec/teambox-things-sync/cache/task_list_cache_spec.rb",
39
+ "spec/teambox-things-sync/cache/user_name_cache_spec.rb",
37
40
  "spec/teambox-things-sync_spec.rb",
38
41
  "teambox-things-sync.gemspec"
39
42
  ]
@@ -45,7 +48,8 @@ Gem::Specification.new do |s|
45
48
  s.test_files = [
46
49
  "spec/spec_helper.rb",
47
50
  "spec/teambox-things-sync/base_spec.rb",
48
- "spec/teambox-things-sync/task_list_cache_spec.rb",
51
+ "spec/teambox-things-sync/cache/task_list_cache_spec.rb",
52
+ "spec/teambox-things-sync/cache/user_name_cache_spec.rb",
49
53
  "spec/teambox-things-sync_spec.rb"
50
54
  ]
51
55
 
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 1
8
- - 1
9
- version: 0.1.1
8
+ - 2
9
+ version: 0.1.2
10
10
  platform: ruby
11
11
  authors:
12
12
  - Arkadiusz Holko
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-09-15 00:00:00 +02:00
17
+ date: 2010-09-17 00:00:00 +02:00
18
18
  default_executable: teambox-things-sync
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -81,12 +81,15 @@ files:
81
81
  - bin/teambox-things-sync
82
82
  - lib/teambox-things-sync.rb
83
83
  - lib/teambox-things-sync/base.rb
84
+ - lib/teambox-things-sync/cache/base_cache.rb
85
+ - lib/teambox-things-sync/cache/task_list_cache.rb
86
+ - lib/teambox-things-sync/cache/user_name_cache.rb
84
87
  - lib/teambox-things-sync/command.rb
85
88
  - lib/teambox-things-sync/config_store.rb
86
- - lib/teambox-things-sync/task_list_cache.rb
87
89
  - spec/spec_helper.rb
88
90
  - spec/teambox-things-sync/base_spec.rb
89
- - spec/teambox-things-sync/task_list_cache_spec.rb
91
+ - spec/teambox-things-sync/cache/task_list_cache_spec.rb
92
+ - spec/teambox-things-sync/cache/user_name_cache_spec.rb
90
93
  - spec/teambox-things-sync_spec.rb
91
94
  - teambox-things-sync.gemspec
92
95
  has_rdoc: true
@@ -122,5 +125,6 @@ summary: Simple ruby app for Teambox and Things.app syncing
122
125
  test_files:
123
126
  - spec/spec_helper.rb
124
127
  - spec/teambox-things-sync/base_spec.rb
125
- - spec/teambox-things-sync/task_list_cache_spec.rb
128
+ - spec/teambox-things-sync/cache/task_list_cache_spec.rb
129
+ - spec/teambox-things-sync/cache/user_name_cache_spec.rb
126
130
  - spec/teambox-things-sync_spec.rb
@@ -1,17 +0,0 @@
1
- module TeamboxThingsSync
2
- class TaskListCache
3
-
4
- def initialize(client, project_name)
5
- @data = {}
6
- @client = client
7
- @project_name = project_name
8
- end
9
-
10
- def [](task_list_id)
11
- if @data[task_list_id].nil?
12
- @data[task_list_id] = @client.project_task_list(@project_name, task_list_id).name
13
- end
14
- @data[task_list_id]
15
- end
16
- end
17
- end
@@ -1,5 +0,0 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
-
3
- describe "TeamboxThingsSync::TaskListCache" do
4
- pending
5
- end