waddup 0.0.2 → 0.1.0

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
2
  SHA1:
3
- metadata.gz: 9412cd78378d88a3daf9f219baa2cc1a35fd81d7
4
- data.tar.gz: c749fa77c45f8a397b86c90c32d56e02e0f8b637
3
+ metadata.gz: 124b07086882a87d52aeac3f2774ef9189eb9c6c
4
+ data.tar.gz: a760abd321c924beca39c80bb54dbd190277b7ac
5
5
  SHA512:
6
- metadata.gz: a8b44de7bd90cfeedfc321be128d67fe72ba714756dea4cb359cddf80e0e4b6eddf636e11c9880649816cfabcac17b19c26d3e57092402890ba473247e8ef108
7
- data.tar.gz: fdc7a2ca6d6f514cad0f679b2ec4b1a3024391164642bfdf2649779e890a053492c0af2aed343de3d7cb9d23ffe5b0011453572da59f6997bbfcd686fd598afa
6
+ metadata.gz: c56e90b616d1d99204b4e9a09f138d925522fa8fed652b4d4a9aa6c0b2f2825ef35b57251c8cd152a7d8fe2a1d08bb344643b70e22cebaa66c30d788b176f838
7
+ data.tar.gz: 2dbe261c3af49768d231a8e30c258c44743067f8efecf54b9f4ec3f52fd560d3260bb03d12572ceae4138ca4883f333eb69341d23e9fd9930bd1facd9c9a9108
@@ -1,9 +1,5 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 1.8.7
4
- - 1.9.2
5
3
  - 1.9.3
6
4
  - 2.0.0
7
- - rbx-18mode
8
- - rbx-19mode
9
- script: bundle exec rake test
5
+ script: bundle exec rake spec
@@ -1,5 +1,12 @@
1
1
  # Changelog
2
2
 
3
+ ### v0.1.0 - November 29, 2013
4
+ - Drop support for 1.8.7 and 1.9.2.
5
+ - From/to arguments are treated as past by default.
6
+ - Git source considers all branches and excludes merge commits.
7
+ - Events obtained through AppleScript are now sorted correctly.
8
+ - Improve Apple Mail source performance.
9
+
3
10
  ### v0.0.2 - October 30, 2013
4
11
  - Initial alpha release with Git, Apple Mail and Apple Calender sources.
5
12
 
data/README.md CHANGED
@@ -10,7 +10,7 @@ Waddup is a Ruby gem that retraces your activities from arbitrary sources - such
10
10
 
11
11
  Perfect for those who have lost track of what they have worked on.
12
12
 
13
- **Supported Ruby versions: 1.8.7 or higher**
13
+ **Supported Ruby versions: 1.9.3 or higher**
14
14
 
15
15
  Licensed under the **MIT** license, see LICENSE for more information.
16
16
 
data/Rakefile CHANGED
@@ -1,9 +1,10 @@
1
1
  require 'bundler/gem_tasks'
2
2
  require 'rspec/core/rake_task'
3
3
 
4
- RSpec::Core::RakeTask.new(:test) do |spec|
4
+ RSpec::Core::RakeTask.new(:spec) do |spec|
5
5
  spec.pattern = 'spec/*_spec.rb'
6
6
  spec.rspec_opts = ['--color']
7
7
  end
8
8
 
9
- task :default => :test
9
+ task test: :spec
10
+ task default: :spec
@@ -1,5 +1,6 @@
1
1
  require 'waddup/event'
2
2
  require 'waddup/extension'
3
+ require 'waddup/extensions/file_system'
3
4
  require 'waddup/extensions/system'
4
5
  require 'waddup/extensions/applescript'
5
6
  require 'waddup/registry'
@@ -7,9 +7,9 @@ module Waddup
7
7
  attr_accessor :sources, :from, :to
8
8
 
9
9
  KEYWORDS = {
10
- :sources => %w[with],
11
- :from => %w[from since],
12
- :to => %w[to until uptil upto through]
10
+ sources: %w[with],
11
+ from: %w[from since],
12
+ to: %w[to until uptil upto through]
13
13
  }
