teamwork_api 0.1.0 → 0.1.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.
Files changed (43) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.rubocop.yml +11 -1
  4. data/.travis.yml +14 -1
  5. data/CHANGELOG.md +14 -0
  6. data/Gemfile +4 -2
  7. data/Gemfile.lock +65 -10
  8. data/Guardfile +12 -0
  9. data/README.md +5 -5
  10. data/Rakefile +2 -0
  11. data/lib/teamwork_api.rb +3 -0
  12. data/lib/teamwork_api/api/companies.rb +4 -0
  13. data/lib/teamwork_api/api/params.rb +18 -11
  14. data/lib/teamwork_api/api/people.rb +52 -29
  15. data/lib/teamwork_api/api/project_owner.rb +6 -1
  16. data/lib/teamwork_api/api/projects.rb +70 -47
  17. data/lib/teamwork_api/api/task_lists.rb +8 -4
  18. data/lib/teamwork_api/client.rb +24 -20
  19. data/lib/teamwork_api/error.rb +7 -1
  20. data/lib/teamwork_api/version.rb +3 -1
  21. data/spec/fixtures/companies.json +64 -0
  22. data/spec/fixtures/company.json +32 -0
  23. data/spec/fixtures/create_project.json +4 -0
  24. data/spec/fixtures/create_task_list.json +4 -0
  25. data/spec/fixtures/delete.json +3 -0
  26. data/spec/fixtures/people.json +80 -0
  27. data/spec/fixtures/person.json +77 -0
  28. data/spec/fixtures/project.json +68 -0
  29. data/spec/fixtures/project_owner.json +91 -0
  30. data/spec/fixtures/projects.json +135 -0
  31. data/spec/fixtures/task_list.json +18 -0
  32. data/spec/fixtures/task_lists.json +22 -0
  33. data/spec/fixtures/update.json +3 -0
  34. data/spec/spec_helper.rb +60 -7
  35. data/spec/teamwork_api/api/companies_spec.rb +69 -0
  36. data/spec/teamwork_api/api/people_spec.rb +78 -0
  37. data/spec/teamwork_api/api/project_owner_spec.rb +35 -0
  38. data/spec/teamwork_api/api/projects_spec.rb +117 -0
  39. data/spec/teamwork_api/api/task_lists_spec.rb +98 -0
  40. data/spec/teamwork_api/client_spec.rb +202 -0
  41. data/teamwork_api.gemspec +10 -2
  42. metadata +116 -8
  43. data/spec/teamwork_api_spec.rb +0 -9
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: '0597cc1425bbb361d139fa9ac0577254f9d32deaf6b1a4cf992aa19072fc5862'
4
- data.tar.gz: cbf693e0a516dc312bdb2d0ba288d574c7ad092d39ed0b2a7742b6b29fa2e3aa
3
+ metadata.gz: 352f6e7275ab0a7dabe81bd20c89f39522ac44633aba09c3baa44d343eff2288
4
+ data.tar.gz: 3866dfeb95209f58dd00a14fa91d68d6ef743ef682a23c1a80330685d8b918f3
5
5
  SHA512:
6
- metadata.gz: 5ffe58e4e966e152eb1acd524875c9271c45182e91562390fdf5618418450367c4138d6a6abef1e38c703df712a842e8c24273c6645758e16595173c1b4fa57a
7
- data.tar.gz: b7c0842c00c364b9fb19078611b39e3f61a0f131dba16faa39157fea9c7c1924f86f3050920955c5344da9f7251fbef183b8a494402edc12900f6ff5cc0bb84d
6
+ metadata.gz: 0bd71511ed7847858390dfa9402d896ef9fe91f70f46c300b51fe01927c05bca3a103f07637c797b4de9314d1ddf8552c63dc6fa13399f9c232f3869385166d1
7
+ data.tar.gz: 94ec7a0c037ac613ee8461ab2cd21003bd24821bb1402f20466381063e782a47daca582ce125bd60129a0c4514da1727376c1978f45171f757c50fd638c8be0e
data/.gitignore CHANGED
@@ -1,3 +1,4 @@
1
+ *.gem
1
2
  .bundle
2
3
  .yardoc
3
4
  _yardoc
