rescue_time_api 0.0.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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: f7bcda200ab03a2e5969cb1a6e4d733431733e44
4
+ data.tar.gz: 92a9be4d4fd9189d779602475f79bc3ed41b45f2
5
+ SHA512:
6
+ metadata.gz: c96514b0602401c49b5512d835a898f48358c1d99e6c7f0c6bc95c4a87652f7674f3b45f64fb05352307127aee16dec927f074a26ddc9b990dcd915e106dcd5d
7
+ data.tar.gz: 466ddcc8aa15531c4b92956e408f00dc14c45d78bdeea21f5820f6a3354f0df3bc4a1f562fccd706f892f97692bf112ebdf4d6f41104ebba1e7174dc4e18f526
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in rescue_time_api.gemspec
4
+ gemspec
data/Guardfile ADDED
@@ -0,0 +1,6 @@
1
+ guard :rspec do
2
+ watch(%r{^spec/.+_spec\.rb$})
3
+ watch(%r{^lib/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
4
+ watch('spec/spec_helper.rb') { "spec" }
5
+ end
6
+
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Daniel Luxemburg
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.
data/README.md ADDED
@@ -0,0 +1,97 @@
1
+ # RescueTimeApi
2
+
3
+ Ruby wrapper for the [RescueTime data API](https://www.rescuetime.com/anapi/setup/documentation)
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'rescue_time_api'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install rescue_time_api
18
+
19
+ ## Usage
20
+
21
+ You'll need a key from RescueTime's [API Key Management](https://www.rescuetime.com/anapi/manage) page. Once you've got one, create a client instance like this:
22
+
23
+ ```ruby
24
+ client = RescueTimeApi::Client.new(key: 'notanactualkey123456')
25
+ ```
26
+
27
+ Make requests using the parameters described in [RescueTime's documentation](https://www.rescuetime.com/anapi/setup/documentation). Pass parameters as a hash with either strings or symbols as keys.
28
+
29
+ ```ruby
30
+ client.request({
31
+ prespective: 'interval',
32
+ resolution_time: 'day'
33
+ })
34
+ ```
35
+
36
+ The only transformations applied to the parameter hash is to add the `format` value (json), the `key` value, and to change any date type parameters into a correctly formatted day string (YYYY-MM-DD). So this will work:
37
+
38
+ ```ruby
39
+ client.request({
40
+ prespective: 'interval',
41
+ restrict_begin: DateTime.now
42
+ })
43
+ ```
44
+
45
+ The `#request` method returns a `RescueTimeApi::Response` object. Use its `#rows` method to access the returned data as an array of hashes with simplified keys:
46
+
47
+ ```ruby
48
+ RescueTimeApi::Client > request({}).rows
49
+ => [
50
+ {"rank"=>1,
51
+ "seconds"=>5887,
52
+ "people"=>1,
53
+ "activity"=>"sublime text",
54
+ "categoty"=>"Editing & IDEs",
55
+ "productivity"=>2},
56
+ {"rank"=>2,
57
+ "seconds"=>5668,
58
+ "people"=>1,
59
+ "activity"=>"iTerm",
60
+ "categoty"=>"Systems Operations",
61
+ "productivity"=>2},
62
+ {"rank"=>3,
63
+ "seconds"=>4131,
64
+ "people"=>1,
65
+ "activity"=>"github.com",
66
+ "categoty"=>"General Software Development",
67
+ "productivity"=>1},
68
+ <...>
69
+ ]
70
+ ```
71
+
72
+ `date` keys are returned as `DateTime`s.
73
+
74
+ ## REPL
75
+
76
+ You can launch a [Pry](http://pryrepl.org/) REPL to play with the client interactively:
77
+
78
+ $ rescue_time_api notanactualkey123456
79
+
80
+ ```ruby
81
+
82
+ RescueTimeApi::Client >
83
+ RescueTimeApi::Client > request({prespective: 'interval'})
84
+ => #<RescueTimeApi::Response:0x007f976b143e58...
85
+ ```
86
+
87
+ ## Tests
88
+
89
+ They're in RSpec.
90
+
91
+ ## Contributing
92
+
93
+ 1. Fork it
94
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
95
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
96
+ 4. Push to the branch (`git push origin my-new-feature`)
97
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,18 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ lib = File.expand_path('../../lib', __FILE__)
4
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
+
6
+
7
+ unless ARGV[0]
8
+ puts "Must supply an API key as first argument"
9
+ exit
10
+ end
11
+
12
+ require 'rescue_time_api'
13
+
14
+ client = RescueTimeApi::Client.new(key: ARGV[0])
15
+
16
+ require 'pry'
17
+
18
+ Pry.start(client, quiet: true, prompt: [ proc { "RescueTimeApi::Client > " } ])
@@ -0,0 +1,60 @@
1
+ require 'date'
2
+ require 'faraday'
3
+ require 'faraday_middleware'
4
+
5
+ module RescueTimeApi
6
+ class Client
7
+
8
+ attr_accessor :key, :host, :base_path
9
+
10
+ def initialize(options)
11
+ @key = options.fetch(:key)
12
+ @host = options.fetch(:host,"www.rescuetime.com")
13
+ @base_path = options.fetch(:base_path,"/anapi/data")
14
+ end
15
+
16
+ def connection
17
+ @connection ||= get_connection
18
+ end
19
+
20
+ def get_connection
21
+ Faraday.new(:url => "https://#{host}") do |conn|
22
+ conn.request :json
23
+ conn.response :json, :content_type => /\bjson$/
24
+ conn.adapter Faraday.default_adapter
25
+ end
26
+ end
27
+
28
+ def request(params)
29
+ params = format_params(params)
30
+ Response.new(run_request(params))
31
+ end
32
+
33
+ def run_request(params)
34
+ connection.get(base_path,params.merge(default_params))
35
+ end
36
+
37
+ def current_user_name
38
+ request({perspective: 'member'}).rows.first['person']
39
+ end
40
+
41
+ def default_params
42
+ {key: key, format: 'json'}
43
+ end
44
+
45
+ def format_params(params)
46
+ time_keys.each do |key|
47
+ if params[key] && params[key].respond_to?(:to_date)
48
+ params[key] = params[key].to_date.to_s
49
+ end
50
+ end
51
+ params
52
+ end
53
+
54
+ def time_keys
55
+ keys = ['re','restrict_end','rb','restrict_begin']
56
+ return keys + keys.map(&:to_sym)
57
+ end
58
+
59
+ end
60
+ end
@@ -0,0 +1,46 @@
1
+ require 'date'
2
+ require 'forwardable'
3
+
4
+ module RescueTimeApi
5
+ class Response
6
+
7
+ attr_accessor :response
8
+ extend Forwardable
9
+ def_delegators :@response, :body, :headers
10
+
11
+ def initialize(response)
12
+ @response = response
13
+ end
14
+
15
+ def row_headers
16
+ @row_headers ||= body['row_headers'].map { |row_name| key_mapping[row_name] }
17
+ end
18
+
19
+ def rows
20
+ @rows ||= body["rows"].map { |row| map_row(row) }
21
+ end
22
+
23
+ def map_row(row)
24
+ mapped = Hash[row_headers.zip(row)]
25
+ mapped['date'] = DateTime.parse(mapped['date']) if mapped['date']
26
+ ['second','rank','people','productivity'].each do |key|
27
+ mapped[key] = mapped[key].to_i if mapped[key]
28
+ end
29
+ mapped
30
+ end
31
+
32
+ def key_mapping
33
+ {
34
+ "Person" => 'person',
35
+ "Rank" => 'rank',
36
+ "Time Spent (seconds)" => 'seconds',
37
+ "Number of People" => 'people',
38
+ "Activity" => 'activity',
39
+ "Category" => 'categoty',
40
+ "Productivity" => 'productivity',
41
+ "Date" => "date"
42
+ }
43
+ end
44
+
45
+ end
46
+ end
@@ -0,0 +1,3 @@
1
+ module RescueTimeApi
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,7 @@
1
+ require "rescue_time_api/version"
2
+ require "rescue_time_api/client"
3
+ require "rescue_time_api/response"
4
+
5
+
6
+ module RescueTimeApi
7
+ end
@@ -0,0 +1,30 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'rescue_time_api/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "rescue_time_api"
8
+ spec.version = RescueTimeApi::VERSION
9
+ spec.authors = ["Daniel Luxemburg"]
10
+ spec.email = ["daniel.luxemburg@gmail.com"]
11
+ spec.description = %q{Ruby wrapper for the RescueTime data API}
12
+ spec.summary = %q{Ruby wrapper for the RescueTime data API}
13
+ spec.homepage = ""
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
+
22
+ spec.add_dependency "pry"
23
+ spec.add_dependency "faraday", "~> 0.8.8"
24
+ spec.add_dependency "faraday_middleware"
25
+
26
+ spec.add_development_dependency "bundler", "~> 1.3"
27
+ spec.add_development_dependency "rake"
28
+ spec.add_development_dependency "rspec"
29
+ spec.add_development_dependency "guard-rspec"
30
+ end
@@ -0,0 +1,97 @@
1
+ require 'spec_helper'
2
+
3
+ describe RescueTimeApi::Client do
4
+
5
+ let(:key){ "B63M14zPRjDUHjN6TNNVydDqe_qGgxCaqUycoIWE" }
6
+ let(:client) { RescueTimeApi::Client.new(key: key) }
7
+ let(:response_data){
8
+ double(body: {
9
+ 'row_headers' => [
10
+ "Rank",
11
+ "Time Spent (seconds)",
12
+ "Number of People",
13
+ "Activity",
14
+ "Category",
15
+ "Productivity"
16
+ ],
17
+ 'rows' => [
18
+ [1, 5887, 1, "sublime text", "Editing & IDEs", 2],
19
+ [2, 5668, 1, "iTerm", "Systems Operations", 2],
20
+ [3, 4131, 1, "github.com", "General Software Development", 1]
21
+ ]
22
+ })
23
+ }
24
+
25
+ context ".new" do
26
+
27
+ it "initializes with a key" do
28
+ client = RescueTimeApi::Client.new(key: key)
29
+ expect(client.key).to eq(key)
30
+ end
31
+
32
+ it "raises an error without a key" do
33
+ expect {
34
+ client = RescueTimeApi::Client.new({})
35
+ }.to raise_error(KeyError)
36
+ end
37
+
38
+ it "knows the host and path by default" do
39
+ client = RescueTimeApi::Client.new(key: key)
40
+ expect(client.host).to eq("www.rescuetime.com")
41
+ expect(client.base_path).to eq("/anapi/data")
42
+ end
43
+
44
+ end
45
+
46
+ context "#connection" do
47
+
48
+ let(:client) { RescueTimeApi::Client.new(key: key) }
49
+
50
+ it "creates a @connection" do
51
+ expect(client.instance_variable_get(:@connection)).to eq(nil)
52
+ client.connection
53
+ expect(client.instance_variable_get(:@connection)).to be_a(Faraday::Connection)
54
+ end
55
+
56
+ end
57
+
58
+ context "#run_request" do
59
+
60
+ it "sends the request to the connection, adding the base path and default parameters" do
61
+ connection = double()
62
+ expect(connection).to receive(:get).with("/anapi/data", {
63
+ key: key,
64
+ format: 'json',
65
+ perspective: 'interval'
66
+ })
67
+ client.stub(:connection).and_return(connection)
68
+ client.run_request({perspective: 'interval'})
69
+ end
70
+
71
+ end
72
+
73
+ context "#request" do
74
+
75
+ it "sends the request to the #run_request, formatting any date parameters" do
76
+ stamp = DateTime.now.strftime('%Y-%m-%d')
77
+
78
+ expect(client).to receive(:run_request).with({
79
+ re: stamp
80
+ })
81
+
82
+ client.request({re: DateTime.now})
83
+
84
+ end
85
+
86
+ it "returns a Response object" do
87
+
88
+ client.stub(:run_request).and_return(response_data)
89
+ expect(client.request({})).to be_a(RescueTimeApi::Response)
90
+ expect(client.request({}).rows.count).to eq(3)
91
+
92
+ end
93
+
94
+ end
95
+
96
+
97
+ end
@@ -0,0 +1,86 @@
1
+ require 'spec_helper'
2
+
3
+ describe RescueTimeApi::Response do
4
+
5
+ let(:response_headers){
6
+ double()
7
+ }
8
+ let(:response_body){
9
+ {
10
+ 'row_headers' => [
11
+ "Rank",
12
+ "Time Spent (seconds)",
13
+ "Number of People",
14
+ "Activity",
15
+ "Category",
16
+ "Productivity"
17
+ ],
18
+ 'rows' => [
19
+ [1, 5887, 1, "sublime text", "Editing & IDEs", 2],
20
+ [2, 5668, 1, "iTerm", "Systems Operations", 2],
21
+ [3, 4131, 1, "github.com", "General Software Development", 1]
22
+ ]
23
+ }
24
+ }
25
+ let(:response_body2){
26
+ {
27
+ 'row_headers' => [
28
+ "Date",
29
+ "Time Spent (seconds)",
30
+ "Number of People",
31
+ "Activity",
32
+ "Category",
33
+ "Productivity"
34
+ ],
35
+ 'rows' => [
36
+ [
37
+ "2013-10-14T00:00:00",
38
+ 136,
39
+ 1,
40
+ "github.com",
41
+ "General Software Development",
42
+ 1
43
+ ]
44
+ ]
45
+ }
46
+ }
47
+ let(:response_object){
48
+ double(body: response_body, headers: response_headers)
49
+ }
50
+ let(:response_object2){
51
+ double(body: response_body2, headers: response_headers)
52
+ }
53
+ let(:response){ RescueTimeApi::Response.new(response_object) }
54
+ let(:response2){ RescueTimeApi::Response.new(response_object2) }
55
+
56
+ it "maps raw response body to an array of hashes" do
57
+
58
+ expect(response.rows).to be_a(Array)
59
+ expect(response.rows.map(&:class)).to eq [Hash,Hash,Hash]
60
+
61
+ end
62
+
63
+ it "ensures integer values are Integers" do
64
+
65
+ expect(response.rows.first['rank']).to be_a(Integer)
66
+ expect(response.rows.first['seconds']).to be_a(Integer)
67
+ expect(response.rows.first['people']).to be_a(Integer)
68
+ expect(response.rows.first['productivity']).to be_a(Integer)
69
+
70
+ end
71
+
72
+ it "ensures date values are DateTimes" do
73
+
74
+ expect(response2.rows.first['date']).to be_a(DateTime)
75
+
76
+ end
77
+
78
+ it "exposes the original reponse object" do
79
+ expect(response.response).to eq(response_object)
80
+ end
81
+
82
+ it "exposes the original headers object" do
83
+ expect(response.headers).to eq(response_headers)
84
+ end
85
+
86
+ end
@@ -0,0 +1,11 @@
1
+ require "bundler"
2
+ Bundler.require(:default,:development)
3
+
4
+ Dir[File.expand_path('../support/*.rb', __FILE__)].each {|f| require f}
5
+
6
+ RSpec.configure do |config|
7
+
8
+ config.treat_symbols_as_metadata_keys_with_true_values = true
9
+ config.filter_run_excluding :live unless ENV['LIVE']
10
+
11
+ end
metadata ADDED
@@ -0,0 +1,161 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rescue_time_api
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Daniel Luxemburg
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-10-14 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: pry
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: faraday
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ~>
32
+ - !ruby/object:Gem::Version
33
+ version: 0.8.8
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ~>
39
+ - !ruby/object:Gem::Version
40
+ version: 0.8.8
41
+ - !ruby/object:Gem::Dependency
42
+ name: faraday_middleware
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: bundler
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: '1.3'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ~>
67
+ - !ruby/object:Gem::Version
68
+ version: '1.3'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rake
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rspec
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - '>='
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - '>='
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: guard-rspec
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - '>='
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - '>='
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ description: Ruby wrapper for the RescueTime data API
112
+ email:
113
+ - daniel.luxemburg@gmail.com
114
+ executables:
115
+ - rescue_time_api
116
+ extensions: []
117
+ extra_rdoc_files: []
118
+ files:
119
+ - .gitignore
120
+ - Gemfile
121
+ - Guardfile
122
+ - LICENSE.txt
123
+ - README.md
124
+ - Rakefile
125
+ - bin/rescue_time_api
126
+ - lib/rescue_time_api.rb
127
+ - lib/rescue_time_api/client.rb
128
+ - lib/rescue_time_api/response.rb
129
+ - lib/rescue_time_api/version.rb
130
+ - rescue_time_api.gemspec
131
+ - spec/rescue_time_api/client_spec.rb
132
+ - spec/rescue_time_api/response_spec.rb
133
+ - spec/spec_helper.rb
134
+ homepage: ''
135
+ licenses:
136
+ - MIT
137
+ metadata: {}
138
+ post_install_message:
139
+ rdoc_options: []
140
+ require_paths:
141
+ - lib
142
+ required_ruby_version: !ruby/object:Gem::Requirement
143
+ requirements:
144
+ - - '>='
145
+ - !ruby/object:Gem::Version
146
+ version: '0'
147
+ required_rubygems_version: !ruby/object:Gem::Requirement
148
+ requirements:
149
+ - - '>='
150
+ - !ruby/object:Gem::Version
151
+ version: '0'
152
+ requirements: []
153
+ rubyforge_project:
154
+ rubygems_version: 2.0.0
155
+ signing_key:
156
+ specification_version: 4
157
+ summary: Ruby wrapper for the RescueTime data API
158
+ test_files:
159
+ - spec/rescue_time_api/client_spec.rb
160
+ - spec/rescue_time_api/response_spec.rb
161
+ - spec/spec_helper.rb