14
14
 
15
15
  KEYWORD_BOUNDARY = "(?:\\s#{KEYWORDS.values.flatten.join('|\\s')}|\\Z)"
@@ -23,11 +23,11 @@ module Waddup
23
23
  end
24
24
 
25
25
  parse_keyword :from do |match|
26
- @from = Chronic.parse match[1]
26
+ @from = Chronic.parse match[1], context: :past
27
27
  end
28
28
 
29
29
  parse_keyword :to do |match|
30
- @to = Chronic.parse match[1]
30
+ @to = Chronic.parse match[1], context: :past
31
31
  end
32
32
  end
33
33
 
@@ -3,7 +3,7 @@ module Waddup
3
3
  module Extension::AppleScript
4
4
  include Waddup::Extension::System
5
5
 
6
- # Runs given AppleScript
6
+ # Runs given AppleScript on disk
7
7
  #
8
8
  # Options:
9
9
  #
@@ -13,7 +13,7 @@ module Waddup
13
13
  def applescript(script, options = {})
14
14
  args = options.delete(:args) || []
15
15
  arguments = args.map { |arg| " '#{arg}'" }.join
16
- results = run("osascript -s s -e '#{script}'#{arguments}")
16
+ results = run("osascript -s s '#{script}'#{arguments}")
17
17
 
18
18
  # TODO: This is very scary, find alternatives!
19
19
  eval "[#{results[1...-1]}]" if options.delete(:as_ruby)
@@ -22,7 +22,7 @@ module Waddup
22
22
  # Whether AppleScript is available
23
23
  def applescript?
24
24
  osx? && begin
25
- run('osalang', :quietly => true).include? 'AppleScript'
25
+ run('osalang', quietly: true).include? 'AppleScript'
26
26
  end
27
27
  end
28
28
 
@@ -0,0 +1,14 @@
1
+ require 'pathname'
2
+
3
+ module Waddup
4
+
5
+ module Extension::FileSystem
6
+
7
+ # Resolves folder for given path
8
+ def folder_of(path)
9
+ Pathname.new(path).dirname
10
+ end
11
+
12
+ end
13
+
14
+ end
@@ -3,29 +3,12 @@ module Waddup
3
3
  class Source::AppleCalendar < Waddup::Source
4
4
  include Waddup::Extension::AppleScript
5
5
  extend Waddup::Extension::AppleScript
6
+ extend Waddup::Extension::FileSystem
6
7
 
7
8
  ALIAS = 'ical'
8
9
  ICON = "\xF0\x9F\x93\x85 "
9
10
 
10
- EVENT_SCRIPT = %Q{
11
- on run argv
12
- set window_from to date (item 1 of argv)
13
- set window_to to date (item 2 of argv)
14
-
15
- tell application "Calendar"
16
- set results to {}
17
-
18
- set cdars to (events whose start date <= window_to and end date > window_from) in every calendar
19
- repeat with cdar in cdars
20
- repeat with evt in cdar
21
- set end of results to {summary:summary of evt, start_date:start date of evt as string, end_date:end date of evt as string}
22
- end repeat
23
- end repeat
24
-
25
- results
26
- end tell
27
- end run
28
- }
11
+ EVENT_SCRIPT = folder_of(__FILE__) + 'apple_calender/events.applescript'
29
12
 
30
13
  # Aggregates calendar events
31
14
  #
@@ -36,14 +19,14 @@ module Waddup
36
19
  #
37
20
  def events(from, to)
38
21
  results = applescript EVENT_SCRIPT,
39
- :as_ruby => true,
40
- :args => [from.strftime('%d/%m/%Y %H:%M'), to.strftime('%d/%m/%Y %H:%M')]
22
+ as_ruby: true,
23
+ args: [from.strftime('%d/%m/%Y %H:%M'), to.strftime('%d/%m/%Y %H:%M')]
41
24
 
42
25
  results.map do |result|
43
26
  Waddup::Event.new do |e|
44
27
  e.label = result[:summary]
