thingamajig 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 898bf68717745f4122521d3dc8833c6f454daa4b
4
- data.tar.gz: ea4f2300f8d45ffb57cee09e447ab34dd95833d4
2
+ SHA256:
3
+ metadata.gz: b7a05d7b894dc4289c7b38a376b145b2935617697c5f3d7f0242b133604dbd90
4
+ data.tar.gz: 576194daa2c5e3b431ae642e8a1eb68f483c39d06025d3232fa142d977802c31
5
5
  SHA512:
6
- metadata.gz: e1499faabf11f4643d1ca7f7f06560a3078aeb16002c5859c49007a404ae1f69c288bc0e7567e6566622e8905ddd1061e8a3d85a59dad495343c107ca28c551d
7
- data.tar.gz: c4f790028bb56dfdb0c111b2880f689af4c133032e1d708093bb2378f2d87bc5764c8c916a75cbf544236ce07e5fdec29e0b468846ae920048634ae329509843
6
+ metadata.gz: 36f28972b740fe22abac00189f7a6d9918d64f60bd64104bc916fd2b500e55b6a15109bca18e38cfa35619c369193ea51bd084e024768ececc73f32010dcf124
7
+ data.tar.gz: fc8a87b362eea6ac557d8977de079243c8e56b36584d4cdf605c2eb3edd908e5c4234e05d74e0f4fa4d23f6e894d252f4781afba3fb29895446e72b79404fc10
data/README.md CHANGED
@@ -46,6 +46,8 @@ This README is severaly lacking in instructions. Here's some sample code that mi
46
46
  end
47
47
  ```
48
48
 
49
+ ### Naming
50
+
49
51
  If you're tired of typing "Thingamajig" out in full, feel free to alias it:
50
52
 
51
53
  ```ruby
@@ -70,6 +72,17 @@ Or install it yourself as:
70
72
 
71
73
  $ gem install thingamajig
72
74
 
