autoevernote 0.1.0.alpha.1

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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 949f81540709d3972f2cc2334323efa8a154e67d
4
+ data.tar.gz: 4e1cce6902ed4456a584d6a7662bba81d76f3a8c
5
+ SHA512:
6
+ metadata.gz: 20524a4bfd846e5f26a122e65cd28f1e8351e41b0f2269a54659bce1a023a60d85650ff7cc5400a96caec4de455eb861b3e3ffc2a190b6dec8bac26b9aa9d8dc
7
+ data.tar.gz: ce4ba0e731e17ad38d695169dd5981f4a3e877d73b116cf3603baac731fb35a2fdde386bc96c5f1203cbf21083a7a937fe270e9dff6435b300fabc6882d1bf07
@@ -0,0 +1,18 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ InstalledFiles
7
+ _yardoc
8
+ coverage
9
+ doc/
10
+ lib/bundler/man
11
+ pkg
12
+ rdoc
13
+ spec/reports
14
+ test/tmp
15
+ test/version_tmp
16
+ tmp
17
+ config/autoevernote.yml
18
+ log
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --format progress
@@ -0,0 +1 @@
1
+ 1.9.3-p448
@@ -0,0 +1,3 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.3
data/Gemfile ADDED
@@ -0,0 +1,6 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'asana-ruby', github: 'blackxored/asana-ruby', branch: 'master'
4
+ gem 'configurations', github: 'blackxored/configurations', branch: 'indifferent-hash-for-config'
5
+ # Specify your gem's dependencies in autoevernote.gemspec
6
+ gemspec
@@ -0,0 +1,170 @@
1
+ GIT
2
+ remote: git://github.com/blackxored/asana-ruby.git
3
+ revision: 825bb8faf45dc96fd9433e526808f350035dee17
4
+ branch: master
5
+ specs:
6
+ asana-ruby (0.0.2)
7
+ activeresource (>= 3.0)
8
+
9
+ GIT
10
+ remote: git://github.com/blackxored/configurations.git
11
+ revision: ee194b869f03e418b79f27862d717e923c8a36ce
12
+ branch: indifferent-hash-for-config
13
+ specs:
14
+ configurations (1.4.0)
15
+ activesupport
16
+
17
+ PATH
18
+ remote: .
19
+ specs:
20
+ autoevernote (0.1.0.alpha.1)
21
+ activesupport (~> 4.0)
22
+ evernote_oauth
23
+ httparty
24
+ mail
25
+ nokogiri
26
+ thin
27
+ thor
28
+
29
+ GEM
30
+ remote: https://rubygems.org/
31
+ specs:
32
+ activemodel (4.1.6)
33
+ activesupport (= 4.1.6)
34
+ builder (~> 3.1)
35
+ activeresource (4.0.0)
36
+ activemodel (~> 4.0)
37
+ activesupport (~> 4.0)
38
+ rails-observers (~> 0.1.1)
39
+ activesupport (4.1.6)
40
+ i18n (~> 0.6, >= 0.6.9)
41
+ json (~> 1.7, >= 1.7.7)
42
+ minitest (~> 5.1)
43
+ thread_safe (~> 0.1)
44
+ tzinfo (~> 1.1)
45
+ addressable (2.3.6)
46
+ builder (3.2.2)
47
+ cane (2.6.2)
48
+ parallel
49
+ celluloid (0.16.0)
50
+ timers (~> 4.0.0)
51
+ coderay (1.1.0)
52
+ coveralls (0.7.1)
53
+ multi_json (~> 1.3)
54
+ rest-client
55
+ simplecov (>= 0.7)
56
+ term-ansicolor
57
+ thor
58
+ crack (0.4.2)
59
+ safe_yaml (~> 1.0.0)
60
+ daemons (1.1.9)
61
+ diff-lcs (1.2.5)
62
+ docile (1.1.5)
63
+ eventmachine (1.0.3)
64
+ evernote-thrift (1.25.1)
65
+ evernote_oauth (0.2.3)
66
+ evernote-thrift
67
+ oauth (>= 0.4.1)
68
+ ffi (1.9.3)
69
+ formatador (0.2.5)
70
+ guard (2.6.1)
71
+ formatador (>= 0.2.4)
72
+ listen (~> 2.7)
73
+ lumberjack (~> 1.0)
74
+ pry (>= 0.9.12)
75
+ thor (>= 0.18.1)
76
+ guard-rspec (4.3.1)
77
+ guard (~> 2.1)
78
+ rspec (>= 2.14, < 4.0)
79
+ hitimes (1.2.2)
80
+ httparty (0.13.1)
81
+ json (~> 1.8)
82
+ multi_xml (>= 0.5.2)
83
+ i18n (0.6.11)
84
+ json (1.8.1)
85
+ listen (2.7.9)
86
+ celluloid (>= 0.15.2)
87
+ rb-fsevent (>= 0.9.3)
88
+ rb-inotify (>= 0.9)
89
+ lumberjack (1.0.9)
90
+ mail (2.6.1)
91
+ mime-types (>= 1.16, < 3)
92
+ method_source (0.8.2)
93
+ mime-types (2.3)
94
+ mini_portile (0.6.0)
95
+ minitest (5.4.1)
96
+ multi_json (1.10.1)
97
+ multi_xml (0.5.5)
98
+ netrc (0.7.7)
99
+ nokogiri (1.6.3.1)
100
+ mini_portile (= 0.6.0)
101
+ oauth (0.4.7)
102
+ parallel (1.3.2)
103
+ pry (0.10.1)
104
+ coderay (~> 1.1.0)
105
+ method_source (~> 0.8.1)
106
+ slop (~> 3.4)
107
+ rack (1.5.2)
108
+ rails-observers (0.1.2)
109
+ activemodel (~> 4.0)
110
+ rake (10.3.2)
111
+ rb-fsevent (0.9.4)
112
+ rb-inotify (0.9.5)
113
+ ffi (>= 0.5.0)
114
+ rest-client (1.7.2)
115
+ mime-types (>= 1.16, < 3.0)
116
+ netrc (~> 0.7)
117
+ rspec (3.1.0)
118
+ rspec-core (~> 3.1.0)
119
+ rspec-expectations (~> 3.1.0)
120
+ rspec-mocks (~> 3.1.0)
121
+ rspec-core (3.1.4)
122
+ rspec-support (~> 3.1.0)
123
+ rspec-expectations (3.1.1)
124
+ diff-lcs (>= 1.2.0, < 2.0)
125
+ rspec-support (~> 3.1.0)
126
+ rspec-mocks (3.1.1)
127
+ rspec-support (~> 3.1.0)
128
+ rspec-support (3.1.0)
129
+ safe_yaml (1.0.3)
130
+ simplecov (0.9.1)
131
+ docile (~> 1.1.0)
132
+ multi_json (~> 1.0)
133
+ simplecov-html (~> 0.8.0)
134
+ simplecov-html (0.8.0)
135
+ slop (3.6.0)
136
+ term-ansicolor (1.3.0)
137
+ tins (~> 1.0)
138
+ thin (1.6.2)
139
+ daemons (>= 1.0.9)
140
+ eventmachine (>= 1.0.0)
141
+ rack (>= 1.0.0)
142
+ thor (0.19.1)
143
+ thread_safe (0.3.4)
144
+ timers (4.0.1)
145
+ hitimes
146
+ tins (1.3.3)
147
+ tzinfo (1.2.2)
148
+ thread_safe (~> 0.1)
149
+ vcr (2.9.3)
150
+ webmock (1.13.0)
151
+ addressable (>= 2.2.7)
152
+ crack (>= 0.3.2)
153
+
154
+ PLATFORMS
155
+ ruby
156
+
157
+ DEPENDENCIES
158
+ asana-ruby!
159
+ autoevernote!
160
+ bundler (~> 1.3)
161
+ cane
162
+ configurations!
163
+ coveralls
164
+ guard-rspec
165
+ pry
166
+ rake
167
+ rspec
168
+ simplecov
169
+ vcr
170
+ webmock (~> 1.13.0)
@@ -0,0 +1,5 @@
1
+ guard :rspec do
2
+ watch(%r{^spec/.+_spec\.rb$})
3
+ watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
4
+ watch('spec/spec_helper.rb') { "spec" }
5
+ end
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Adrian Perez
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,35 @@
1
+ # Autoevernote
2
+
3
+ [![Gem Version](https://badge.fury.io/rb/autoevernote.png)](http://badge.fury.io/rb/autoevernote) [![Build Status](https://travis-ci.org/blackxored/autoevernote.png)](https://travis-ci.org/blackxored/autoevernote) [![Coverage Status](https://coveralls.io/repos/blackxored/autoevernote/badge.png?branch=master)](https://coveralls.io/r/blackxored/autoevernote) [![Dependency Status](https://gemnasium.com/blackxored/autoevernote.png)](https://gemnasium.com/blackxored/autoevernote) [![Code Climate](https://codeclimate.com/github/blackxored/autoevernote.png)](https://codeclimate.com/github/blackxored/autoevernote)
4
+
5
+ A set of automated helpers for Evernote, Asana, and a few other tools.
6
+ Inspired by the Evernote Diary series, and the concept of quantified self.
7
+
8
+ ## Installation
9
+
10
+ $ gem install autoevernote
11
+
12
+ Or if you're developing add this line to your application's Gemfile:
13
+
14
+ gem 'autoevernote'
15
+
16
+ And then execute:
17
+
18
+ $ bundle
19
+
20
+ ## Usage
21
+
22
+ Example usage for the executable:
23
+
24
+ __TODO__: screenshots and descriptions
25
+
26
+ $ autoevernote log_completed_tasks
27
+ $ autoevernote compute_stats
28
+
29
+ ## Contributing
30
+
31
+ 1. Fork it
32
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
33
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
34
+ 4. Push to the branch (`git push origin my-new-feature`)
35
+ 5. Create new Pull Request
@@ -0,0 +1,5 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new('spec')
5
+ task :default => :spec
@@ -0,0 +1,40 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'autoevernote/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "autoevernote"
8
+ spec.version = AutoEvernote::VERSION
9
+ spec.authors = ["Adrian Perez"]
10
+ spec.email = ["adrianperez.deb@gmail.com"]
11
+ spec.description = %q{A set of recipes for programatically getting stuff into Evernote}
12
+ spec.summary = spec.description
13
+ spec.homepage = "https://github.com/blackxored/autoevernote"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_dependency "thor"
22
+ # spec.add_dependency "configurations"
23
+ spec.add_dependency "httparty"
24
+ spec.add_dependency "evernote_oauth"
25
+ spec.add_dependency "activesupport", "~> 4.0"
26
+ # TODO: evernote requires thin/rack
27
+ spec.add_dependency "thin"
28
+ spec.add_dependency "mail"
29
+ spec.add_dependency "nokogiri"
30
+ spec.add_development_dependency "bundler", "~> 1.3"
31
+ spec.add_development_dependency "rake"
32
+ spec.add_development_dependency "pry"
33
+ spec.add_development_dependency "guard-rspec"
34
+ spec.add_development_dependency "rspec"
35
+ spec.add_development_dependency "webmock", "~> 1.13.0"
36
+ spec.add_development_dependency "vcr"
37
+ spec.add_development_dependency "simplecov"
38
+ spec.add_development_dependency "coveralls"
39
+ spec.add_development_dependency "cane"
40
+ end
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env ruby
2
+ require 'autoevernote/cli'
3
+
4
+ AutoEvernote::CLI.start(ARGV)
@@ -0,0 +1,11 @@
1
+ asana:
2
+ token: "ASANA_TOKEN"
3
+ evernote:
4
+ token: "EVERNOTE_TOKEN"
5
+ default_notebook: "NOTEBOOK_GUID"
6
+ klout:
7
+ token: "KLOUT_TOKEN"
8
+ twitter:
9
+ id: "TWITTER_ID"
10
+ username: "TWITTER_USERNAME"
11
+ counter_token: "TWITTER_COUNTER_API_KEY"
@@ -0,0 +1,20 @@
1
+ require 'active_support/all'
2
+ require 'configurations'
3
+ require "autoevernote/version"
4
+
5
+ module AutoEvernote
6
+ include Configurations
7
+
8
+ autoload :Asana, "autoevernote/asana"
9
+ autoload :Klout, "autoevernote/klout"
10
+ autoload :Evernote, "autoevernote/evernote"
11
+
12
+ default_config = File.expand_path('~/.autoevernote.yml')
13
+
14
+ if File.exist?(default_config)
15
+ require 'yaml'
16
+ AutoEvernote.configure do |c|
17
+ c.from_h(YAML.load_file(default_config))
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,60 @@
1
+ require 'asana'
2
+
3
+ module AutoEvernote
4
+ class Asana
5
+ def initialize
6
+ @include_archived_tasks = true
7
+ ::Asana.configure do |config|
8
+ config.api_key = AutoEvernote.configuration.asana.token
9
+ end
10
+ end
11
+
12
+ def projects
13
+ @projects ||= ::Asana::Project.all
14
+ end
15
+
16
+ def workspaces
17
+ @workspaces ||= ::Asana::Workspace.all
18
+ end
19
+
20
+ def tasks
21
+ @tasks ||= all_tasks.flatten
22
+ end
23
+
24
+ def completed_tasks
25
+ @completed_tasks ||= filter_completed_tasks
26
+ end
27
+
28
+ def completed_tasks_for_today
29
+ @completed_tasks_for_today ||= completed_tasks.select do |task|
30
+ task.completed_at.to_date == Time.now.to_date
31
+ end
32
+ end
33
+
34
+ def to_note
35
+ {
36
+ title: "Completed #{completed_tasks_for_today.size} tasks on #{Time.now.to_date}",
37
+ body: build_note_body(completed_tasks_for_today),
38
+ tags: ["asana"]
39
+ }
40
+ end
41
+
42
+ private
43
+ def all_tasks
44
+ workspaces.map(&:tasks).reject(&:empty?)
45
+ end
46
+
47
+ def filter_completed_tasks
48
+ tasks = workspaces.map { |w| w.tasks(include_archived: true) }
49
+ tasks.reject(&:empty?).flatten.select(&:completed?)
50
+ end
51
+
52
+ def build_note_body(tasks)
53
+ body = "<ul>"
54
+ tasks.each do |task|
55
+ body += "\n<li><a href='https://app.asana.com/0/#{task.workspace.id}/#{task.id}'>#{task.name}</a></li>"
56
+ end
57
+ body += "</ul>"
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,56 @@
1
+ require 'thor'
2
+ require 'autoevernote'
3
+
4
+ module AutoEvernote
5
+ class CLI < Thor
6
+ desc "version", "Return the version of autoevernote"
7
+ def version
8
+ puts AutoEvernote::VERSION
9
+ end
10
+
11
+ desc "log_completed_tasks", "Log today's completed tasks in Asana to Evernote"
12
+ def log_completed_tasks
13
+ puts "Retrieving completed tasks"
14
+ AutoEvernote::Evernote.new.create_note_from_hash(AutoEvernote::Asana.new.to_note)
15
+ end
16
+
17
+ desc "compute_stats", "Log quantified-self stats (followers, etc) to Evernote"
18
+ def compute_stats
19
+ evernote = AutoEvernote::Evernote.new
20
+ asana = AutoEvernote::Asana.new
21
+ klout = AutoEvernote::Klout.new.score(
22
+ AutoEvernote.configuration.twitter.username
23
+ )
24
+ twitter_id = AutoEvernote.configuration.twitter.id
25
+ twitter_counter_api = AutoEvernote.configuration.twitter.counter_token
26
+
27
+ twitter_stats = HTTParty.get("http://api.twittercounter.com", query: {
28
+ apikey: twitter_counter_api,
29
+ twitter_id: twitter_id
30
+ })
31
+
32
+ written_tasks_in_month = asana.tasks.select(&in_month_by(:created_at))
33
+ completed_tasks_in_month = asana.completed_tasks.select(&in_month_by(:completed_at))
34
+
35
+ note = {
36
+ title: "Stats for #{Date.today.strftime('%B %Y')}",
37
+ notebook: "Main",
38
+ body: "<ul>",
39
+ tags: ['baseline']
40
+ }
41
+
42
+ note[:body] += "<li><b>Twitter followers:</b> #{twitter_stats['followers_current']}</li>"
43
+ note[:body] += "<li><b>Klout Score:</b> #{klout[:score]} (#{klout[:monthly_change]})</li>"
44
+ note[:body] += "<li><b>Written tasks:</b> #{written_tasks_in_month.size}</li>"
45
+ note[:body] += "<li><b>Completed tasks:</b> #{completed_tasks_in_month.size}</li>"
46
+ note[:body] += "</ul>"
47
+
48
+ evernote.create_note_from_hash(note)
49
+ end
50
+
51
+ private
52
+ def in_month_by(field)
53
+ ->(task) { task.public_send(field) ? 1.month.ago <= Time.parse(task.public_send(field)) : false }
54
+ end
55
+ end
56
+ end