45
- e.at = DateTime.parse(result[:start_date])
46
- e.until = DateTime.parse(result[:end_date])
28
+ e.at = Time.parse(result[:start_date])
29
+ e.until = Time.parse(result[:end_date])
47
30
  e.source = self
48
31
  end
49
32
  end
@@ -0,0 +1,17 @@
1
+ on run argv
2
+ set window_from to date (item 1 of argv)
3
+ set window_to to date (item 2 of argv)
4
+
5
+ tell application "Calendar"
6
+ set results to {}
7
+
8
+ set cdars to (events whose start date <= window_to and end date > window_from) in every calendar
9
+ repeat with cdar in cdars
10
+ repeat with evt in cdar
11
+ set end of results to {summary:summary of evt, start_date:start date of evt as string, end_date:end date of evt as string}
12
+ end repeat
13
+ end repeat
14
+
15
+ results
16
+ end tell
17
+ end run
@@ -3,36 +3,12 @@ module Waddup
3
3
  class Source::AppleMail < Waddup::Source
4
4
  include Waddup::Extension::AppleScript
5
5
  extend Waddup::Extension::AppleScript
6
+ extend Waddup::Extension::FileSystem
6
7
 
7
8
  ALIAS = 'mail'
8
9
  ICON = "\xE2\x9C\x89\xEF\xB8\x8F "
9
10
 
10
- # Until OSX Mavericks handles Gmail's sent-mailbox correctly, resort to
11
- # iterating through all mailboxes and identify sent messages by sender
12
- #
13
- # See: http://tidbits.com/article/14219
14
- SENT_MAIL_SCRIPT = %Q{
15
- on run argv
16
- set window_from to date (item 1 of argv)
17
- set window_to to date (item 2 of argv)
18
-
19
- tell application "Mail"
20
- set results to {}
21
-
22
- repeat with acct in every account
23
- set username to user name of acct
24
- set mboxes to (messages whose sender contains username and date sent >= window_from and date sent <= window_to) in every mailbox in acct
25
- repeat with mbox in mboxes
26
- repeat with msg in mbox
27
- set the end of results to {subject:subject of msg, datetime:date sent of msg as string}
28
- end
29
- end repeat
30
- end repeat
31
-
32
- results
33
- end tell
34
- end run
35
- }
11
+ SENT_MAIL_SCRIPT = folder_of(__FILE__) + 'apple_mail/sent_mail.applescript'
36
12
 
37
13
  # Aggregates sent mail events
38
14
  #
@@ -43,13 +19,13 @@ module Waddup
43
19
  #
44
20
  def events(from, to)
45
21
  results = applescript SENT_MAIL_SCRIPT,
46
- :as_ruby => true,
47
- :args => [from.strftime('%d/%m/%Y %H:%M'), to.strftime('%d/%m/%Y %H:%M')]
22
+ as_ruby: true,
23
+ args: [from.strftime('%d/%m/%Y %H:%M'), to.strftime('%d/%m/%Y %H:%M')]
48
24
 
49
25
  results.map do |result|
50
26
  Waddup::Event.new do |e|
51
27
  e.label = result[:subject]
52
- e.at = DateTime.parse(result[:datetime])
28
+ e.at = Time.parse(result[:datetime])
53
29
  e.source = self
54
30
  end
55
31
  end
@@ -0,0 +1,24 @@
1
+ on run argv
2
+ set window_from to date (item 1 of argv)
3
+ set window_to to date (item 2 of argv)
4
+
5
+ tell application "Mail"
6
+ set results to {}
7
+
8
+ repeat with acct in every account
9
+ set username to user name of acct
10
+ try
11
+ set mbox to mailbox "[Gmail]/All Mail" of acct
12
+ on error
13
+ set mbox to mailbox "Sent" of acct
14
+ end try
15
+
16
+ set msgs to (messages whose sender contains username and date sent >= window_from and date sent <= window_to) in mbox
17
+ repeat with msg in msgs
18
+ set the end of results to {subject:subject of msg, datetime:date sent of msg as string}
19
+ end repeat
20
+ end repeat
21
+
22
+ results
23
+ end tell
24
+ end run
@@ -62,11 +62,11 @@ module Waddup
62
62
  def events_for_repo(from, to, repo)
