things-rb 0.3.0 → 0.4.0

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 CHANGED
@@ -1,3 +1,9 @@
1
+ *0.4.0* (June 23, 2010)
2
+
3
+ * Added support to filter tasks by tags from the command line tool
4
+
5
+ *0.3.0* (August 29, 2009)
6
+
1
7
  *0.2.0* (August 29, 2009)
2
8
 
3
9
  * Added support for due dates, scheduled items & notes
data/README.markdown CHANGED
@@ -15,13 +15,13 @@ There are many reasons why you would use a command line version of Things, inclu
15
15
 
16
16
  ## Install
17
17
 
18
- $ sudo gem install haraldmartin-things-rb --source http://gems.github.com
18
+ $ gem install things-rb
19
19
 
20
20
  If you're on default Mac OS X Leopard and haven't upgraded your RubyGem installation you'll need to to this first:
21
21
 
22
- $ sudo gem update --system
22
+ $ gem update --system
23
23
 
24
- When the upgrade is done, just runt the `gem install ...` command above and you're set.
24
+ When the upgrade is done, just run the `gem install ...` command above and you're set.
25
25
 
26
26
 
27
27
  ## Usage
@@ -38,8 +38,7 @@ Example usage:
38
38
  tasks = things.today.map do |task|
39
39
  tags = "(#{task.tags.join(' ')})" if task.tags?
40
40
  project = "[#{task.parent}]" if task.parent?
41
- bullet = task.completed? ? "✓" : task.canceled? ? "×" : "-"
42
- [bullet, task.title, tags, project].compact.join(" ")
41
+ [task.bullet, task.title, tags, project].compact.join(" ")
43
42
  end
44
43
 
45
44
  puts tasks.compact.sort.join("\n")
@@ -71,17 +70,28 @@ Replace `today` with other focus to list the task
71
70
  $ things --all next
72
71
  $ things logbook
73
72
 
73
+ To just show tasks with a specific tag, use the `-t` or `--tag` option
74
+
75
+ $ things -t errands today
76
+
74
77
 
75
78
  ## Testing
76
79
 
77
- To view test document (`test/fixtures/Database.xml`) in Things, just launch Things.app with ⌥ (option/alt) down and click "Choose Library" and point it to `things-rb/test/fixtures`.
80
+ To view the test document (`test/fixtures/Database.xml`) in Things, just launch Things with ⌥ (option/alt) down and click "Choose Library" and point it to `things-rb/test/fixtures`.
78
81
  Be sure to disable automatic logging of completed tasks in the Things.app preferences so they won't be moved around in the document.
79
82
 
83
+ To play nice with other package managers than Rubygems, the command line tool (`bin/things`) and the tests `test/test_helper.rb` *don't* `require 'rubygems'` before `require 'hpricot'`. So if hpricot isn't in your path you need to run the tests slightly different.
84
+
85
+ `RUBYOPT=rubygems rake` works for me to load hpricot and the other required gems, but still test the local things version (i.e. not the gem).
86
+
87
+ Run the local command line tool using `ruby -r rubygems -I lib bin/things`.
88
+
89
+ Of course you can just add the require statements in your code in development without committing them.
90
+
80
91
 
81
92
  ## TODO
82
93
  - Support "Projects" focus
83
94
  - Optimize test and XML queries
84
- - Add tag support to binary
85
95
  - Organize the classes, make internal methods private
86
96
 
87
97
 
@@ -89,7 +99,7 @@ Be sure to disable automatic logging of completed tasks in the Things.app prefer
89
99
 
