noko 0.0.0 → 1.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/LICENSE.txt +22 -0
- data/README.md +40 -0
- data/lib/noko.rb +11 -0
- data/lib/noko/client.rb +83 -0
- data/lib/noko/client/account.rb +7 -0
- data/lib/noko/client/current_user.rb +19 -0
- data/lib/noko/client/entries.rb +23 -0
- data/lib/noko/client/expenses.rb +23 -0
- data/lib/noko/client/invoices.rb +39 -0
- data/lib/noko/client/project_groups.rb +31 -0
- data/lib/noko/client/projects.rb +55 -0
- data/lib/noko/client/tags.rb +35 -0
- data/lib/noko/client/timers.rb +31 -0
- data/lib/noko/client/users.rb +39 -0
- data/lib/noko/errors.rb +5 -0
- data/lib/noko/link_header.rb +16 -0
- data/lib/noko/params.rb +27 -0
- data/lib/noko/record.rb +31 -0
- data/lib/noko/version.rb +3 -0
- data/noko.gemspec +17 -0
- data/test/noko/client/account_test.rb +9 -0
- data/test/noko/client/current_user_test.rb +39 -0
- data/test/noko/client/entries_test.rb +45 -0
- data/test/noko/client/errors_test.rb +27 -0
- data/test/noko/client/expenses_test.rb +45 -0
- data/test/noko/client/invoices_test.rb +75 -0
- data/test/noko/client/options_test.rb +27 -0
- data/test/noko/client/project_groups_test.rb +63 -0
- data/test/noko/client/projects_test.rb +99 -0
- data/test/noko/client/response_test.rb +39 -0
- data/test/noko/client/tags_test.rb +63 -0
- data/test/noko/client/timers_test.rb +57 -0
- data/test/noko/client/users_test.rb +75 -0
- data/test/noko/client_test.rb +59 -0
- data/test/noko/record_test.rb +28 -0
- metadata +85 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: afa40cf652f7da2b1c9feb0424800d941d997991c6c4b910c46975c5c22c5fae
|
4
|
+
data.tar.gz: 56adb6ca37608d673058f13b9349d200ea376d217ea2b15ad4170baf124a2404
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 16d9ec8b0b3ae50cc931e2326691dd4ac8c3a3865c46ef996f61ecb915db88038209daf8f17da9e28d61912ff8f7abbed22c9520fb1001347f4c709372a20a77
|
7
|
+
data.tar.gz: 022b303e0a7b4f61410b7a4a9c2ef467e9e8173b971140d3bb8df764c31f88e60e5fe68a45b2f50e3a66a8d9c36e95db6a1de67775d8fb659b015b380cd61560
|
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2015-2019 TIMCRAFT
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person
|
4
|
+
obtaining a copy of this software and associated documentation
|
5
|
+
files (the "Software"), to deal in the Software without
|
6
|
+
restriction, including without limitation the rights to use,
|
7
|
+
copy, modify, merge, publish, distribute, sublicense, and/or sell
|
8
|
+
copies of the Software, and to permit persons to whom the
|
9
|
+
Software is furnished to do so, subject to the following
|
10
|
+
conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be
|
13
|
+
included in all copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
16
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
17
|
+
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
18
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
19
|
+
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
20
|
+
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
21
|
+
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
22
|
+
OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
# noko
|
2
|
+
|
3
|
+
[![Gem Version](https://badge.fury.io/rb/noko.svg)](https://badge.fury.io/rb/noko) [![Build Status](https://api.travis-ci.org/timcraft/noko.svg?branch=master)](https://travis-ci.org/timcraft/noko)
|
4
|
+
|
5
|
+
|
6
|
+
Ruby client for [Version 2 of the Noko/Freckle API](https://developer.nokotime.com/v2/).
|
7
|
+
|
8
|
+
|
9
|
+
## Install
|
10
|
+
|
11
|
+
Install using RubyGems:
|
12
|
+
|
13
|
+
```
|
14
|
+
$ gem install noko
|
15
|
+
```
|
16
|
+
|
17
|
+
Add it to your Gemfile and install using Bundler:
|
18
|
+
|
19
|
+
```ruby
|
20
|
+
gem 'noko'
|
21
|
+
```
|
22
|
+
|
23
|
+
Clone the repository:
|
24
|
+
|
25
|
+
```
|
26
|
+
git clone git@github.com:timcraft/noko.git
|
27
|
+
```
|
28
|
+
|
29
|
+
|
30
|
+
## Quick start
|
31
|
+
|
32
|
+
```ruby
|
33
|
+
require 'noko'
|
34
|
+
|
35
|
+
noko = Noko::Client.new(token: 'YOUR PERSONAL ACCESS TOKEN')
|
36
|
+
|
37
|
+
noko.get_projects.each do |project|
|
38
|
+
puts project.name
|
39
|
+
end
|
40
|
+
```
|
data/lib/noko.rb
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
require 'noko/client'
|
2
|
+
require 'noko/client/account'
|
3
|
+
require 'noko/client/current_user'
|
4
|
+
require 'noko/client/entries'
|
5
|
+
require 'noko/client/expenses'
|
6
|
+
require 'noko/client/invoices'
|
7
|
+
require 'noko/client/project_groups'
|
8
|
+
require 'noko/client/projects'
|
9
|
+
require 'noko/client/tags'
|
10
|
+
require 'noko/client/timers'
|
11
|
+
require 'noko/client/users'
|
data/lib/noko/client.rb
ADDED
@@ -0,0 +1,83 @@
|
|
1
|
+
require 'noko/version'
|
2
|
+
require 'noko/errors'
|
3
|
+
require 'noko/link_header'
|
4
|
+
require 'noko/params'
|
5
|
+
require 'noko/record'
|
6
|
+
require 'net/http'
|
7
|
+
require 'json'
|
8
|
+
|
9
|
+
module Noko
|
10
|
+
class Client
|
11
|
+
def initialize(options = {})
|
12
|
+
if options.key?(:access_token)
|
13
|
+
@auth_header, @auth_value = 'Authorization', "token #{options[:access_token]}"
|
14
|
+
else
|
15
|
+
@auth_header, @auth_value = 'X-NokoToken', options.fetch(:token)
|
16
|
+
end
|
17
|
+
|
18
|
+
@user_agent = options.fetch(:user_agent) { "noko/#{VERSION} ruby/#{RUBY_VERSION}" }
|
19
|
+
|
20
|
+
@host = 'api.nokotime.com'
|
21
|
+
|
22
|
+
@http = Net::HTTP.new(@host, Net::HTTP.https_default_port)
|
23
|
+
|
24
|
+
@http.use_ssl = true
|
25
|
+
end
|
26
|
+
|
27
|
+
def get(path, params = nil)
|
28
|
+
request(Net::HTTP::Get.new(Params.join(path, params)))
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
def post(path, attributes)
|
34
|
+
request(Net::HTTP::Post.new(path), attributes)
|
35
|
+
end
|
36
|
+
|
37
|
+
def put(path, attributes = nil)
|
38
|
+
request(Net::HTTP::Put.new(path), attributes)
|
39
|
+
end
|
40
|
+
|
41
|
+
def delete(path)
|
42
|
+
request(Net::HTTP::Delete.new(path))
|
43
|
+
end
|
44
|
+
|
45
|
+
def request(http_request, body_object = nil)
|
46
|
+
http_request['User-Agent'] = @user_agent
|
47
|
+
http_request[@auth_header] = @auth_value
|
48
|
+
|
49
|
+
if body_object
|
50
|
+
http_request['Content-Type'] = 'application/json'
|
51
|
+
http_request.body = JSON.generate(body_object)
|
52
|
+
end
|
53
|
+
|
54
|
+
parse(@http.request(http_request))
|
55
|
+
end
|
56
|
+
|
57
|
+
def parse(http_response)
|
58
|
+
case http_response
|
59
|
+
when Net::HTTPNoContent
|
60
|
+
:no_content
|
61
|
+
when Net::HTTPSuccess
|
62
|
+
if http_response['Content-Type'] && http_response['Content-Type'].split(';').first == 'application/json'
|
63
|
+
JSON.parse(http_response.body, symbolize_names: true, object_class: Record).tap do |object|
|
64
|
+
if http_response['Link']
|
65
|
+
object.singleton_class.module_eval { attr_accessor :link }
|
66
|
+
object.link = LinkHeader.parse(http_response['Link'])
|
67
|
+
end
|
68
|
+
end
|
69
|
+
else
|
70
|
+
http_response.body
|
71
|
+
end
|
72
|
+
when Net::HTTPBadRequest
|
73
|
+
object = JSON.parse(http_response.body, symbolize_names: true)
|
74
|
+
|
75
|
+
raise Error, object.fetch(:message)
|
76
|
+
when Net::HTTPUnauthorized
|
77
|
+
raise AuthenticationError
|
78
|
+
else
|
79
|
+
raise Error, "unexpected #{http_response.code} response from #{@host}"
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Noko
|
2
|
+
class Client
|
3
|
+
def get_current_user
|
4
|
+
get('/v2/current_user')
|
5
|
+
end
|
6
|
+
|
7
|
+
def get_current_user_entries(params = nil)
|
8
|
+
get('/v2/current_user/entries', params)
|
9
|
+
end
|
10
|
+
|
11
|
+
def get_current_user_expenses(params = nil)
|
12
|
+
get('/v2/current_user/expenses', params)
|
13
|
+
end
|
14
|
+
|
15
|
+
def update_current_user(attributes)
|
16
|
+
put('/v2/current_user', attributes)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Noko
|
2
|
+
class Client
|
3
|
+
def get_entries(params = nil)
|
4
|
+
get('/v2/entries', params)
|
5
|
+
end
|
6
|
+
|
7
|
+
def get_entry(id)
|
8
|
+
get("/v2/entries/#{id}")
|
9
|
+
end
|
10
|
+
|
11
|
+
def create_entry(attributes)
|
12
|
+
post('/v2/entries', attributes)
|
13
|
+
end
|
14
|
+
|
15
|
+
def update_entry(id, attributes)
|
16
|
+
put("/v2/entries/#{id}", attributes)
|
17
|
+
end
|
18
|
+
|
19
|
+
def delete_entry(id)
|
20
|
+
delete("/v2/entries/#{id}")
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Noko
|
2
|
+
class Client
|
3
|
+
def get_expenses(params = nil)
|
4
|
+
get('/v2/expenses', params)
|
5
|
+
end
|
6
|
+
|
7
|
+
def get_expense(id)
|
8
|
+
get("/v2/expenses/#{id}")
|
9
|
+
end
|
10
|
+
|
11
|
+
def create_expense(attributes)
|
12
|
+
post('/v2/expenses', attributes)
|
13
|
+
end
|
14
|
+
|
15
|
+
def update_expense(id, attributes)
|
16
|
+
put("/v2/expenses/#{id}", attributes)
|
17
|
+
end
|
18
|
+
|
19
|
+
def delete_expense(id)
|
20
|
+
delete("/v2/expenses/#{id}")
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module Noko
|
2
|
+
class Client
|
3
|
+
def get_invoices(params = nil)
|
4
|
+
get('/v2/invoices', params)
|
5
|
+
end
|
6
|
+
|
7
|
+
def get_invoice(id)
|
8
|
+
get("/v2/invoices/#{id}")
|
9
|
+
end
|
10
|
+
|
11
|
+
def create_invoice(attributes)
|
12
|
+
post('/v2/invoices', attributes)
|
13
|
+
end
|
14
|
+
|
15
|
+
def update_invoice(id, attributes)
|
16
|
+
put("/v2/invoices/#{id}", attributes)
|
17
|
+
end
|
18
|
+
|
19
|
+
def mark_invoice_paid(id)
|
20
|
+
put("/v2/invoices/#{id}/paid")
|
21
|
+
end
|
22
|
+
|
23
|
+
def mark_invoice_unpaid(id)
|
24
|
+
put("/v2/invoices/#{id}/unpaid")
|
25
|
+
end
|
26
|
+
|
27
|
+
def get_invoice_entries(id, params = nil)
|
28
|
+
get("/v2/invoices/#{id}/entries", params)
|
29
|
+
end
|
30
|
+
|
31
|
+
def get_invoice_expenses(id, params = nil)
|
32
|
+
get("/v2/invoices/#{id}/expenses", params)
|
33
|
+
end
|
34
|
+
|
35
|
+
def delete_invoice(id)
|
36
|
+
delete("/v2/invoices/#{id}")
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module Noko
|
2
|
+
class Client
|
3
|
+
def get_project_groups(params = nil)
|
4
|
+
get('/v2/project_groups', params)
|
5
|
+
end
|
6
|
+
|
7
|
+
def get_project_group(id)
|
8
|
+
get("/v2/project_groups/#{id}")
|
9
|
+
end
|
10
|
+
|
11
|
+
def create_project_group(attributes)
|
12
|
+
post('/v2/project_groups', attributes)
|
13
|
+
end
|
14
|
+
|
15
|
+
def get_project_group_entries(id, params = nil)
|
16
|
+
get("/v2/project_groups/#{id}/entries", params)
|
17
|
+
end
|
18
|
+
|
19
|
+
def get_project_group_projects(id, params = nil)
|
20
|
+
get("/v2/project_groups/#{id}/projects", params)
|
21
|
+
end
|
22
|
+
|
23
|
+
def update_project_group(id, attributes)
|
24
|
+
put("/v2/project_groups/#{id}", attributes)
|
25
|
+
end
|
26
|
+
|
27
|
+
def delete_project_group(id)
|
28
|
+
delete("/v2/project_groups/#{id}")
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
module Noko
|
2
|
+
class Client
|
3
|
+
def get_projects(params = nil)
|
4
|
+
get('/v2/projects', params)
|
5
|
+
end
|
6
|
+
|
7
|
+
def get_project(id)
|
8
|
+
get("/v2/projects/#{id}")
|
9
|
+
end
|
10
|
+
|
11
|
+
def create_project(attributes)
|
12
|
+
post('/v2/projects', attributes)
|
13
|
+
end
|
14
|
+
|
15
|
+
def get_project_entries(id, params = nil)
|
16
|
+
get("/v2/projects/#{id}/entries", params)
|
17
|
+
end
|
18
|
+
|
19
|
+
def get_project_expenses(id, params = nil)
|
20
|
+
get("/v2/projects/#{id}/expenses", params)
|
21
|
+
end
|
22
|
+
|
23
|
+
def update_project(id, attributes)
|
24
|
+
put("/v2/projects/#{id}", attributes)
|
25
|
+
end
|
26
|
+
|
27
|
+
def merge_projects(id, project_id)
|
28
|
+
put("/v2/projects/#{id}/merge", project_id: project_id)
|
29
|
+
end
|
30
|
+
|
31
|
+
def delete_project(id)
|
32
|
+
delete("/v2/projects/#{id}")
|
33
|
+
end
|
34
|
+
|
35
|
+
def archive_project(id)
|
36
|
+
put("/v2/projects/#{id}/archive")
|
37
|
+
end
|
38
|
+
|
39
|
+
def unarchive_project(id)
|
40
|
+
put("/v2/projects/#{id}/unarchive")
|
41
|
+
end
|
42
|
+
|
43
|
+
def archive_projects(project_ids)
|
44
|
+
put('/v2/projects/archive', project_ids: project_ids)
|
45
|
+
end
|
46
|
+
|
47
|
+
def unarchive_projects(project_ids)
|
48
|
+
put('/v2/projects/unarchive', project_ids: project_ids)
|
49
|
+
end
|
50
|
+
|
51
|
+
def delete_projects(project_ids)
|
52
|
+
put('/v2/projects/delete', project_ids: project_ids)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module Noko
|
2
|
+
class Client
|
3
|
+
def get_tags(params = nil)
|
4
|
+
get('/v2/tags', params)
|
5
|
+
end
|
6
|
+
|
7
|
+
def create_tags(names)
|
8
|
+
post('/v2/tags', names: names)
|
9
|
+
end
|
10
|
+
|
11
|
+
def get_tag(id)
|
12
|
+
get("/v2/tags/#{id}")
|
13
|
+
end
|
14
|
+
|
15
|
+
def get_tag_entries(id, params = nil)
|
16
|
+
get("/v2/tags/#{id}/entries", params)
|
17
|
+
end
|
18
|
+
|
19
|
+
def update_tag(id, attributes)
|
20
|
+
put("/v2/tags/#{id}", attributes)
|
21
|
+
end
|
22
|
+
|
23
|
+
def merge_tags(id, tag_id)
|
24
|
+
put("/v2/tags/#{id}/merge", tag_id: tag_id)
|
25
|
+
end
|
26
|
+
|
27
|
+
def delete_tag(id)
|
28
|
+
delete("/v2/tags/#{id}")
|
29
|
+
end
|
30
|
+
|
31
|
+
def delete_tags(tag_ids)
|
32
|
+
put('/v2/tags/delete', tag_ids: tag_ids)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module Noko
|
2
|
+
class Client
|
3
|
+
def get_timers(params = nil)
|
4
|
+
get('/v2/timers', params)
|
5
|
+
end
|
6
|
+
|
7
|
+
def get_timer(project_id)
|
8
|
+
get("/v2/projects/#{project_id}/timer")
|
9
|
+
end
|
10
|
+
|
11
|
+
def update_timer(project_id, attributes)
|
12
|
+
put("/v2/projects/#{project_id}/timer", attributes)
|
13
|
+
end
|
14
|
+
|
15
|
+
def start_timer(project_id)
|
16
|
+
put("/v2/projects/#{project_id}/timer/start")
|
17
|
+
end
|
18
|
+
|
19
|
+
def pause_timer(project_id)
|
20
|
+
put("/v2/projects/#{project_id}/timer/pause")
|
21
|
+
end
|
22
|
+
|
23
|
+
def log_timer(project_id, attributes = {})
|
24
|
+
put("/v2/projects/#{project_id}/timer/log", attributes)
|
25
|
+
end
|
26
|
+
|
27
|
+
def discard_timer(project_id)
|
28
|
+
delete("/v2/projects/#{project_id}/timer")
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|