63
63
  repo_label = self.class.label_for_repo repo
64
64
 
65
- results = run "git --git-dir='#{repo}' log --author='#{author}' --since='#{from.iso8601}' --until='#{to.iso8601}' --format='format:#{GIT_FORMAT}'"
65
+ results = run "git --git-dir='#{repo}' log --all --no-merges --author='#{author}' --since='#{from.iso8601}' --until='#{to.iso8601}' --format='format:#{GIT_FORMAT}'"
66
66
  results.scan(EXTRACT_PATTERN).map do |hash, datetime, subject|
67
67
  Waddup::Event.new do |e|
68
68
  e.label = "[#{repo_label}] #{subject}"
69
- e.at = DateTime.parse(datetime)
69
+ e.at = Time.parse(datetime)
70
70
  e.source = self
71
71
  end
72
72
  end
@@ -89,7 +89,7 @@ module Waddup
89
89
 
90
90
  # Requires Git to be installed successfully
91
91
  def self.usable?
92
- run 'git --version', :quietly => true
92
+ run 'git --version', quietly: true
93
93
  $?.success?
94
94
  end
95
95
 
@@ -1,5 +1,5 @@
1
1
  module Waddup
2
2
 
3
- VERSION = '0.0.2'
3
+ VERSION = '0.1.0'
4
4
 
5
5
  end
@@ -1,14 +1,30 @@
1
- if RUBY_VERSION >= '1.9.3'
2
- require 'simplecov'
3
- require 'coveralls'
4
-
5
- SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[
6
- SimpleCov::Formatter::HTMLFormatter,
7
- Coveralls::SimpleCov::Formatter
8
- ]
9
- SimpleCov.start
10
- end
1
+ require 'simplecov'
2
+ require 'coveralls'
3
+
4
+ SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[
5
+ SimpleCov::Formatter::HTMLFormatter,
6
+ Coveralls::SimpleCov::Formatter
7
+ ]
8
+ SimpleCov.start
11
9
 
12
10
  require 'waddup'
13
11
 
14
12
  Dir['./spec/support/**/*.rb'].sort.each { |file| require file }
13
+
14
+ RSpec.configure do |config|
15
+
16
+ # Helper modules
17
+ config.extend ShellMock
18
+
19
+ config.before(:each) do
20
+ ShellMock.apply!
21
+ end
22
+
23
+ # Allow focussing on individual specs
24
+ config.filter_run focus: true
25
+ config.run_all_when_everything_filtered = true
26
+
27
+ # Run specs in random order to surface order dependencies
28
+ config.order = 'random'
29
+
30
+ end
@@ -1,26 +1,32 @@
1
- # Raised when shell operations are invoked
2
- class ShellNotAllowedError < StandardError
3
-
4
- def initialize(command)
5
- msg = "Shell operation is not allowed: #{command}\n\n"
6
- msg << "You can stub this request with the following snippet:\n\n"
7
- msg << "stub_shell(\"#{command}\", :output => '', :exitstatus => 0)\n "
8
- super msg
9
- end
1
+ module ShellMock
10
2
 
11
- end
3
+ # Raised when shell operations are invoked
4
+ class ShellNotAllowedError < StandardError
12
5
 
13
- # Prevent invoking shell operations
14
- class Object
6
+ def initialize(command)
7
+ msg = "Shell operation is not allowed: #{command}\n\n"
8
+ msg << "You can stub this request with the following snippet:\n\n"
9
+ msg << "stub_shell(\"#{command}\", output: '', exitstatus: 0)\n "
10
+ super msg
11
+ end
15
12
 
16
- def `(command)
17
- raise ShellNotAllowedError, command
18
13
  end
19
14
 
20
- def system(command)
21
- raise ShellNotAllowedError, command
15
+ # Applies shell mock functionality
16
+ def self.apply!
17
+ Object.any_instance.stub(:`).and_return do |foo|
18
+ raise ShellNotAllowedError, foo
19
+ end
20
+
21
+ Object.any_instance.stub(:system).and_return do |command|
22
+ raise ShellNotAllowedError, command
23
+ end
22
24
  end