@@ -1,4 +1,14 @@
1
+ require: rubocop-performance
2
+
1
3
  AllCops:
2
4
  TargetRubyVersion: 2.5
5
+ Metrics/BlockLength:
3
6
  Exclude:
4
- - 'spec/**/**/*.rb'
7
+ - 'Rakefile'
8
+ - 'spec/**/*.rb'
9
+ Metrics/MethodLength:
10
+ Max: 15
11
+ Style/BlockDelimiters:
12
+ EnforcedStyle: braces_for_chaining
13
+ Style/SymbolArray:
14
+ EnforcedStyle: brackets
@@ -1,5 +1,9 @@
1
1
  language: 'ruby'
2
2
 
3
+ env:
4
+ global:
5
+ - CC_TEST_REPORTER_ID=a2684f17bc26e1344f48ee22a407e27b3eb229050e949b56010388bc8a5e0866
6
+
3
7
  before_install:
4
8
  - 'gem update --system'
5
9
  - 'gem install bundler'
@@ -8,4 +12,13 @@ rvm:
8
12
  - '2.5.5'
9
13
  - '2.6.2'
10
14
 
11
- script: 'bundle exec rake'
15
+ before_script:
16
+ - curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter
17
+ - chmod +x ./cc-test-reporter
18
+ - ./cc-test-reporter before-build
19
+
20
+ script:
21
+ - bundle exec rake
22
+
23
+ after_script:
24
+ - ./cc-test-reporter after-build --exit-code $TRAVIS_TEST_RESULT
@@ -0,0 +1,14 @@
1
+ # Change Log
2
+ All notable changes to this project will be documented in this file.
3
+ This project adheres to [Semantic Versioning](http://semver.org/).
4
+
5
+ ## [0.1.1]
6
+
7
+ - Added Guard for development
8
+ - Setup Travis CI and Codeclimate
9
+ - Allow optional params for project request
10
+ - Added specs
11
+
12
+ ## [0.1.0] - 2019-05-13
13
+
14
+ - Release
data/Gemfile CHANGED
@@ -1,6 +1,8 @@
1
- source "https://rubygems.org"
1
+ # frozen_string_literal: true
2
2
 
3
- git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
3
+ source 'https://rubygems.org'
4
+
5
+ git_source(:github) { |repo_name| "https://github.com/#{repo_name}" }
4
6
 
5
7
  # Specify your gem's dependencies in teamwork_api.gemspec
6
8
  gemspec
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- teamwork_api (0.1.0)
4
+ teamwork_api (0.1.1)
5
5
  faraday (~> 0.9)
6
6
  faraday_middleware (~> 0.10)
7
7
  rack (>= 1.6)
@@ -9,23 +9,64 @@ PATH
9
9
  GEM
10
10
  remote: https://rubygems.org/
11
11
  specs:
12
+ addressable (2.6.0)
13
+ public_suffix (>= 2.0.2, < 4.0)
12
14
  ast (2.4.0)
15
+ coderay (1.1.2)
16
+ crack (0.4.3)
17
+ safe_yaml (~> 1.0.0)
13
18
  diff-lcs (1.3)
14
19
  docile (1.3.1)
15
20
  faraday (0.15.4)
16
21
  multipart-post (>= 1.2, < 3)
17
22
  faraday_middleware (0.13.1)
18
23
  faraday (>= 0.7.4, < 1.0)
24
+ ffi (1.10.0)
25
+ formatador (0.2.5)
26
+ guard (2.15.0)
27
+ formatador (>= 0.2.4)
28
+ listen (>= 2.7, < 4.0)
29
+ lumberjack (>= 1.0.12, < 2.0)
30
+ nenv (~> 0.1)
31
+ notiffany (~> 0.0)
32
+ pry (>= 0.9.12)
33
+ shellany (~> 0.0)
34
+ thor (>= 0.18.1)
35
+ guard-compat (1.2.1)
36
+ guard-rspec (4.7.3)
37
+ guard (~> 2.1)
38
+ guard-compat (~> 1.1)
39
+ rspec (>= 2.99.0, < 4.0)
40
+ guard-rubocop (1.3.0)
41
+ guard (~> 2.0)
42
+ rubocop (~> 0.20)
43
+ hashdiff (0.3.9)
19
44
  jaro_winkler (1.5.2)
20
45
  json (2.2.0)
46
+ listen (3.1.5)
47
+ rb-fsevent (~> 0.9, >= 0.9.4)
48
+ rb-inotify (~> 0.9, >= 0.9.7)
49
+ ruby_dep (~> 1.2)
50
+ lumberjack (1.0.13)
51
+ method_source (0.9.2)
21
52
  multipart-post (2.1.0)
53
+ nenv (0.3.0)
54
+ notiffany (0.1.1)
55
+ nenv (~> 0.1)
56
+ shellany (~> 0.0)
22
57
  parallel (1.17.0)
23
58
  parser (2.6.3.0)
24
59
  ast (~> 2.4.0)
25
- psych (3.1.0)
60
+ pry (0.12.2)
61
+ coderay (~> 1.1.0)
62
+ method_source (~> 0.9.0)
63
+ public_suffix (3.0.3)
26
64
  rack (2.0.7)
27
65
  rainbow (3.0.0)
28
- rake (10.5.0)
66
+ rake (11.3.0)
67
+ rb-fsevent (0.10.3)
68
+ rb-inotify (0.10.0)
69
+ ffi (~> 1.0)
29
70
  rspec (3.8.0)
30
71
  rspec-core (~> 3.8.0)
31
72
  rspec-expectations (~> 3.8.0)
@@ -39,32 +80,46 @@ GEM
39
80
  diff-lcs (>= 1.2.0, < 2.0)
40
81
  rspec-support (~> 3.8.0)
41
82
  rspec-support (3.8.0)
42
- rubocop (0.67.2)
83
+ rubocop (0.69.0)
43
84
  jaro_winkler (~> 1.5.1)
44
85
  parallel (~> 1.10)
45
- parser (>= 2.5, != 2.5.1.1)
46
- psych (>= 3.1.0)
86
+ parser (>= 2.6)
47
87
  rainbow (>= 2.2.2, < 4.0)
48
88
  ruby-progressbar (~> 1.7)
49
- unicode-display_width (>= 1.4.0, < 1.6)
89
+ unicode-display_width (>= 1.4.0, < 1.7)
90
+ rubocop-performance (1.3.0)
91
+ rubocop (>= 0.68.0)
50
92
  ruby-progressbar (1.10.0)
93
+ ruby_dep (1.5.0)
94
+ safe_yaml (1.0.5)
95
+ shellany (0.0.1)
51
96
  simplecov (0.16.1)
52
97
  docile (~> 1.1)
53
98
  json (>= 1.8, < 3)
54
99
  simplecov-html (~> 0.10.0)
55
100
  simplecov-html (0.10.2)
56
- unicode-display_width (1.5.0)
101
+ thor (0.20.3)
102
+ unicode-display_width (1.6.0)
103
+ webmock (2.3.2)
104
+ addressable (>= 2.3.6)
105
+ crack (>= 0.3.2)
106
+ hashdiff
57
107
 
58
108
  PLATFORMS
59
109
  ruby
60
110
 
61
111
  DEPENDENCIES
62
112
  bundler (~> 1.16)
63
- rake (~> 10.0)
113
+ guard (~> 2.14)
114
+ guard-rspec (~> 4.7)
115
+ guard-rubocop (~> 1.3.0)
116
+ rake (~> 11.1)
64
117
  rspec (~> 3.4)
65
- rubocop (~> 0.67.2)
118
+ rubocop (~> 0.69.0)
119
+ rubocop-performance (~> 1.3.0)
66
120
  simplecov (~> 0.11)
67
121
  teamwork_api!
122
+ webmock (~> 2.0)
68
123
 
69
124
  BUNDLED WITH
70
125
  1.17.2
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ guard :rspec, cmd: 'bundle exec rspec' do
4
+ watch(%r{^spec/.+_spec\.rb$})
5
+ watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
6
+ watch('spec/spec_helper.rb') { 'spec' }
7
+ end
8
+
9
+ guard :rubocop, all_on_start: false, cli: ['--display-cop-names'] do
10
+ watch(/.+\.(rb|rake)$/)
11
+ watch(%r{(?:.+/)?\.rubocop(_todo)?\.yml$}) { |m| File.dirname(m[0]) }
12
+ end
data/README.md CHANGED
@@ -1,10 +1,10 @@
1
1
  # TeamworkApi
2
2
 
3
- [![Code Climate](https://codeclimate.com/github/100yrs/teamwork_api.png)][codeclimate]
3
+ [![Build](https://travis-ci.org/100yrs/teamwork_api.svg?branch=master)](https://travis-ci.org/100yrs/teamwork_api)
4
+ [![Maintainability](https://api.codeclimate.com/v1/badges/ad05d9af4c9a0d2cc4dd/maintainability)](https://codeclimate.com/github/100yrs/teamwork_api/maintainability)
5
+ [![Test Coverage](https://api.codeclimate.com/v1/badges/ad05d9af4c9a0d2cc4dd/test_coverage)](https://codeclimate.com/github/100yrs/teamwork_api/test_coverage)
4
6
 
5
- [codeclimate]: https://codeclimate.com/github/100yrs/teamwork_api
6
-
7
- The Teamwork API gem allows you to consume the Teamwork API
7
+ The Teamwork API gem allows you to consume the [Teamwork API](https://developer.teamwork.com/)
8
8
 
9
9
  ## Installation
10
10
 
@@ -44,7 +44,7 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
44
44
 
45
45
  ## Contributing
46
46
 
47
- Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/teamwork_api. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
47
+ Bug reports and pull requests are welcome on GitHub at https://github.com/100yrs/teamwork_api. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
48
48
 
49
49
  1. Fork it
50
50
  2. Create your feature branch (`git checkout -b my-new-feature`)
data/Rakefile CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'bundler/gem_tasks'
2
4
 
3
5
  require 'rspec/core/rake_task'
@@ -1,5 +1,8 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'teamwork_api/version'
2
4
 
5
+ # Base module
3
6
  module TeamworkApi
4
7
  require 'teamwork_api/api/params'
5
8
  require 'teamwork_api/client'
@@ -1,5 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module TeamworkApi
2
4
  module API
5
+ # Client methods for Companies
6
+ # https://developer.teamwork.com/projects/companies
3
7
  module Companies
4
8
  def company(company_id)
5
9
  response = get "/companies/#{company_id}.json"
@@ -1,13 +1,18 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module TeamworkApi
4
+ # Make it easier to deal with params
2
5
  module API
3
6
  def self.params(args)
4
7
  Params.new(args)
5
8
  end
6
9
 
10
+ # The useful stuff is here
7
11
  class Params
8
12
  def initialize(args)
9
- raise ArgumentError.new('Required to be initialized with a Hash') unless
13
+ raise(ArgumentError, 'Required to be initialized with a Hash') unless
10
14
  args.is_a? Hash
15
+
11
16
  @args = args
12
17
  @required = []
13
18
  @optional = []
@@ -36,8 +41,7 @@ module TeamworkApi
36
41
 
37
42
  @required.each do |k|
38
43
  h[k] = @args[k]
39
- raise ArgumentError.new("#{k} is required but not specified") unless
40
- h[k]
44
+ raise(ArgumentError, "#{k} is required but not specified") unless h[k]
41
45
  end
42
46
 
43
47
  @optional.each do |k|
@@ -45,25 +49,28 @@ module TeamworkApi
45
49
  end
46
50
 
47
51
  @defaults.each do |k, v|
48
- @args.key?(k) ? h[k] = @args[k] : h[k] = v
52
+ h[k] = (@args.key?(k) ? @args[k] : v)
49
53
  end
50
54
 
51
55
  caseify_keys(h)
52
56
  end
53
57
 
54
- def caseify_keys(h)
58
+ def caseify_keys(hash)
55
59
  caseified_hash = {}
56
- h.each do |k, v|
57
- if k =~ /-/
58
- key = k.to_s
59
- else
60
- key = k.to_s.camelize(:lower)
61
- end
60
+ hash.each do |k, v|
61
+ key = (k.match?(/-/) ? k.to_s : camelize(k.to_s))
62
62
  caseified_hash[key] = v
63
63
  end
64
64
 
65
65
  caseified_hash
66
66
  end
67
+
68
+ def camelize(string)
69
+ string = string.sub(/^(?:(?=\b|[A-Z_])|\w)/) { $&.downcase }
70
+ string.gsub(%r{(?:_|(\/))([a-z\d]*)}) {
71
+ "#{Regexp.last_match(1)}#{Regexp.last_match(2).capitalize}"
72
+ }.gsub('/', '::')
73
+ end
67
74
  end
68
75
  end
69
76
  end
@@ -1,42 +1,65 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module TeamworkApi
2
4
  module API
5
+ # client methods for People
6
+ # https://developer.teamwork.com/projects/people
3
7
  module People
8
+ OPTIONAL_GET_ATTRIBUTES = [
9
+ :project_id,
10
+ :page,
11
+ :page_size,
12
+ :group_by_company,
13
+ :sort,
14
+ :sort_order,
15
+ :full_profile
16
+ ].freeze
17
+ OPTIONAL_UPDATE_ATTRIBUTES = [
18
+ :'edit-all-tasks',
19
+ :'view-messages-and-files',
20
+ :'view-tasks-and-milestones',
21
+ :'view-time',
22
+ :'view-notebooks',
23
+ :'view-risk-register',
24
+ :'view-invoices',
25
+ :'view-links',
26
+ :'view-links',
27
+ :'add-tasks',
28
+ :'add-milestones',
29
+ :'add-taskLists',
30
+ :'add-messages',
31
+ :'add-files',
32
+ :'add-time',
33
+ :'add-notebooks',
34
+ :'add-links',
35
+ :'set-privacy',
36
+ :'set-privacy',
37
+ :'is-observing',
38
+ :'can-be-assigned-to-tasks-and-milestones',
39
+ :'project-administrator',
40
+ :'add-people-to-project'
41
+ ].freeze
42
+
43
+ def person(person_id)
44
+ response = get "/people/#{person_id}.json"
45
+ response.body['person']
46
+ end
47
+
48
+ def people(args = {})
49
+ args = API.params(args).optional(*OPTIONAL_GET_ATTRIBUTES).to_h
50
+ response = get '/people.json', args
51
+ response.body['people']
52
+ end
53
+
4
54
  def add_person_to_project(project_id, person_id)
5
55
  response =
6
56
  put "projects/#{project_id}/people.json",
7
- { add: { userIdList: person_id } }
57
+ add: { userIdList: person_id }
8
58
  response.body['STATUS']
9
59
  end
10
60
 
11
61
  def set_permissions(project_id, person_id, args)
12
- args =
13
- API.params(args)
14
- .optional(
15
- :'edit-all-tasks',
16
- :'view-messages-and-files',
17
- :'view-tasks-and-milestones',
18
- :'view-time',
19
- :'view-notebooks',
20
- :'view-risk-register',
21
- :'view-invoices',
22
- :'view-links',
23
- :'view-links',
24
- :'add-tasks',
25
- :'add-milestones',
26
- :'add-taskLists',
27
- :'add-messages',
28
- :'add-files',
29
- :'add-time',
30
- :'add-notebooks',
31
- :'add-links',
32
- :'set-privacy',
33
- :'set-privacy',
34
- :'is-observing',
35
- :'can-be-assigned-to-tasks-and-milestones',
36
- :'project-administrator',
37
- :'add-people-to-project'
38
- ).to_h
39
-
62
+ args = API.params(args).optional(*OPTIONAL_UPDATE_ATTRIBUTES).to_h
40
63
  response =
41
64
  put "projects/#{project_id}/people/#{person_id}.json",
42
65
  permissions: args
@@ -1,10 +1,15 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module TeamworkApi
2
4
  module API
5
+ # Client methods for ProjectOwner. Note that there isn't a specific
6
+ # ProjectOwner endpoint and these happen via the project
7
+ # https://developer.teamwork.com/projects/project-owner
3
8
  module ProjectOwner
4
9
  def project_owner(project_id)
5
10
  response = get "projects/#{project_id}.json",
6
11
  project: { include_project_owner: true }
7
- response[:project][:owner]
12
+ response.body['project']['owner']
8
13
  end
9
14
 
10
15
  # This doesn't seem to work. Response is OK, but owner not set