75
+ ## Example Usage
76
+
77
+ I use Thingamajig extensively in my personal automated workflows. You can find the source code here: https://github.com/dv/dotworkflows
78
+
79
+ ## Research
80
+
81
+ A lot of this was done through trial-and-error. Helpful resources:
82
+
83
+ - [The official documentation by Cultured Code](https://culturedcode.com/things/download/Things3AppleScriptGuide.pdf) (beware, it's full of mistakes).
84
+ - Example of connecting to the underlying SQLite3 database: https://github.com/lucbeaulieu/KanbanView
85
+
73
86
  ## Development
74
87
 
75
88
  After checking out the repo, run `bin/setup` to install dependencies. Then, run `bin/console` for an interactive prompt that will allow you to experiment.
@@ -1,41 +1,13 @@
1
1
  class Thingamajig
2
2
  class Area < OsaObject
3
+ include Container
4
+
3
5
  def self.find_by(name:)
4
6
  Thingamajig::Area.new(Thingamajig.new.osa_object.areas[name])
5
7
  end
6
8
 
7
- # an Area's To Do list actually contains Projects & Todos, that's
8
- # why we need some extra filtering
9
- def todos(filter = nil)
10
- query = todos_query
11
- query = query.and(filter) if filter
12
-
13
- osa_object.to_dos[query].get.map do |osa_todo|
14
- Thingamajig::Todo.new osa_todo
15
- end
16
- end
17
-
18
- def projects(filter = nil)
19
- query = projects_query
20
- query = query.and(filter) if filter
21
-
22
- osa_object.to_dos[query].get.map do |osa_project|
23
- Thingamajig::Project.new osa_project
24
- end
25
- end
26
-
27
9
  def inspect
28
10
  "#<Thingamajig::Area '#{name}'>"
29
11
  end
30
-
31
- private
32
-
33
- def projects_query
34
- Appscript.its.class_.eq(:project)
35
- end
36
-
37
- def todos_query
38
- Appscript.its.class_.ne(:project)
39
- end
40
12
  end
41
13
  end
@@ -0,0 +1,50 @@
1
+ class Thingamajig
2
+ class List < OsaObject
3
+ include Container
4
+
5
+ class << self
6
+ def find_by(name:)
7
+ Thingamajig::List.new(Thingamajig.new.osa_object.lists[name])
8
+ end
9
+
10
+ def inbox
11
+ find_by(name: "Inbox")
12
+ end
13
+
14
+ def today
15
+ find_by(name: "Today")
16
+ end
17
+
18
+ def anytime
19
+ find_by(name: "Anytime")
20
+ end
21
+
22
+ def upcoming
23
+ find_by(name: "Upcoming")
24
+ end
25
+
26
+ def someday
27
+ find_by(name: "Someday")
28
+ end
29
+
30
+ def logbook
31
+ find_by(name: "Logbook")
32
+ end
33
+
34
+ def trash
35
+ find_by(name: "Trash")
36
+ end
37
+
38
+ # Projects scheduled for the future, not in an area ("later projects") in sidebar
39
+ def later_projects
40
+ Thingamajig::List.new(Thingamajig.new.osa_object.lists.ID("THMLonelyLaterProjectsListSource"))
41
+ end
42
+ end
43
+
44
+ def inspect
45
+ "#<Thingamajig::List '#{name}'>"
46
+ end
47
+ end
48
+ end
49
+
50
+
@@ -0,0 +1,62 @@
1
+ module Thingamajig::Container
2
+ # Some containers have todos and projects in one list
3
+ def items(filter = nil)
4
+ result_reference =
5
+ if filter
6
+ osa_object.to_dos[filter]
7
+ else
8
+ osa_object.to_dos
9
+ end
10
+
11
+ results = result_reference.get
12
+
13
+ wrap_collection(results)
14
+ end
15
+
16
+ def todos(filter = nil)
17
+ query = todos_query
18
+ query = query.and(filter) if filter
19
+
20
+ items(query)
21
+ end
22
+
23
+ def projects(filter = nil)
24
+ query = projects_query
25
+ query = query.and(filter) if filter
26
+
27
+ items(query)
28
+ end
29
+
30
+ private
31
+
32
+ def wrap_item(item)
33
+ item_class = item.class_.get
34
+
35
+ case item_class
36
+ when :to_do, :selected_to_do
37
+ Thingamajig::Todo.new(item)
38
+ when :project
39
+ Thingamajig::Project.new(item)
40
+ when :area
41
+ Thingamajig::Area.new(item)
42
+ when :list
43
+ Thingamajig::List.new(item)
44
+ else
45
+ raise "Don't know what #{item_class} is."
46
+ end
47
+ end
48
+
49
+ def wrap_collection(collection)
50
+ collection.map do |item|
51
+ wrap_item(item)
52
+ end
53
+ end
54
+
55
+ def projects_query
56
+ Appscript.its.class_.eq(:project)
57
+ end
58
+
59
+ def todos_query
60
+ Appscript.its.class_.ne(:project)
61
+ end
62
+ end
@@ -1,20 +1,15 @@
1
1
  class Thingamajig
2
- class Project < OsaObject
2
+ class Project < Todo
3
+ include Container
4
+
3
5
  def self.find_by(name:)
4
6
  Thingamajig::Project.new(Thingamajig.new.osa_object.projects[name])
5
7
  end
6
8
 
7
- def todos(filter = nil)
8
- osa_todos = osa_object.to_dos
9
- osa_todos = osa_todos[filter] if filter
10
-
11
- osa_todos.get.map do |osa_todo|
12
- Thingamajig::Todo.new osa_todo
13
- end
14
- end
15
-
16
9
  def create_todo!(name, notes)
17
- Thingamajig::Todo.new @osa_object.make(new: :to_do, with_properties: {name: name, notes: notes})
10
+ new_osa_object = osa_object.make(new: :to_do, with_properties: {name: name, notes: notes})
11
+
12
+ Thingamajig::Todo.new(new_osa_object)
18
13
  end
19
14
 
20
15
  def inspect
@@ -20,12 +20,47 @@ class Thingamajig
20
20
  activation_date && activation_date <= Date.today.to_time
21
21
  end
22
22
 
23
+ # Use `activate!` to move to Today with today's date as the activation
24
+ # date. This moving to Today list means it will also pop up at the top
25
+ # of the Today list in the UI.
26
+ #
27
+ # This is different from using the `schedule` command which retains the
28
+ # position in Today list from earlier.
29
+ def activate!
30
+ osa_object.move(to: Thingamajig::List.today.osa_object)
31
+ end
32
+
33
+ def deactivate!
34
+ osa_object.move(to: Thingamajig::List.anytime.osa_object)
35
+ end
36
+
23
37
  def activation_date=(new_activation_date)
24
38
  if completed? || canceled?
25
39
  self.completion_date = nil
26
40
  end
27
41
 
28
- osa_object.schedule(for: new_activation_date)
42
+ if new_activation_date.present?
43
+ osa_object.schedule(for: new_activation_date)
44
+ else
45
+ deactivate!
46
+ end
47
+ end
48
+
49
+ # Adds a todo to the bottom of the project
50
+ def project=(new_project)
51
+ if new_project
52
+ super(new_project.osa_object)
53
+ else
54
+ osa_object.project.delete
55
+ end
56
+ end
57
+
58
+ def area=(new_area)
59
+ if new_area
60
+ super(new_area.osa_object)
61
+ else
62
+ osa_object.area.delete
63
+ end
29
64
  end
30
65
 
31
66
  def inspect
@@ -1,3 +1,3 @@
1
1
  class Thingamajig
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.1"
3
3
  end
data/lib/thingamajig.rb CHANGED
@@ -1,9 +1,13 @@
1
1
  require "rb-scpt"
2
2
  require "thingamajig/version"
3
3
  require "thingamajig/osa_object"
4
+ require "thingamajig/modules/container"
5
+
4
6
  require "thingamajig/area"
5
- require "thingamajig/project"
7
+ require "thingamajig/list"
6
8
  require "thingamajig/todo"
9
+ require "thingamajig/project"
10
+
7
11
 
8
12
  class Thingamajig
9
13
  attr :app
@@ -21,4 +25,10 @@ class Thingamajig
21
25
  Thingamajig::Project.new(osa_project)
22
26
  end
23
27
  end
28
+
29
+ def todos
30
+ app.to_dos.get.map do |osa_todo|
31
+ Thingamajig::Todo.new(osa_todo)
32
+ end
33
+ end
24
34
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: thingamajig
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Verhasselt
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-06-16 00:00:00.000000000 Z
11
+ date: 2022-02-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -71,6 +71,8 @@ files:
71
71
  - bin/setup
72
72
  - lib/thingamajig.rb
73
73
  - lib/thingamajig/area.rb
74
+ - lib/thingamajig/list.rb
75
+ - lib/thingamajig/modules/container.rb
74
76
  - lib/thingamajig/osa_object.rb
75
77
  - lib/thingamajig/project.rb
76
78
  - lib/thingamajig/todo.rb
@@ -80,7 +82,7 @@ homepage: https://github.com/dv/thingamajig
80
82
  licenses:
81
83
  - MIT
82
84
  metadata: {}
83
- post_install_message:
85
+ post_install_message:
84
86
  rdoc_options: []
85
87
  require_paths:
86
88
  - lib
@@ -95,9 +97,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
95
97
  - !ruby/object:Gem::Version
96
98
  version: '0'
97
99
  requirements: []
98
- rubyforge_project:
99
- rubygems_version: 2.4.5
100
- signing_key:
100
+ rubygems_version: 3.0.3
101
+ signing_key:
101
102
  specification_version: 4
102
103
  summary: A library providing an OOPy API for a local Things 3 Mac app
103
104
  test_files: []