23
25
 
26
+ end
27
+
28
+ class Object
29
+
24
30
  # Stubs shell operations matching given command
25
31
  #
26
32
  # Options:
@@ -1,13 +1,13 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Waddup::Source::AppleCalendar do
4
- let(:from) { DateTime.new 2013, 10, 16 }
5
- let(:to) { DateTime.new 2013, 10, 17 }
4
+ let(:from) { Date.new(2013, 10, 16) }
5
+ let(:to) { Date.new(2013, 10, 17) }
6
6
 
7
7
  describe '#events' do
8
8
  before do
9
- subject.stub_shell "osascript -s s -e '#{described_class::EVENT_SCRIPT}' '16/10/2013 00:00' '17/10/2013 00:00'",
10
- :output => fixture('sources/apple_calendar.results')
9
+ subject.stub_shell "osascript -s s '#{described_class::EVENT_SCRIPT}' '16/10/2013 00:00' '17/10/2013 00:00'",
10
+ output: fixture('sources/apple_calendar.results')
11
11
  end
12
12
 
13
13
  it 'aggregates events' do
@@ -27,7 +27,7 @@ describe Waddup::Source::AppleCalendar do
27
27
 
28
28
  context 'when AppleScript is available' do
29
29
  before do
30
- described_class.stub_shell 'osalang 2>&1', :output => 'AppleScript'
30
+ described_class.stub_shell 'osalang 2>&1', output: 'AppleScript'
31
31
  end
32
32
 
33
33
  it { should be_usable }
@@ -35,7 +35,7 @@ describe Waddup::Source::AppleCalendar do
35
35
 
36
36
  context 'when AppleScript is unavailable' do
37
37
  before do
38
- described_class.stub_shell 'osalang 2>&1', :exitstatus => 1
38
+ described_class.stub_shell 'osalang 2>&1', exitstatus: 1
39
39
  end
40
40
 
41
41
  it { should_not be_usable }
@@ -1,13 +1,13 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Waddup::Source::AppleMail do
4
- let(:from) { DateTime.new 2013, 10, 16 }
5
- let(:to) { DateTime.new 2013, 10, 17 }
4
+ let(:from) { Date.new(2013, 10, 16) }
5
+ let(:to) { Date.new(2013, 10, 17) }
6
6
 
7
7
  describe '#events' do
8
8
  before do
9
- subject.stub_shell "osascript -s s -e '#{described_class::SENT_MAIL_SCRIPT}' '16/10/2013 00:00' '17/10/2013 00:00'",
10
- :output => fixture('sources/apple_mail.results')
9
+ subject.stub_shell "osascript -s s '#{described_class::SENT_MAIL_SCRIPT}' '16/10/2013 00:00' '17/10/2013 00:00'",
10
+ output: fixture('sources/apple_mail.results')
11
11
  end
12
12
 
13
13
  it 'aggregates events' do
@@ -28,7 +28,7 @@ describe Waddup::Source::AppleMail do
28
28
 
29
29
  context 'when AppleScript is available' do
30
30
  before do
31
- described_class.stub_shell 'osalang 2>&1', :output => 'AppleScript'
31
+ described_class.stub_shell 'osalang 2>&1', output: 'AppleScript'
32
32
  end
33
33
 
34
34
  it { should be_usable }
@@ -36,7 +36,7 @@ describe Waddup::Source::AppleMail do
36
36
 
37
37
  context 'when AppleScript is unavailable' do
38
38
  before do
39
- described_class.stub_shell 'osalang 2>&1', :exitstatus => 1
39
+ described_class.stub_shell 'osalang 2>&1', exitstatus: 1
40
40
  end
41
41
 
42
42
  it { should_not be_usable }
@@ -3,8 +3,8 @@
3
3
  require 'spec_helper'
4
4
 
5
5
  describe Waddup::Source::Git do
6
- let(:from) { DateTime.new 2013, 10, 16 }
7
- let(:to) { DateTime.new 2013, 10, 17 }
6
+ let(:from) { Date.new(2013, 10, 16) }
7
+ let(:to) { Date.new(2013, 10, 17) }
8
8
 
