rescuetime 0.3.1 → 0.3.2
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 +4 -4
- data/.rubocop.yml +1 -0
- data/.rubocop_todo.yml +80 -0
- data/Gemfile +2 -0
- data/README.md +2 -2
- data/Rakefile +12 -3
- data/lib/rescuetime/client.rb +81 -11
- data/lib/rescuetime/collection.rb +43 -10
- data/lib/rescuetime/date_parser.rb +86 -0
- data/lib/rescuetime/errors.rb +3 -1
- data/lib/rescuetime/query_buildable.rb +367 -47
- data/lib/rescuetime/requester.rb +75 -16
- data/lib/rescuetime/version.rb +2 -2
- data/rescuetime.gemspec +1 -0
- metadata +20 -4
- data/CHANGELOG.md +0 -13
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6464e2b8b391cfa2b334288ba6cdbd81fe7728f6
|
4
|
+
data.tar.gz: e293998bd6552509d6225422b1a7f029a26dcde3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4e022e5eefb8a858051f8c5264d394562ba6939381beb5b9072807f2dad2a70f9d8047ada933a2be9172ba050ed5b71ed41e51934e1b2a8ade83bd67d7a645c2
|
7
|
+
data.tar.gz: 8c09915abb016f0680d9b48c1f45362ccf6312fc970f1e58d38feeb25e15afda6cfeba1d5f18a877712ac7b29bce2e65f39cdf14ebea57caf79f26fbcdc5df33
|
data/.rubocop.yml
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
inherit_from: .rubocop_todo.yml
|
data/.rubocop_todo.yml
ADDED
@@ -0,0 +1,80 @@
|
|
1
|
+
# This configuration was generated by
|
2
|
+
# `rubocop --auto-gen-config`
|
3
|
+
# on 2016-05-22 00:42:00 -0400 using RuboCop version 0.40.0.
|
4
|
+
# The point is for the user to remove these configuration records
|
5
|
+
# one by one as the offenses are removed from the code base.
|
6
|
+
# Note that changes in the inspected code, or installation of new
|
7
|
+
# versions of RuboCop, may require this file to be generated again.
|
8
|
+
|
9
|
+
# Offense count: 1
|
10
|
+
Lint/AmbiguousOperator:
|
11
|
+
Exclude:
|
12
|
+
- 'lib/rescuetime/collection.rb'
|
13
|
+
|
14
|
+
# Offense count: 1
|
15
|
+
# Configuration parameters: CountComments.
|
16
|
+
Metrics/MethodLength:
|
17
|
+
Max: 13
|
18
|
+
|
19
|
+
# Offense count: 1
|
20
|
+
# Cop supports --auto-correct.
|
21
|
+
Performance/StringReplacement:
|
22
|
+
Exclude:
|
23
|
+
- 'lib/rescuetime/date_parser.rb'
|
24
|
+
|
25
|
+
# Offense count: 1
|
26
|
+
# Cop supports --auto-correct.
|
27
|
+
# Configuration parameters: EnforcedStyle, SupportedStyles.
|
28
|
+
# SupportedStyles: always, conditionals
|
29
|
+
Style/AndOr:
|
30
|
+
Exclude:
|
31
|
+
- 'lib/rescuetime/query_buildable.rb'
|
32
|
+
|
33
|
+
# Offense count: 5
|
34
|
+
# Cop supports --auto-correct.
|
35
|
+
# Configuration parameters: EnforcedStyle, SupportedStyles, IndentationWidth.
|
36
|
+
# SupportedStyles: aligned, indented
|
37
|
+
Style/MultilineMethodCallIndentation:
|
38
|
+
Enabled: false
|
39
|
+
|
40
|
+
# Offense count: 9
|
41
|
+
# Cop supports --auto-correct.
|
42
|
+
Style/MutableConstant:
|
43
|
+
Exclude:
|
44
|
+
- 'lib/rescuetime/collection.rb'
|
45
|
+
- 'lib/rescuetime/date_parser.rb'
|
46
|
+
- 'lib/rescuetime/errors.rb'
|
47
|
+
- 'lib/rescuetime/query_buildable.rb'
|
48
|
+
- 'lib/rescuetime/requester.rb'
|
49
|
+
- 'lib/rescuetime/version.rb'
|
50
|
+
- 'spec/sample_secret.rb'
|
51
|
+
- 'spec/secret.rb'
|
52
|
+
|
53
|
+
# Offense count: 3
|
54
|
+
# Cop supports --auto-correct.
|
55
|
+
Style/NestedParenthesizedCalls:
|
56
|
+
Exclude:
|
57
|
+
- 'spec/rescuetime/query_buildable_spec.rb'
|
58
|
+
|
59
|
+
# Offense count: 1
|
60
|
+
# Cop supports --auto-correct.
|
61
|
+
Style/ParallelAssignment:
|
62
|
+
Exclude:
|
63
|
+
- 'spec/rescuetime/query_buildable_spec.rb'
|
64
|
+
|
65
|
+
# Offense count: 1
|
66
|
+
# Cop supports --auto-correct.
|
67
|
+
Style/RedundantSelf:
|
68
|
+
Exclude:
|
69
|
+
- 'lib/rescuetime/query_buildable.rb'
|
70
|
+
|
71
|
+
# Offense count: 10
|
72
|
+
# Cop supports --auto-correct.
|
73
|
+
# Configuration parameters: EnforcedStyle, SupportedStyles.
|
74
|
+
# SupportedStyles: only_raise, only_fail, semantic
|
75
|
+
Style/SignalException:
|
76
|
+
Exclude:
|
77
|
+
- 'lib/rescuetime/collection.rb'
|
78
|
+
- 'lib/rescuetime/date_parser.rb'
|
79
|
+
- 'lib/rescuetime/query_buildable.rb'
|
80
|
+
- 'lib/rescuetime/requester.rb'
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -146,7 +146,7 @@ require 'rescuetime'
|
|
146
146
|
|
147
147
|
### Finding Answers (Documentation)
|
148
148
|
|
149
|
-
For more details, please see [official gem documentation](http://www.rubydoc.info/gems/rescuetime
|
149
|
+
For more details, please see [official gem documentation](http://www.rubydoc.info/gems/rescuetime) or [read the wiki](https://github.com/leesharma/rescuetime/wiki).
|
150
150
|
|
151
151
|
### Defaults
|
152
152
|
|
@@ -164,7 +164,7 @@ The `Rescuetime::Client#activities` action has the following defaults:
|
|
164
164
|
|
165
165
|
There are a number of exceptions that extend from the custom Rescuetime::Error class:
|
166
166
|
|
167
|
-
*
|
167
|
+
* **Rescuetime::MissingCredentialsError** is raised when a request is attempted by a client with no credentials. Try setting credentials with `@client.api_key = <YOUR_API_KEY>`.
|
168
168
|
* **Rescuetime::InvalidCredentialsError** is raised when a request is attempted by a client with invalid credentials. Double-check your API key and fix your client with `@client.api_key = <VALID_API_KEY>`.
|
169
169
|
* **Rescuetime::InvalidQueryError** is raised if you enter an invalid value for any of the RescueTime query methods (or if the server returns a bad query error)
|
170
170
|
* **Rescuetime::InvalidFormatError** is raised if you pass a disallowed format to the client
|
data/Rakefile
CHANGED
@@ -3,9 +3,18 @@
|
|
3
3
|
require 'bundler/gem_tasks'
|
4
4
|
require 'rspec/core/rake_task'
|
5
5
|
|
6
|
-
desc 'Run all the tests in spec'
|
7
6
|
RSpec::Core::RakeTask.new(:spec)
|
8
7
|
task test: :spec
|
9
8
|
|
10
|
-
|
11
|
-
|
9
|
+
defaults = [:spec]
|
10
|
+
|
11
|
+
begin
|
12
|
+
require 'rubocop/rake_task'
|
13
|
+
RuboCop::RakeTask.new(:rubocop)
|
14
|
+
# defaults << :rubocop
|
15
|
+
rescue LoadError
|
16
|
+
puts 'Rubocop is not installed; please install it for code quality checks.'
|
17
|
+
end
|
18
|
+
|
19
|
+
desc "Run default actions: #{defaults}"
|
20
|
+
task default: defaults
|
data/lib/rescuetime/client.rb
CHANGED
@@ -14,31 +14,101 @@ module Rescuetime
|
|
14
14
|
class Client
|
15
15
|
include QueryBuildable
|
16
16
|
|
17
|
-
#
|
18
|
-
#
|
17
|
+
# Represents the client's Rescuetime API key, required for successful
|
18
|
+
# requests
|
19
|
+
#
|
20
|
+
# @return [String, nil] Rescuetime API key
|
19
21
|
attr_accessor :api_key
|
20
22
|
|
21
|
-
#
|
22
|
-
|
23
|
-
|
23
|
+
# Creates a new Rescuetime client. The API key can be passed as either a
|
24
|
+
# parameter or option (with "key" taking priority over ":api_key")
|
25
|
+
#
|
26
|
+
# @example Basic Use
|
27
|
+
# Rescuetime::Client.new
|
28
|
+
# # => #<Rescuetime::Client:0x007f938489b6c8 @api_key=nil>
|
29
|
+
#
|
30
|
+
# @example Setting the API Key
|
31
|
+
# Rescuetime::Client.new
|
32
|
+
# # => #<Rescuetime::Client:0x007f938489b6c8 @api_key=nil>
|
33
|
+
#
|
34
|
+
# Rescuetime::Client.new('12345')
|
35
|
+
# # => #<Rescuetime::Client:0x007f938489b6c8 @api_key="12345">
|
36
|
+
#
|
37
|
+
# Rescuetime::Client.new(api_key: 12345')
|
38
|
+
# # => #<Rescuetime::Client:0x007f938489b6c8 @api_key="12345">
|
39
|
+
#
|
40
|
+
# Rescuetime::Client.new('123', api_key: '456')
|
41
|
+
# # => #<Rescuetime::Client:0x007f938489b6c8 @api_key="123">
|
42
|
+
#
|
43
|
+
# @param [String, nil] key API key
|
44
|
+
# @param [String] api_key Rescuetime API key
|
45
|
+
# @return [Rescuetime::Client]
|
46
|
+
def initialize(key = nil, api_key: nil)
|
47
|
+
@api_key = key || api_key
|
24
48
|
end
|
25
49
|
|
26
|
-
#
|
50
|
+
# Returns true if the API key is present.
|
51
|
+
#
|
52
|
+
# @example Basic Use
|
53
|
+
# client = Rescuetime::Client.new
|
54
|
+
# client.api_key?
|
55
|
+
# # => false
|
56
|
+
#
|
57
|
+
# client.api_key = ''
|
58
|
+
# client.api_key?
|
59
|
+
# # => false
|
60
|
+
#
|
61
|
+
# client.api_key = '12345'
|
62
|
+
# client.api_key?
|
63
|
+
# # => true
|
64
|
+
#
|
65
|
+
# @return [Boolean]
|
27
66
|
def api_key?
|
28
|
-
|
67
|
+
present? api_key
|
29
68
|
end
|
30
69
|
|
31
|
-
#
|
70
|
+
# Returns true if the provided api key is valid. Performs a request to the
|
71
|
+
# Rescuetime API.
|
72
|
+
#
|
73
|
+
# @example Basic Use
|
74
|
+
# # Assuming that INVALID_KEY is an invalid Rescuetime API key
|
75
|
+
# # and VALID_KEY is a valid one
|
76
|
+
#
|
77
|
+
# client = Rescuetime::Client
|
78
|
+
# client.valid_credentials?
|
79
|
+
# # => false
|
80
|
+
#
|
81
|
+
# client.api_key = INVALID_KEY
|
82
|
+
# client.valid_credentials? # Performs a request to the Rescuetime API
|
83
|
+
# # => false
|
84
|
+
#
|
85
|
+
# client.api_key = VALID_KEY
|
86
|
+
# client.valid_credentials? # Performs a request to the Rescuetime API
|
87
|
+
# # => true
|
88
|
+
#
|
89
|
+
# @return [Boolean]
|
32
90
|
def valid_credentials?
|
33
91
|
return false unless api_key?
|
34
|
-
|
92
|
+
!activities.all.nil?
|
93
|
+
rescue Rescuetime::InvalidCredentialsError
|
94
|
+
false
|
35
95
|
end
|
36
96
|
|
37
97
|
private
|
38
98
|
|
39
|
-
#
|
99
|
+
# Returns true if the project is present and non-blank
|
100
|
+
#
|
101
|
+
# @param [#emtpy?] obj
|
102
|
+
# @return [Boolean]
|
103
|
+
# @since v0.3.2
|
104
|
+
def present?(obj)
|
105
|
+
blank = obj.respond_to?(:empty?) ? obj.empty? : obj.nil?
|
106
|
+
!blank
|
107
|
+
end
|
108
|
+
|
109
|
+
# @return [Hash]
|
40
110
|
def state
|
41
|
-
{ key:
|
111
|
+
{ key: api_key }
|
42
112
|
end
|
43
113
|
end
|
44
114
|
end
|
@@ -1,46 +1,79 @@
|
|
1
1
|
require 'rescuetime/query_buildable'
|
2
2
|
|
3
3
|
module Rescuetime
|
4
|
+
# Represents a potential rescuetime collection. It holds the query information
|
5
|
+
# and performs the query lazily, when #all or an Enumerable method is called.
|
4
6
|
class Collection
|
5
7
|
include QueryBuildable
|
6
8
|
include Enumerable
|
7
9
|
|
10
|
+
# Rescuetime Analytics API endpoint
|
8
11
|
HOST = 'https://www.rescuetime.com/anapi/data'
|
9
12
|
|
13
|
+
# Returns a new Rescuetime collection. Default format is array.
|
14
|
+
#
|
15
|
+
# @param [Array<Hash>] terms a list of parameter hashes
|
16
|
+
# @return [Rescuetime::Collection] a new Rescuetime collection
|
10
17
|
def initialize(*terms)
|
11
18
|
@params = terms.reduce({}, :merge)
|
12
19
|
@format = :array
|
13
20
|
end
|
14
21
|
|
22
|
+
# Appends new terms onto the Rescuetime collection. In the case of duplicate
|
23
|
+
# keys, the later keys overwrite the former keys.
|
24
|
+
#
|
25
|
+
# @param [Hash] terms new terms to add to collection params
|
26
|
+
# @return [Hash] collection params with terms merged in
|
15
27
|
def <<(terms)
|
16
|
-
@params.merge
|
28
|
+
@params = params.merge terms
|
17
29
|
end
|
18
30
|
|
31
|
+
# Performs the rescuetime query and returns an array or csv response.
|
32
|
+
#
|
33
|
+
# @return [Array, CSV]
|
34
|
+
#
|
35
|
+
# @see Rescuetime::Requester#get
|
19
36
|
def all
|
20
|
-
parse_response Requester.get(HOST,
|
37
|
+
parse_response Requester.get(HOST, params).body
|
21
38
|
end
|
22
39
|
|
40
|
+
# Enumerates over the collection of Rescuetime report records. Performs
|
41
|
+
# the query.
|
42
|
+
#
|
43
|
+
# @return [Array, CSV]
|
44
|
+
#
|
45
|
+
# @see #all
|
46
|
+
# @see http://ruby-doc.org/core/Enumerable.html Enumerable
|
23
47
|
def each(&block)
|
24
48
|
all.each &block
|
25
49
|
end
|
26
50
|
|
27
|
-
#
|
51
|
+
# @param [#to_s] format desired report format (one of 'array' or 'csv')
|
52
|
+
# @return [Rescuetime::Collection]
|
53
|
+
#
|
54
|
+
# @todo: make chainable to the client
|
28
55
|
def format(format)
|
29
|
-
|
30
|
-
|
56
|
+
format = format.to_s
|
57
|
+
fail InvalidFormatError unless %w(array csv).include? format
|
58
|
+
|
59
|
+
@format = format
|
31
60
|
self
|
32
61
|
end
|
33
62
|
|
34
63
|
private
|
35
64
|
|
36
|
-
#
|
65
|
+
# Stores the query parameters to be set to the rescuetime host
|
66
|
+
attr_reader :params
|
67
|
+
|
68
|
+
# @param [String] body response body
|
69
|
+
# @return [Array, CSV]
|
37
70
|
def parse_response(body)
|
38
71
|
report = CSV.new(body,
|
39
|
-
|
40
|
-
|
41
|
-
|
72
|
+
headers: true,
|
73
|
+
header_converters: :symbol,
|
74
|
+
converters: :all)
|
42
75
|
|
43
|
-
case @format
|
76
|
+
case @format.intern
|
44
77
|
when :array then report.to_a.map(&:to_hash)
|
45
78
|
when :csv then report
|
46
79
|
else
|
@@ -0,0 +1,86 @@
|
|
1
|
+
module Rescuetime
|
2
|
+
# Responsible for formatting user-inputted dates into proper Rescuetime format
|
3
|
+
# @since v0.3.2
|
4
|
+
class DateParser
|
5
|
+
# Valid string formats for date parsing. The key is a human-readable pattern
|
6
|
+
# (ex. 'yyyy-mm-dd'), and the value is the corresponding regular expression.
|
7
|
+
DATE_FORMATS = {
|
8
|
+
'yyyy-mm-dd' => /\d{4}-\d{2}-\d{2}/,
|
9
|
+
'yyyy/mm/dd' => %r{\d{4}\/\d{2}\/\d{2}},
|
10
|
+
'mm-dd-yyyy or mm/dd/yyyy' => %r{\d{2}[-\/]\d{2}[-\/]\d{4}/},
|
11
|
+
'mm-dd or mm/dd' => %r{\d{2}[-\/]\d{2}}
|
12
|
+
}
|
13
|
+
|
14
|
+
class << self
|
15
|
+
# Returns a date as a string in the correct Rescuetime API format
|
16
|
+
#
|
17
|
+
# Allowed date formats:
|
18
|
+
# - Object that responds to #strftime
|
19
|
+
# - String in "YYYY-MM-DD" format
|
20
|
+
# - String in "YYYY/MM/DD" format
|
21
|
+
# - String in "MM-DD-YYYY" format
|
22
|
+
# - String in "MM/DD/YYYY" format
|
23
|
+
# - String in "MM-DD" format (defaults to current year)
|
24
|
+
# - String in "MM/DD" format (defaults to current year)
|
25
|
+
#
|
26
|
+
# @example Basic Use
|
27
|
+
# parser = Rescuetime::DateParser
|
28
|
+
# parser.parse '12-25' # assuming the current year is 2015
|
29
|
+
# #=> '2015-12-25'
|
30
|
+
#
|
31
|
+
# parser.parse '2015/12/25'
|
32
|
+
# #=> '2015-12-25'
|
33
|
+
#
|
34
|
+
# parser.parse Time.parse('2015-12-25')
|
35
|
+
# #=> '2015-12-25'
|
36
|
+
#
|
37
|
+
# parser.parse 'Dec. 25, 2015'
|
38
|
+
# #=> Rescuetime::InvalidQueryError: Invalid date entered. Please
|
39
|
+
# # see docs for allowed formats.
|
40
|
+
#
|
41
|
+
# @param [#strftime, String] date a date to be formatted
|
42
|
+
# @return [String] a date string in the YYYY-MM-DD format
|
43
|
+
#
|
44
|
+
# @raise [Rescuetime::InvalidQueryError] if the date format is invalid
|
45
|
+
def parse(date)
|
46
|
+
if date.respond_to? :strftime
|
47
|
+
date.strftime '%Y-%m-%d'
|
48
|
+
else
|
49
|
+
reformat_string(date)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
private
|
54
|
+
|
55
|
+
# Reformats a date string to follow the YYYY-MM-DD format
|
56
|
+
#
|
57
|
+
# @param [String] date A string representation of a date
|
58
|
+
# @param [Hash] formatted_as A hash of date formats and patterns
|
59
|
+
# @return [String] a string date in YYYY-MM-DD format
|
60
|
+
#
|
61
|
+
# @raise [Rescuetime::InvalidQueryError] if the date format is invalid
|
62
|
+
def reformat_string(date, formatted_as: DATE_FORMATS)
|
63
|
+
case date
|
64
|
+
when formatted_as['yyyy-mm-dd'] then date
|
65
|
+
when formatted_as['yyyy/mm/dd'] then date.gsub '/', '-'
|
66
|
+
when formatted_as['mm-dd-yyyy or mm/dd/yyyy']
|
67
|
+
month, day, year = date.scan(/\d+/)
|
68
|
+
"#{year}-#{month}-#{day}"
|
69
|
+
when formatted_as['mm-dd or mm/dd']
|
70
|
+
year = Time.now.year
|
71
|
+
month, day = date.scan(/\d+/)
|
72
|
+
"#{year}-#{month}-#{day}"
|
73
|
+
else
|
74
|
+
fail_date_format
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
# Raises Rescuetime::InvalidQueryError
|
79
|
+
# @raise [Rescuetime::InvalidQueryError]
|
80
|
+
def fail_date_format(exception: Rescuetime::InvalidQueryError)
|
81
|
+
message = 'Invalid date entered. Please see docs for allowed formats.'
|
82
|
+
fail exception, message
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
data/lib/rescuetime/errors.rb
CHANGED
@@ -38,7 +38,7 @@ module Rescuetime
|
|
38
38
|
##
|
39
39
|
# Custom Errors
|
40
40
|
# =============
|
41
|
-
|
41
|
+
|
42
42
|
# Raised when a method requires credentials but none are provided
|
43
43
|
class MissingCredentialsError < Unauthorized
|
44
44
|
def initialize(msg = 'No API key provided. Please provide a valid key.')
|
@@ -68,6 +68,8 @@ module Rescuetime
|
|
68
68
|
end
|
69
69
|
|
70
70
|
class Error
|
71
|
+
# Collection of possible return status codes and corresponding Rescuetime
|
72
|
+
# errors
|
71
73
|
CODES = {
|
72
74
|
400 => Rescuetime::BadRequest,
|
73
75
|
401 => Rescuetime::Unauthorized,
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'rescuetime/date_parser'
|
2
|
+
|
1
3
|
module Rescuetime
|
2
4
|
# The Rescuetime::Reportable module contains client methods relating to
|
3
5
|
# generating requests to fetch reports on the /data endpoint of the
|
@@ -5,85 +7,370 @@ module Rescuetime
|
|
5
7
|
#
|
6
8
|
# @since v0.1.0
|
7
9
|
module QueryBuildable
|
10
|
+
# Parameters that are included by default in every query
|
8
11
|
BASE_PARAMS = { format: 'csv',
|
9
12
|
operation: 'select',
|
10
13
|
version: 0 }
|
11
14
|
|
12
|
-
#
|
13
|
-
# @
|
15
|
+
# Valid values for the :order and :interval parameters
|
16
|
+
# @see #order_by
|
17
|
+
VALID = {
|
18
|
+
order_by: %w(time rank member),
|
19
|
+
interval: %w(minute hour day week month)
|
20
|
+
}
|
21
|
+
|
22
|
+
# Returns a Rescuetime overview report, grouping activities into their
|
23
|
+
# top-level categories
|
24
|
+
#
|
25
|
+
# Defaults:
|
26
|
+
# - order: rank
|
27
|
+
# - date range: current day
|
28
|
+
#
|
29
|
+
# @example Basic Use
|
30
|
+
# client = Rescuetime::Client.new
|
31
|
+
# client.overview
|
32
|
+
# #=> #<Rescuetime::Collection:0x007f93841681a8>
|
33
|
+
#
|
34
|
+
# @return [Rescuetime::Collection] a Rescuetime Collection specifying kind
|
35
|
+
# as an overview report
|
36
|
+
#
|
37
|
+
# @see #categories Category report (alternative)
|
38
|
+
# @see #activities Activity report (alternative)
|
39
|
+
# @see #productivity Productivity report (alternative)
|
40
|
+
# @see #efficiency Efficiency report (alternative)
|
41
|
+
# @see https://www.rescuetime.com/apidoc#paramlist Rescuetime API docs
|
42
|
+
# (see: restrict_kind)
|
14
43
|
def overview
|
15
44
|
add_to_query restrict_kind: 'overview'
|
16
45
|
end
|
17
46
|
|
18
|
-
#
|
19
|
-
#
|
47
|
+
# Returns a Rescuetime category report, grouping activities into their
|
48
|
+
# second-level (sub-)categories
|
49
|
+
#
|
50
|
+
# Defaults:
|
51
|
+
# - order: rank
|
52
|
+
# - date range: current day
|
53
|
+
#
|
54
|
+
# @example Basic Use
|
55
|
+
# client = Rescuetime::Client.new
|
56
|
+
# client.categories
|
57
|
+
# #=> #<Rescuetime::Collection:0x007f93841681a8>
|
58
|
+
#
|
59
|
+
# @return [Rescuetime::Collection] a Rescuetime Collection specifying kind
|
60
|
+
# as a category report
|
61
|
+
#
|
62
|
+
# @see #overview Overview report (alternative)
|
63
|
+
# @see #activities Activity report (alternative)
|
64
|
+
# @see #productivity Productivity report (alternative)
|
65
|
+
# @see #efficiency Efficiency report (alternative)
|
66
|
+
# @see https://www.rescuetime.com/apidoc#paramlist Rescuetime API docs
|
67
|
+
# (see: restrict_kind)
|
20
68
|
def categories
|
21
69
|
add_to_query restrict_kind: 'category'
|
22
70
|
end
|
23
71
|
|
24
|
-
#
|
25
|
-
#
|
72
|
+
# Returns a Rescuetime activity report, grouping activities by their
|
73
|
+
# specific application, website, or activity
|
74
|
+
#
|
75
|
+
# Defaults:
|
76
|
+
# - order: rank
|
77
|
+
# - date range: current day
|
78
|
+
#
|
79
|
+
# @example Basic Use
|
80
|
+
# client = Rescuetime::Client.new
|
81
|
+
# client.activities
|
82
|
+
# #=> #<Rescuetime::Collection:0x007f93841681a8>
|
83
|
+
#
|
84
|
+
# @return [Rescuetime::Collection] a Rescuetime Collection specifying kind
|
85
|
+
# as a activity report
|
86
|
+
#
|
87
|
+
# @see #overview Overview report (alternative)
|
88
|
+
# @see #categories Category report (alternative)
|
89
|
+
# @see #productivity Productivity report (alternative)
|
90
|
+
# @see #efficiency Efficiency report (alternative)
|
91
|
+
# @see https://www.rescuetime.com/apidoc#paramlist Rescuetime API docs
|
92
|
+
# (see: restrict_kind)
|
26
93
|
def activities
|
27
94
|
add_to_query restrict_kind: 'activity'
|
28
95
|
end
|
29
96
|
|
30
|
-
#
|
31
|
-
#
|
97
|
+
# Returns a Rescuetime productivity report, featuring productivity
|
98
|
+
# calculations
|
99
|
+
#
|
100
|
+
# Defaults:
|
101
|
+
# - order: rank
|
102
|
+
# - date range: current day
|
103
|
+
#
|
104
|
+
# @example Basic Use
|
105
|
+
# client = Rescuetime::Client.new
|
106
|
+
# client.productivity
|
107
|
+
# #=> #<Rescuetime::Collection:0x007f93841681a8>
|
108
|
+
#
|
109
|
+
# @return [Rescuetime::Collection] a Rescuetime Collection specifying kind
|
110
|
+
# as a productivity report
|
111
|
+
#
|
112
|
+
# @see #overview Overview report (alternative)
|
113
|
+
# @see #categories Category report (alternative)
|
114
|
+
# @see #activities Activity report (alternative)
|
115
|
+
# @see #efficiency Efficiency report (alternative)
|
116
|
+
# @see https://www.rescuetime.com/apidoc#paramlist Rescuetime API docs
|
117
|
+
# (see: restrict_kind)
|
32
118
|
def productivity
|
33
119
|
add_to_query restrict_kind: 'productivity'
|
34
120
|
end
|
35
121
|
|
36
|
-
#
|
37
|
-
#
|
122
|
+
# Returns a Rescuetime efficiency report, featuring efficiency calculations.
|
123
|
+
# Defaults to chronological (time) order.
|
124
|
+
#
|
125
|
+
# Defaults:
|
126
|
+
# - order: time
|
127
|
+
# - date range: current day
|
128
|
+
#
|
129
|
+
# @example Basic Use
|
130
|
+
# client = Rescuetime::Client.new
|
131
|
+
# client.efficiency
|
132
|
+
# #=> #<Rescuetime::Collection:0x007f93841681a8>
|
133
|
+
#
|
134
|
+
# @return [Rescuetime::Collection] a Rescuetime Collection specifying kind
|
135
|
+
# as a efficiency report
|
136
|
+
#
|
137
|
+
# @see #overview Overview report (alternative)
|
138
|
+
# @see #categories Category report (alternative)
|
139
|
+
# @see #activities Activity report (alternative)
|
140
|
+
# @see #productivity Productivity report (alternative)
|
141
|
+
# @see https://www.rescuetime.com/apidoc#paramlist Rescuetime API docs
|
142
|
+
# (see: restrict_kind)
|
38
143
|
def efficiency
|
39
|
-
add_to_query restrict_kind: 'efficiency',
|
144
|
+
add_to_query restrict_kind: 'efficiency',
|
145
|
+
perspective: 'interval'
|
40
146
|
end
|
41
147
|
|
42
|
-
#
|
43
|
-
#
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
148
|
+
# Specifies the ordering and the interval of the returned Rescuetime report.
|
149
|
+
# For example, the results can be ordered by time, activity rank, or member;
|
150
|
+
# The results can be returned in intervals spanning a month, a week, a day,
|
151
|
+
# an hour, or 5-minutes.
|
152
|
+
#
|
153
|
+
# Efficiency reports default to :time order; everything else defaults to
|
154
|
+
# :rank order.
|
155
|
+
#
|
156
|
+
# @example Basic Use
|
157
|
+
# client = Rescuetime::Client.new
|
158
|
+
# client.order_by 'time' # interval is not required
|
159
|
+
# #=> #<Rescuetime::Collection:0x007f93841681a8>
|
160
|
+
#
|
161
|
+
# client.order_by 'rank', interval: 'hour'
|
162
|
+
# #=> #<Rescuetime::Collection:0x007f93841681a8>
|
163
|
+
#
|
164
|
+
# client.order_by :rank, interval: :hour # Symbols are also valid
|
165
|
+
# #=> #<Rescuetime::Collection:0x007f93841681a8>
|
166
|
+
#
|
167
|
+
# @example Invalid Values Raise Errors
|
168
|
+
# client = Rescuetime::Client.new
|
169
|
+
# client.order_by 'invalid'
|
170
|
+
# # => Rescuetime::InvalidQueryError: invalid is not a valid order
|
171
|
+
#
|
172
|
+
# client.order_by 'time', interval: 'invalid'
|
173
|
+
# # => Rescuetime::InvalidQueryError: invalid is not a valid interval
|
174
|
+
#
|
175
|
+
# @param [#to_s] order an order for the results (ex. 'time')
|
176
|
+
# @param [#intern, nil] interval a chunking interval for results
|
177
|
+
# (ex. 'month'). defaults to nil
|
178
|
+
#
|
179
|
+
# @return [Rescuetime::Collection] a Rescuetime Collection specifying order
|
180
|
+
# and interval (if set)
|
181
|
+
#
|
182
|
+
# @raise [Rescuetime::InvalidQueryError] if either order or interval are
|
183
|
+
# invalid
|
184
|
+
#
|
185
|
+
# @see https://www.rescuetime.com/apidoc#paramlist Rescuetime API docs
|
186
|
+
# (see: perspective,
|
187
|
+
# resolution_time)
|
188
|
+
# @see Rescuetime::QueryBuildable::VALID List of valid values
|
189
|
+
def order_by(order, interval: nil)
|
190
|
+
# set order and intervals as symbols
|
191
|
+
order = order.to_s
|
192
|
+
interval = interval ? interval.to_s : nil
|
49
193
|
|
50
|
-
|
51
|
-
|
194
|
+
# guards against invalid order or interval
|
195
|
+
unless valid_order? order
|
196
|
+
fail InvalidQueryError, "#{order} is not a valid order"
|
197
|
+
end
|
198
|
+
|
199
|
+
unless valid_interval? interval
|
200
|
+
fail InvalidQueryError, "#{interval} is not a valid interval"
|
201
|
+
end
|
202
|
+
|
203
|
+
add_to_query perspective: (order == 'time' ? 'interval' : order),
|
204
|
+
resolution_time: interval
|
52
205
|
end
|
53
206
|
|
54
|
-
#
|
207
|
+
# Limits the Rescuetime report to a specific single date. To specify a date
|
208
|
+
# range, use #from and #to.
|
209
|
+
#
|
210
|
+
# @example Basic Use
|
211
|
+
# client = Rescuetime::Client.new
|
212
|
+
# client.date Date.parse('1776-07-04')
|
213
|
+
# #=> #<Rescuetime::Collection:0x007f93841681a8>
|
214
|
+
#
|
215
|
+
# @example Valid Date Formats
|
216
|
+
# client.date Time.parse('1776-07-04') # responds to #strftime
|
217
|
+
# client.date '1776-07-04'
|
218
|
+
# client.date '1776/07/04'
|
219
|
+
# client.date '07-04-1776'
|
220
|
+
# client.date '07/04/1776'
|
221
|
+
# client.date '07-04' # defaults to current year
|
222
|
+
# client.date '07/04' # defaults to current year
|
223
|
+
#
|
224
|
+
# @param [#strftime, String] date a valid date-like object
|
225
|
+
# @return [Rescuetime::Collection] a Rescuetime Collection specifying
|
226
|
+
# report date
|
227
|
+
#
|
228
|
+
# @raise [Rescuetime::InvalidQueryError] if the date format is invalid
|
229
|
+
#
|
230
|
+
# @see #from
|
231
|
+
# @see #to
|
232
|
+
# @see Rescuetime::DateParser
|
233
|
+
# @see Rescuetime::DateParser::DATE_FORMATS Valid date formats
|
234
|
+
# @see https://www.rescuetime.com/apidoc#paramlist Rescuetime API docs
|
235
|
+
# (see: restrict_begin,
|
236
|
+
# restrict_end)
|
55
237
|
# @since v0.3.0
|
56
238
|
def date(date)
|
57
239
|
add_to_query restrict_end: to_formatted_s(date),
|
58
240
|
restrict_begin: to_formatted_s(date)
|
59
241
|
end
|
60
242
|
|
61
|
-
#
|
243
|
+
# Limits the Rescuetime report to a specific start date. If the end date is
|
244
|
+
# not specified, it defaults to today.
|
245
|
+
#
|
246
|
+
# @example Basic Use
|
247
|
+
# client = Rescuetime::Client.new
|
248
|
+
# client.from 3.days.ago
|
249
|
+
# #=> #<Rescuetime::Collection:0x007f93841681a8>
|
250
|
+
#
|
251
|
+
# @example With a specified end date
|
252
|
+
# client.from(2.weeks.ago).to(1.week.ago)
|
253
|
+
# client.from(2.weeks.ago) # defaults to ending today
|
254
|
+
#
|
255
|
+
# @param [#strftime, String] date a valid date-like object
|
256
|
+
# @return [Rescuetime::Collection] a Rescuetime Collection specifying
|
257
|
+
# report date
|
258
|
+
#
|
259
|
+
# @raise [Rescuetime::InvalidQueryError] if the date format is invalid
|
260
|
+
#
|
261
|
+
# @see #to
|
262
|
+
# @see #date
|
263
|
+
# @see Rescuetime::DateParser
|
264
|
+
# @see Rescuetime::DateParser::DATE_FORMATS Valid date formats
|
265
|
+
# @see https://www.rescuetime.com/apidoc#paramlist Rescuetime API docs
|
266
|
+
# (see: restrict_begin)
|
62
267
|
# @since v0.3.0
|
63
268
|
def from(date)
|
64
269
|
add_to_query restrict_begin: to_formatted_s(date)
|
65
270
|
end
|
66
271
|
|
67
|
-
#
|
272
|
+
# Limits the Rescuetime report to a specific end date. Requires #from to
|
273
|
+
# be set before the query is sent, but it doesn't matter if that happens
|
274
|
+
# before or after the call to #to.
|
275
|
+
#
|
276
|
+
# @example Basic Use
|
277
|
+
# client = Rescuetime::Client.new
|
278
|
+
# client.from(3.days.ago).to(1.day.ago)
|
279
|
+
# #=> #<Rescuetime::Collection:0x007f93841681a8>
|
280
|
+
#
|
281
|
+
# @example Requires a specified start date
|
282
|
+
# client.from(2.weeks.ago).to(1.week.ago).all # valid
|
283
|
+
# #=> [ ... ]
|
284
|
+
#
|
285
|
+
# client.to(1.week.ago).from(2.weeks.ago).all # valid
|
286
|
+
# #=> [ ... ]
|
287
|
+
#
|
288
|
+
# client.to(1.week.ago).all # invalid!
|
289
|
+
# #=> Rescuetime::InvalidQueryError
|
290
|
+
#
|
291
|
+
# @param [#strftime, String] date a valid date-like object
|
292
|
+
# @return [Rescuetime::Collection] a Rescuetime Collection specifying
|
293
|
+
# report date
|
294
|
+
#
|
295
|
+
# @raise [Rescuetime::InvalidQueryError] if the date format is invalid
|
296
|
+
#
|
297
|
+
# @see #from
|
298
|
+
# @see #date
|
299
|
+
# @see Rescuetime::DateParser
|
300
|
+
# @see Rescuetime::DateParser::DATE_FORMATS Valid date formats
|
301
|
+
# @see https://www.rescuetime.com/apidoc#paramlist Rescuetime API docs
|
302
|
+
# (see: restrict_end)
|
68
303
|
# @since v0.3.0
|
69
304
|
def to(date)
|
70
305
|
add_to_query restrict_end: to_formatted_s(date)
|
71
306
|
end
|
72
307
|
|
73
|
-
#
|
308
|
+
# Limits the Rescuetime report to specific activities and documents.
|
309
|
+
# The name option limits the results to those where name is an exact match;
|
310
|
+
# this can be used on the overview, activity, and category report. The
|
311
|
+
# document option limits the specific document title; this is only available
|
312
|
+
# on the activity report.
|
313
|
+
#
|
314
|
+
# If a value is passed for an unsupported report, it will be ignored.
|
315
|
+
#
|
316
|
+
# To see the category and document names for your account, please look at
|
317
|
+
# your rescuetime dashboard or generated rescuetime report.
|
318
|
+
#
|
319
|
+
# :name can be used on:
|
320
|
+
# - Overview report
|
321
|
+
# - Category report
|
322
|
+
# - Activity report
|
323
|
+
#
|
324
|
+
# :document can be used on:
|
325
|
+
# - Activity report when :name is set
|
326
|
+
#
|
327
|
+
# @example Basic Use
|
328
|
+
# client = Rescuetime::Client.new
|
329
|
+
# client.activities.where name: 'github.com',
|
330
|
+
# document: 'leesharma/rescuetime'
|
331
|
+
# #=> #<Rescuetime::Collection:0x007f93841681a8>
|
332
|
+
#
|
333
|
+
# @example Valid reports
|
334
|
+
# client.overview.where name: 'Utilities'
|
335
|
+
# client.categories.where name: 'Intelligence'
|
336
|
+
# client.activities.where name: 'github.com'
|
337
|
+
# client.activities.where name: 'github.com', document: 'rails/rails'
|
338
|
+
#
|
339
|
+
# @example Invalid reports
|
340
|
+
# client.productivity.where name: 'Intelligence' # Invalid!
|
341
|
+
# client.efficiency.where name: 'Intelligence' # Invalid!
|
342
|
+
# client.activities.where document: 'rails/rails' # Invalid!
|
343
|
+
#
|
344
|
+
# @param [String] name Rescuetime category name, valid on overview,
|
345
|
+
# category, and activity reports
|
346
|
+
# @param [String] document Specific document name, valid on activity
|
347
|
+
# reports when :name is set
|
348
|
+
#
|
349
|
+
# @return [Rescuetime::Collection] a Rescuetime Collection specifying
|
350
|
+
# category name and (optionally) document
|
351
|
+
# @raises [ArgumentError] if name is not set
|
352
|
+
#
|
353
|
+
# @see #overview
|
354
|
+
# @see #activities
|
355
|
+
# @see #categories
|
356
|
+
# @see https://www.rescuetime.com/apidoc#paramlist Rescuetime API docs
|
357
|
+
# (see: restrict_thing,
|
358
|
+
# restrict_thingy)
|
74
359
|
# @since v0.3.0
|
75
|
-
def where(
|
76
|
-
|
77
|
-
|
360
|
+
def where(name: nil, document: nil)
|
361
|
+
# Stand-in for required keyword arguments
|
362
|
+
name or fail ArgumentError, 'missing keyword: name'
|
363
|
+
|
364
|
+
add_to_query restrict_thing: name,
|
365
|
+
restrict_thingy: document
|
78
366
|
end
|
79
367
|
|
80
368
|
private
|
81
369
|
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
370
|
+
# Adds terms to the Rescuetime collection query
|
371
|
+
#
|
372
|
+
# @param [Hash] terms a set of terms to add to the query
|
373
|
+
# @return [Rescuetime::Collection]
|
87
374
|
def add_to_query(**terms)
|
88
375
|
if self.is_a? Rescuetime::Collection
|
89
376
|
self << terms
|
@@ -93,22 +380,55 @@ module Rescuetime
|
|
93
380
|
end
|
94
381
|
end
|
95
382
|
|
383
|
+
# Returns a list of valid orders
|
384
|
+
#
|
385
|
+
# @return [Array<String>] a list of valid order arguments
|
386
|
+
# @since v0.3.2
|
387
|
+
def valid_orders
|
388
|
+
VALID[:order_by]
|
389
|
+
end
|
390
|
+
|
391
|
+
# Returns a list of valid intervals
|
392
|
+
#
|
393
|
+
# @return [Array<String>] a list of valid interval arguments
|
394
|
+
# @since v0.3.2
|
395
|
+
def valid_intervals
|
396
|
+
VALID[:interval]
|
397
|
+
end
|
398
|
+
|
399
|
+
# Returns true if the given order is valid
|
400
|
+
#
|
401
|
+
# @param [#to_s] order order to check for validity
|
402
|
+
# @return [Boolean] true if the order is valid
|
403
|
+
# @since v0.3.2
|
404
|
+
def valid_order?(order)
|
405
|
+
valid_orders.include? order.to_s
|
406
|
+
end
|
407
|
+
|
408
|
+
# Returns true if the given interval is valid.
|
409
|
+
#
|
410
|
+
# @param [#to_s] interval interval to check for validity
|
411
|
+
# @return [Boolean] true if the interval is valid
|
412
|
+
# @since v0.3.2
|
413
|
+
def valid_interval?(interval)
|
414
|
+
return true if interval.nil? # intervals aren't required
|
415
|
+
valid_intervals.include? interval.to_s
|
416
|
+
end
|
417
|
+
|
418
|
+
# Returns a string in the Rescuetime-date format ("YYYY-MM-DD")
|
419
|
+
#
|
420
|
+
# @param [#strftime, String] date
|
421
|
+
# @param [#parse] date_parser defaults to
|
422
|
+
# Rescuetime::DateParser
|
423
|
+
# @return [String] a string in 'YYYY-MM-DD' format
|
424
|
+
#
|
425
|
+
# @raise [Rescuetime::InvalidQueryError] if the date format is invalid
|
426
|
+
#
|
427
|
+
# @see Rescuetime::DateParser
|
428
|
+
# @see Rescuetime::DateParser::DATE_FORMATS Valid date formats
|
96
429
|
# @since v0.3.0
|
97
|
-
def to_formatted_s(date)
|
98
|
-
|
99
|
-
when date.respond_to?(:strftime) then date.strftime('%Y-%m-%d')
|
100
|
-
when date =~ /\d{4}-\d{2}-\d{2}/ then date
|
101
|
-
when date =~ %r{\d{4}\/\d{2}\/\d{2}} then date.gsub '/', '-'
|
102
|
-
when date =~ %r{\d{2}[-\/]\d{2}[-\/]\d{4}/}
|
103
|
-
date_chunks = date.scan(/\d+/)
|
104
|
-
"#{ date_chunks[2] }-#{ date_chunks[0] }-#{ date_chunks[1] }"
|
105
|
-
when date =~ %r{\d{2}[-\/]\d{2}}
|
106
|
-
date_chunks = date.scan(/\d+/)
|
107
|
-
"#{ Time.now.year }-#{ date_chunks[0] }-#{ date_chunks[1] }"
|
108
|
-
else
|
109
|
-
fail InvalidQueryError,
|
110
|
-
'Invalid date entered. Please see docs for allowed formats.'
|
111
|
-
end
|
430
|
+
def to_formatted_s(date, date_parser: Rescuetime::DateParser)
|
431
|
+
date_parser.parse(date)
|
112
432
|
end
|
113
433
|
end
|
114
434
|
end
|
data/lib/rescuetime/requester.rb
CHANGED
@@ -4,37 +4,96 @@ module Rescuetime
|
|
4
4
|
#
|
5
5
|
# @since v0.2.0
|
6
6
|
class Requester
|
7
|
+
# Contains bodies of error responses recieved from rescuetime.com. If one
|
8
|
+
# of these responses is recieved, an error will be raised.
|
9
|
+
INVALID = {
|
10
|
+
key_not_found: '"error":"# key not found","messages":"key not found"',
|
11
|
+
query: '"error": "# query error",'\
|
12
|
+
'"messages": "Error: Likely a badly formatted or missing parameter"'
|
13
|
+
}
|
14
|
+
|
7
15
|
class << self
|
8
|
-
#
|
9
|
-
|
10
|
-
|
11
|
-
|
16
|
+
# Performs the GET request to the specified host. Before making the
|
17
|
+
# request, it checks for API key presence and raises an exception if it
|
18
|
+
# is not present. All other exceptions require the request to go through.
|
19
|
+
#
|
20
|
+
# @param [String] host request host
|
21
|
+
# @param [Hash] params request parameters
|
22
|
+
# @param [#get] http HTTP requester
|
23
|
+
# @return [Faraday::Response]
|
24
|
+
#
|
25
|
+
# @raise [Rescuetime::MissingCredentialsError] if no api key is present
|
26
|
+
# @raise [Rescuetime::InvalidCredentialsError] if api key is incorrect
|
27
|
+
# @raise [Rescuetime::InvalidQueryError] if query is badly formed
|
28
|
+
# @raise [Rescuetime::Error] if response HTTP status is
|
29
|
+
# not 200
|
30
|
+
#
|
31
|
+
# @see Rescuetime::Client#api_key=
|
32
|
+
def get(host, params, http: Faraday)
|
33
|
+
# Fail if no api key is provided
|
34
|
+
unless params[:key] && !params[:key].to_s.empty?
|
35
|
+
fail(Rescuetime::MissingCredentialsError)
|
36
|
+
end
|
12
37
|
|
13
|
-
|
14
|
-
|
38
|
+
req_params = params.delete_if { |_, v| !v || v.to_s.empty? }
|
39
|
+
response = http.get host, req_params
|
15
40
|
|
16
41
|
fail_or_return response
|
17
42
|
end
|
18
43
|
|
19
44
|
private
|
20
45
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
46
|
+
# Checks for an error in the Rescuetime response. If an error was recieved
|
47
|
+
# raise the appropriate Rescuetime::Error. Otherwise, return the response.
|
48
|
+
#
|
49
|
+
# @param [Faraday::Response] response HTTP response from rescuetime.com
|
50
|
+
# @return [Faraday::Response] 200 HTTP response from rescuetime.com
|
51
|
+
#
|
52
|
+
# @raise [Rescuetime::InvalidCredentialsError] if api key is incorrect
|
53
|
+
# @raise [Rescuetime::InvalidQueryError] if query is badly formed
|
54
|
+
# @raise [Rescuetime::Error] an error that varies based on the
|
55
|
+
# response status
|
27
56
|
def fail_or_return(response)
|
28
|
-
|
29
|
-
|
30
|
-
fail Rescuetime::
|
31
|
-
|
57
|
+
# match the response body to known error messages with 200 status
|
58
|
+
case response.body
|
59
|
+
when key_not_found? then fail Rescuetime::InvalidCredentialsError
|
60
|
+
when invalid_query? then fail Rescuetime::InvalidQueryError
|
61
|
+
end
|
32
62
|
|
63
|
+
# check the response status for errors
|
33
64
|
error = Rescuetime::Error::CODES[response.status.to_i]
|
34
65
|
fail(error) if error
|
35
66
|
|
36
67
|
response
|
37
68
|
end
|
69
|
+
|
70
|
+
# Returns lambda that returns true if the response body states that the
|
71
|
+
# api key was not found. For use in a case statement.
|
72
|
+
#
|
73
|
+
# This check is required because rescuetime.com returns a staus of 200
|
74
|
+
# with this error.
|
75
|
+
#
|
76
|
+
# @return [Lambda] a lambda that returns true if the api key was not found
|
77
|
+
#
|
78
|
+
# @see Rescuetime::Requester::INVALID
|
79
|
+
# @since v0.3.2
|
80
|
+
def key_not_found?
|
81
|
+
->(body) { body =~ /#{INVALID[:key_not_found]}/ }
|
82
|
+
end
|
83
|
+
|
84
|
+
# Returns lambda that returns true if the response body states that the
|
85
|
+
# query was invalid. For user in a case statement.
|
86
|
+
#
|
87
|
+
# This check is required because rescuetime.com returns a staus of 200
|
88
|
+
# with this error.
|
89
|
+
#
|
90
|
+
# @return [Lambda] a lambda that returns true if the query was invalid
|
91
|
+
#
|
92
|
+
# @see Rescuetime::Requester::INVALID
|
93
|
+
# @since v0.3.2
|
94
|
+
def invalid_query?
|
95
|
+
->(body) { body =~ /#{INVALID[:query]}/ }
|
96
|
+
end
|
38
97
|
end
|
39
98
|
end
|
40
99
|
end
|
data/lib/rescuetime/version.rb
CHANGED
data/rescuetime.gemspec
CHANGED
@@ -31,4 +31,5 @@ Gem::Specification.new do |spec|
|
|
31
31
|
spec.add_development_dependency 'rspec-its'
|
32
32
|
spec.add_development_dependency 'vcr', '~> 2.9', '>= 2.9.3'
|
33
33
|
spec.add_development_dependency 'webmock', '~> 1.21', '>= 1.21.0'
|
34
|
+
spec.add_development_dependency 'timecop', '~> 0.8.0'
|
34
35
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rescuetime
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Lee Sharma
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-05-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: faraday
|
@@ -132,6 +132,20 @@ dependencies:
|
|
132
132
|
- - ">="
|
133
133
|
- !ruby/object:Gem::Version
|
134
134
|
version: 1.21.0
|
135
|
+
- !ruby/object:Gem::Dependency
|
136
|
+
name: timecop
|
137
|
+
requirement: !ruby/object:Gem::Requirement
|
138
|
+
requirements:
|
139
|
+
- - "~>"
|
140
|
+
- !ruby/object:Gem::Version
|
141
|
+
version: 0.8.0
|
142
|
+
type: :development
|
143
|
+
prerelease: false
|
144
|
+
version_requirements: !ruby/object:Gem::Requirement
|
145
|
+
requirements:
|
146
|
+
- - "~>"
|
147
|
+
- !ruby/object:Gem::Version
|
148
|
+
version: 0.8.0
|
135
149
|
description: Ruby interface for the RescueTime Data Analytics API.
|
136
150
|
email:
|
137
151
|
- lee@leesharma.com
|
@@ -141,8 +155,9 @@ extra_rdoc_files: []
|
|
141
155
|
files:
|
142
156
|
- ".gitignore"
|
143
157
|
- ".rspec"
|
158
|
+
- ".rubocop.yml"
|
159
|
+
- ".rubocop_todo.yml"
|
144
160
|
- ".travis.yml"
|
145
|
-
- CHANGELOG.md
|
146
161
|
- CODE_OF_CONDUCT.md
|
147
162
|
- CONTRIBUTING.md
|
148
163
|
- Gemfile
|
@@ -154,6 +169,7 @@ files:
|
|
154
169
|
- lib/rescuetime.rb
|
155
170
|
- lib/rescuetime/client.rb
|
156
171
|
- lib/rescuetime/collection.rb
|
172
|
+
- lib/rescuetime/date_parser.rb
|
157
173
|
- lib/rescuetime/errors.rb
|
158
174
|
- lib/rescuetime/query_buildable.rb
|
159
175
|
- lib/rescuetime/requester.rb
|
@@ -179,7 +195,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
179
195
|
version: '0'
|
180
196
|
requirements: []
|
181
197
|
rubyforge_project:
|
182
|
-
rubygems_version: 2.4.
|
198
|
+
rubygems_version: 2.4.8
|
183
199
|
signing_key:
|
184
200
|
specification_version: 4
|
185
201
|
summary: Ruby interface for RescueTime
|
data/CHANGELOG.md
DELETED
@@ -1,13 +0,0 @@
|
|
1
|
-
# Changelog
|
2
|
-
|
3
|
-
## v0.1.0 (April 15, 2015)
|
4
|
-
|
5
|
-
Initial gem release
|
6
|
-
|
7
|
-
### Features
|
8
|
-
|
9
|
-
* Rescuetime has a version number
|
10
|
-
* `Rescuetime::Client` exists
|
11
|
-
* `Rescuetime::Client#api_key?` returns existence of api key
|
12
|
-
* `Rescuetime::Client#api_key=` overwrites api key
|
13
|
-
* `Rescuetime::Client#activities` returns list of activities
|