90
100
  By [Martin Ström](http://my-domain.se) under the MIT license:
91
101
 
92
- > Copyright (c) 2009 Martin Ström
102
+ > Copyright (c) 2009-2010 Martin Ström
93
103
  >
94
104
  > Permission is hereby granted, free of charge, to any person obtaining a copy
95
105
  > of this software and associated documentation files (the "Software"), to deal
data/Rakefile CHANGED
@@ -1,3 +1,4 @@
1
+ # -*- encoding: utf-8 -*-
1
2
  require "rubygems"
2
3
  require "rake/testtask"
3
4
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.3.0
1
+ 0.4.0
data/bin/things CHANGED
@@ -1,14 +1,18 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
+ require 'rubygems'
3
4
  require "optparse"
5
+
6
+ $: << File.dirname(__FILE__) + '/lib/things'
7
+
4
8
  require 'things'
5
9
 
6
10
  options = { :tasks => { :completed => false } }
11
+
7
12
  opts = OptionParser.new do |opts|
8
13
  opts.separator ''
9
14
  opts.separator 'Options:'
10
-
11
- opts.banner = "Usage: things [options] today|next|inbox|logbook|trash"
15
+ opts.banner = "Usage: things [options] today|next|inbox|someday|logbook|trash"
12
16
 
13
17
  def opts.show_usage
14
18
  puts self
@@ -20,8 +24,9 @@ opts = OptionParser.new do |opts|
20
24
  end
21
25
 
22
26
  opts.on("-c", "--completed", 'Shows only completed tasks') { options[:tasks] = { :completed => true } }
23
- opts.on("-a", "--all", 'Shows all tasks in the focus') { |f| options[:tasks] = { } }
24
-
27
+ opts.on("-a", "--all", 'Shows all tasks in the focus') { options[:tasks].delete(:completed) }
28
+ opts.on("-t TAG", "--tag TAG", 'Filter tasks by tag') { |f| options[:tasks][:tag] = f }
29
+
25
30
  opts.on_tail("-h", "--help", "Shows this help message") { opts.show_usage }
26
31
  opts.on_tail("-v", "--version", "Shows version") do
27
32
  puts Things::Version::STRING
@@ -48,5 +53,8 @@ tasks = things.focus(options[:focus]).tasks(options[:tasks]).map do |task|
48
53
  [task.bullet, task.title, tags, project].compact.join(" ")
49
54
  end
50
55
 
51
- puts tasks.compact.sort.join("\n")
56
+ if (sorted = tasks.compact.sort).any?
57
+ puts sorted.join("\n")
58
+ end
59
+
52
60
 
@@ -19,7 +19,7 @@ module Things
19
19
  @focus_cache[name] ||= Focus.new(name, @doc)
20
20
  end
21
21
 
22
- [:today, :inbox, :trash, :logbook, :next, :scheduled].each do |name|
22
+ [:today, :inbox, :trash, :logbook, :next, :scheduled, :someday].each do |name|
23
23
  class_eval <<-EOF
24
24
  def #{name}(options = {}) # def inbox(options = {})
25
25
  focus(:#{name}).tasks(options) # focus(:inbox).tasks(options)
data/lib/things/focus.rb CHANGED
@@ -58,6 +58,10 @@ module Things
58
58
  end
59
59
  end
60
60
  end
61
+
62
+ if tag = options[:tag]
63
+ @tasks = @tasks.select { |t| t.tag?(tag) }
64
+ end
61
65
  end
62
66
  end
63
67
  end
data/lib/things/task.rb CHANGED
@@ -1,3 +1,4 @@
1
+ # -*- encoding: utf-8 -*-
1
2
  module Things
2
3
  class Task
3
4
  include Comparable
@@ -5,14 +6,21 @@ module Things
5
6
  INCOMPLETED = 0
6
7
  CANCELED = 2
7
8
  COMPLETED = 3
8
-
9
+ CHECK_MARK = "✓"
10
+ X_MARK = "×"
11
+ MINUS_MARK = "-"
12
+
9
13
  def initialize(task_xml, doc)
10
14
  @doc = doc
11
15
  @xml_node = task_xml
12
16
  end
13
17
 
14
18
  def title
15
- @xml_node.at("attribute[@name='title']").inner_text
19
+ if n = @xml_node.at("attribute[@name='title']")
20
+ n.inner_text
21
+ else
22
+ "FAIL: [#{@xml_node}]"
23
+ end
16
24
  end
17
25
 
18
26
  alias_method :to_s, :title
@@ -44,7 +52,7 @@ module Things
44
52
  end
45
53
 
46
54
  def tag?(name)
47
- tags.include?(name)
55
+ tags.any? { |t| t.casecmp(name) == 0 }
48
56
  end
49
57
 
50
58
  def parent_id
@@ -101,7 +109,7 @@ module Things
101
109
  end
102
110
 
103
111
  def due?
104
- due_date && Time.now > due_date
112
+ !!due_date && Time.now > due_date
105
113
  end
106
114
 
107
115
  def scheduled_date
@@ -113,7 +121,14 @@ module Things
113
121
  end
114
122
 
115
123
  def bullet
116
- completed? ? "✓" : canceled? ? "×" : "-"
124
+ case
125
+ when completed?
126
+ CHECK_MARK
127
+ when canceled?
128
+ X_MARK
129
+ else
130
+ MINUS_MARK
131
+ end
117
132
  end
118
133
 
119
134
  def children_ids
@@ -1,7 +1,7 @@
1
1
  module Things
2
2
  module Version
3
3
  MAJOR = 0
4
- MINOR = 3
4
+ MINOR = 4
5
5
  TINY = 0
6
6
 
7
7
  STRING = [MAJOR, MINOR, TINY].join(".")
data/test/test_focus.rb CHANGED
@@ -89,6 +89,17 @@ class FocusTest < Test::Unit::TestCase
89
89
  assert !canceled.all? { |e| e.title.include?("cancel") }
90
90
  end
91
91
 
92
+ test "should not find canceled nor completed tasks when passing :canceled => false, :completed => false" do
93
+ tasks = @things.focus(:next).tasks(:canceled => false, :completed => false)
94
+ assert_equal 0, tasks.select(&:canceled?).length
95
+ assert_equal 0, tasks.select(&:completed?).length
96
+ end
97
+
98
+ test "should filter tasks by tag" do
99
+ tasks = @things.focus(:next).tasks(:tag => 'home')
100
+ assert tasks.all? { |e| e.tag?('home') }
101
+ end
102
+
92
103
  test "should not include projects when listing tasks" do
93
104
  with_children = @things.focus(:next).tasks.select(&:children?)
94
105
  assert_equal 0, with_children.length
data/test/test_helper.rb CHANGED
@@ -1,3 +1,4 @@
1
+ require "rubygems"
1
2
  require "things"
2
3
  require "test/unit"
3
4
  require "mocha"
@@ -23,4 +24,4 @@ class Test::Unit::TestCase
23
24
  end
24
25
  end
25
26
  end
26
- end
27
+ end
data/test/test_task.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # -*- encoding: utf-8 -*-
2
+
1
3
  require 'test_helper'
2
4
 
3
5
  class TaskTest < Test::Unit::TestCase
@@ -65,6 +67,12 @@ class TaskTest < Test::Unit::TestCase
65
67
  assert(!task.tag?("Errand"))
66
68
  end
67
69
 
70
+ test "if the task has a specific tag in other case" do
71
+ task = find_task(:with_tags)
72
+ assert task.tag?("HOME")
73
+ assert !task.tag?("errand")
74
+ end
75
+
68
76
  test "should find the tasks parent_id" do
69
77
  task = find_task(:with_parent)
70
78
  assert_equal("z154", task.parent_id)
data/things-rb.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{things-rb}
8
- s.version = "0.3.0"
8
+ s.version = "0.4.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Martin Str\303\266m"]
12
- s.date = %q{2010-01-20}
12
+ s.date = %q{2010-06-23}
13
13
  s.default_executable = %q{things}
14
14
  s.description = %q{Library and command-line tool for accessing Things.app databases}
15
15
  s.email = %q{name@my-domain.se}
@@ -41,7 +41,7 @@ Gem::Specification.new do |s|
41
41
  s.homepage = %q{http://github.com/haraldmartin/things-rb}
42
42
  s.rdoc_options = ["--charset=UTF-8"]
43
43
  s.require_paths = ["lib"]
44
- s.rubygems_version = %q{1.3.5}
44
+ s.rubygems_version = %q{1.3.7}
45
45
  s.summary = %q{Library and command-line tool for accessing Things.app databases}
46
46
  s.test_files = [
47
47
  "test/test_document.rb",
@@ -54,7 +54,7 @@ Gem::Specification.new do |s|
54
54
  current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
55
55
  s.specification_version = 3
56
56
 
57
- if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
57
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
58
58
  s.add_runtime_dependency(%q<hpricot>, [">= 0"])
59
59
  else
60
60
  s.add_dependency(%q<hpricot>, [">= 0"])
metadata CHANGED
@@ -1,7 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: things-rb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ hash: 15
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 4
9
+ - 0
10
+ version: 0.4.0
5
11
  platform: ruby
6
12
  authors:
7
13
  - "Martin Str\xC3\xB6m"
@@ -9,19 +15,23 @@ autorequire:
9
15
  bindir: bin
10
16
  cert_chain: []
11
17
 
12
- date: 2010-01-20 00:00:00 +01:00
18
+ date: 2010-06-23 00:00:00 +02:00
13
19
  default_executable: things
14
20
  dependencies:
15
21
  - !ruby/object:Gem::Dependency
16
22
  name: hpricot
17
- type: :runtime
18
- version_requirement:
19
- version_requirements: !ruby/object:Gem::Requirement
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
20
26
  requirements:
21
27
  - - ">="
22
28
  - !ruby/object:Gem::Version
29
+ hash: 3
30
+ segments:
31
+ - 0
23
32
  version: "0"
24
- version:
33
+ type: :runtime
34
+ version_requirements: *id001
25
35
  description: Library and command-line tool for accessing Things.app databases
26
36
  email: name@my-domain.se
27
37
  executables:
@@ -60,21 +70,27 @@ rdoc_options:
60
70
  require_paths:
61
71
  - lib
62
72
  required_ruby_version: !ruby/object:Gem::Requirement
73
+ none: false
63
74
  requirements:
64
75
  - - ">="
65
76
  - !ruby/object:Gem::Version
77
+ hash: 3
78
+ segments:
79
+ - 0
66
80
  version: "0"
67
- version:
68
81
  required_rubygems_version: !ruby/object:Gem::Requirement
82
+ none: false
69
83
  requirements:
70
84
  - - ">="
71
85
  - !ruby/object:Gem::Version
86
+ hash: 3
87
+ segments:
88
+ - 0
72
89
  version: "0"
73
- version:
74
90
  requirements: []
75
91
 
76
92
  rubyforge_project:
77
- rubygems_version: 1.3.5
93
+ rubygems_version: 1.3.7
78
94
  signing_key:
79
95
  specification_version: 3
80
96
  summary: Library and command-line tool for accessing Things.app databases