9
9
  describe '#author' do
10
10
  it 'obtains author from git-config' do
@@ -44,8 +44,8 @@ describe Waddup::Source::Git do
44
44
 
45
45
  describe '#events_for_repo' do
46
46
  before do
47
- subject.stub_shell "git --git-dir='/waddup/.git' log --author='John Doe' --since='2013-10-16T00:00:00+00:00' --until='2013-10-17T00:00:00+00:00' --format='format:%h %ai %s'",
48
- :output => fixture('sources/git.log')
47
+ subject.stub_shell "git --git-dir='/waddup/.git' log --all --no-merges --author='John Doe' --since='2013-10-16' --until='2013-10-17' --format='format:%h %ai %s'",
48
+ output: fixture('sources/git.log')
49
49
  end
50
50
 
51
51
  it 'aggregates events for given repo' do
@@ -82,7 +82,7 @@ describe Waddup::Source::Git do
82
82
  describe '::usable?' do
83
83
  context 'when git is available' do
84
84
  before do
85
- described_class.stub_shell 'git --version 2>&1', :exitstatus => 0
85
+ described_class.stub_shell 'git --version 2>&1', exitstatus: 0
86
86
  end
87
87
 
88
88
  it { should be_usable }
@@ -90,7 +90,7 @@ describe Waddup::Source::Git do
90
90
 
91
91
  context 'when git is unavailable' do
92
92
  before do
93
- described_class.stub_shell 'git --version 2>&1', :exitstatus => 1
93
+ described_class.stub_shell 'git --version 2>&1', exitstatus: 1
94
94
  end
95
95
 
96
96
  it { should_not be_usable }
@@ -20,17 +20,15 @@ Gem::Specification.new do |s|
20
20
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
21
21
  s.require_paths = ['lib']
22
22
 
23
- s.add_dependency 'chronic'
23
+ s.add_dependency 'chronic', '~> 0.10.2'
24
24
 
25
25
  s.add_development_dependency 'rake'
26
26
  s.add_development_dependency 'rspec'
27
27
 
28
- if RUBY_VERSION >= '1.9.3'
29
- s.add_development_dependency 'guard'
30
- s.add_development_dependency 'guard-rspec'
31
- s.add_development_dependency 'listen'
28
+ s.add_development_dependency 'guard'
29
+ s.add_development_dependency 'guard-rspec'
30
+ s.add_development_dependency 'listen'
32
31
 
33
- s.add_development_dependency 'coveralls'
34
- s.add_development_dependency 'simplecov'
35
- end
32
+ s.add_development_dependency 'coveralls'
33
+ s.add_development_dependency 'simplecov'
36
34
  end
metadata CHANGED
@@ -1,29 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: waddup
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tim Kurvers
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-10-29 00:00:00.000000000 Z
11
+ date: 2013-11-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: chronic
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - '>='
17
+ - - ~>
18
18
  - !ruby/object:Gem::Version
19
- version: '0'
19
+ version: 0.10.2
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - '>='
24
+ - - ~>
25
25
  - !ruby/object:Gem::Version
26
- version: '0'
26
+ version: 0.10.2
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -149,11 +149,14 @@ files:
149
149
  - lib/waddup/event.rb
150
150
  - lib/waddup/extension.rb
151
151
  - lib/waddup/extensions/applescript.rb
152
+ - lib/waddup/extensions/file_system.rb
152
153
  - lib/waddup/extensions/system.rb
153
154
  - lib/waddup/registry.rb
154
155
  - lib/waddup/source.rb
155
156
  - lib/waddup/sources/apple_calendar.rb
157
+ - lib/waddup/sources/apple_calender/events.applescript
156
158
  - lib/waddup/sources/apple_mail.rb
159
+ - lib/waddup/sources/apple_mail/sent_mail.applescript
157
160
  - lib/waddup/sources/git.rb
158
161
  - lib/waddup/version.rb
159
162
  - spec/fixtures/sources/apple_calendar.results