camper 0.0.9 → 0.0.10

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 702097b0560277ca7116dea4caed2e50e34f6d6732ba0be390515931220ef24b
4
- data.tar.gz: 402cc359f4b7013691c36927e26502efe14a52b222471c8e5513a1d2b8e4c106
3
+ metadata.gz: 1b8a4cdfcb11473573ac1bb1f600964f12f8722093a8a9446a47d1594e4a0963
4
+ data.tar.gz: 43810e0cf19d16b5a2a71789401758f497dfa46d43e70ea8c9e9e5a8160bcb51
5
5
  SHA512:
6
- metadata.gz: 8681cda10f1bc5acc17a407d53a517bac0763758df16773952c8c84b9e7b380c5b18c7254a0d39d09dda70d505732a0c0f515d4c863adb4bab0b8471d66ef383
7
- data.tar.gz: a43b2d372e1f539f68ad8ec4bfd212353305da29a72f1bb82382609e0ce2ea237b7b457b92ed0d1d54c300a7d2fa4a8a5077fd0e5b84b1d7b982bb6bd3ccf5a4
6
+ metadata.gz: 261ab2cdc09cae324aef2183d5bba9fa087c87337f2b7fe5e007bb91af4c2a6abb56f32a158437f2f71e1acc5670f76fe612911810402e60647c161733bf6199
7
+ data.tar.gz: fe517bdf6508916f6cd037424f6e95a589e1ad27303e25b385d44d51c19c722e7d47ad9d1de28bab7f2da5bbe5ffd05f8255cf4400cff980b6cb31f9594e7f59
@@ -7,6 +7,7 @@ AllCops:
7
7
  NewCops: enable
8
8
  Exclude:
9
9
  - 'camper.gemspec'
10
+ - 'lib/camper/core_extensions/object.rb'
10
11
 
11
12
  Layout/LineLength:
12
13
  Max: 120
@@ -4,6 +4,12 @@
4
4
 
5
5
  **Implemented enhancements:**
6
6
 
7
+ - Complete projects api [\#51](https://github.com/renehernandez/camper/pull/51)
8
+
9
+ ## [v0.0.9](https://github.com/renehernandez/camper/tree/v0.0.9) (2020-10-28)
10
+
11
+ **Implemented enhancements:**
12
+
7
13
  - Split todos and todolists APIs [\#47](https://github.com/renehernandez/camper/pull/47)
8
14
 
9
15
  **Merged pull requests:**
@@ -1,7 +1,8 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- camper (0.0.8)
4
+ camper (0.0.9)
5
+ concurrent-ruby (~> 1.1)
5
6
  httparty (~> 0.18)
6
7
  rack-oauth2 (~> 1.14)
7
8
 
@@ -87,7 +88,7 @@ GEM
87
88
  thread_safe (~> 0.1)
88
89
  unicode-display_width (1.7.0)
89
90
  yard (0.9.25)
90
- zeitwerk (2.4.0)
91
+ zeitwerk (2.4.1)
91
92
 
92
93
  PLATFORMS
93
94
  ruby
@@ -28,6 +28,7 @@ Gem::Specification.new do |spec|
28
28
 
29
29
  spec.add_dependency 'httparty', '~> 0.18'
30
30
  spec.add_dependency 'rack-oauth2', '~> 1.14'
31
+ spec.add_dependency 'concurrent-ruby', '~> 1.1'
31
32
 
32
33
  spec.add_development_dependency 'rake', '~> 13.0'
33
34
  spec.add_development_dependency 'rspec', '~> 3.9'
@@ -8,3 +8,4 @@ current_user = client.profile
8
8
 
9
9
  puts "Current User:\n#{current_user.inspect}"
10
10
 
11
+ puts "People:\n#{client.people.inspect}"
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'camper'
4
+
5
+ client = Camper.client
6
+
7
+ project = client.project(ENV['PROJECT_ID'])
8
+
9
+ puts "Project name: #{project.name}"
10
+ puts "Project description: #{project.description}"
11
+
12
+ client.update_project(project, name: 'Hermes Testing', description: 'Hermes integration testing')
@@ -1,15 +1,112 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class Camper::Client
4
+ # Defines methods related to projects.
5
+ # @see https://github.com/basecamp/bc3-api/blob/master/sections/projects.md
4
6
  module ProjectsAPI
7
+ # Get the projects visible to the current user
8
+ #
9
+ # @example
10
+ # client.projects
11
+ # @example
12
+ # client.projects(status: 'trashed')
13
+ #
14
+ # @param options [Hash] extra options to filter the list of todolist
15
+ # @return [Array<Project>]
16
+ # @see https://github.com/basecamp/bc3-api/blob/master/sections/projects.md#get-all-projects
5
17
  def projects(options = {})
6
18
  get('/projects', options)
7
19
  end
8
20
 
21
+ # Get a project with a given id, granted they have access to it
22
+ #
23
+ # @example
24
+ # client.project(82564)
25
+ # @example
26
+ # client.project('7364183')
27
+ #
28
+ # @param id [Integet|String] id of the project to retrieve
29
+ # @return [Project]
30
+ # @raise [Error::InvalidParameter] if id is blank (nil or empty string)
31
+ # @see https://github.com/basecamp/bc3-api/blob/master/sections/projects.md#get-a-project
9
32
  def project(id)
33
+ raise Camper::Error::InvalidParameter, id if id.blank?
34
+
10
35
  get("/projects/#{id}")
11
36
  end
12
37
 
38
+ # Create a project
39
+ #
40
+ # @example
41
+ # client.create_project("Marketing Campaign")
42
+ # @example
43
+ # client.create_project('Better Marketing Campaign', "For Client: XYZ")
44
+ #
45
+ # @param name [String] name of the project to create
46
+ # @param description [String] description of the project
47
+ # @return [Project]
48
+ # @raise [Error::InvalidParameter] if name is blank (nil or empty string)
49
+ # @see https://github.com/basecamp/bc3-api/blob/master/sections/projects.md#create-a-project
50
+ def create_project(name, description = '')
51
+ raise Camper::Error::InvalidParameter, name if name.blank?
52
+
53
+ post('/projects', body: { name: name, description: description })
54
+ end
55
+
56
+ # Update a project
57
+ # description can be set to empty by passing an empty string
58
+ #
59
+ # @example
60
+ # client.update_project(12324, name: 'Retros')
61
+ # @example
62
+ # client.update_project('157432', description: 'A new description')
63
+ # @example
64
+ # client.update_project('157432', description: '')
65
+ # @example
66
+ # client.update_project(my_project, name: 'A new name', description: 'A new description')
67
+ #
68
+ # @param project [Integer|String|Project] either a project object or a project id
69
+ # @param name [String] optional new name of the project
70
+ # @param description [String] optinal new description of the project
71
+ # @return [Project]
72
+ # @raise [Error::InvalidParameter] if both name and description are blank (nil or empty strings)
73
+ # @see https://github.com/basecamp/bc3-api/blob/master/sections/projects.md#update-a-project
74
+ def update_project(project, name: '', description: nil)
75
+ if name.blank? && description.blank?
76
+ raise Camper::Error::InvalidParameter, 'name and description cannot both be blank'
77
+ end
78
+
79
+ id = project.respond_to?(:id) ? project.id : project
80
+
81
+ options = {}
82
+ options[:name] = name unless name.blank?
83
+ options[:description] = description unless description.nil?
84
+
85
+ put("/projects/#{id}", body: { **options })
86
+ end
87
+
88
+ # Delete a project
89
+ #
90
+ # @example
91
+ # client.delete_project(12324)
92
+ # @example
93
+ # client.delete_project('157432')
94
+ # @example
95
+ # client.delete_project(my_project)
96
+ #
97
+ # @param project [Integer|String|Project] either a project object or a project id
98
+ # @raise [Error::InvalidParameter] if project param is blank
99
+ # @see https://github.com/basecamp/bc3-api/blob/master/sections/projects.md#trash-a-project
100
+ def delete_project(project)
101
+ raise Camper::Error::InvalidParameter, 'project cannot be blank' if project.blank?
102
+
103
+ id = project.respond_to?(:id) ? project.id : project
104
+
105
+ delete("/projects/#{id}")
106
+ end
107
+
108
+ alias trash_project delete_project
109
+
13
110
  def message_board(project)
14
111
  board = project.message_board
15
112
  get(board.url, override_path: true)
@@ -0,0 +1,156 @@
1
+ # frozen_string_literal: true
2
+ # Copied from https://github.com/rails/rails/blob/master/activesupport/lib/active_support/core_ext/object/blank.rb
3
+
4
+ require 'concurrent/map'
5
+
6
+ class Object
7
+ # An object is blank if it's false, empty, or a whitespace string.
8
+ # For example, +nil+, '', ' ', [], {}, and +false+ are all blank.
9
+ #
10
+ # This simplifies
11
+ #
12
+ # !address || address.empty?
13
+ #
14
+ # to
15
+ #
16
+ # address.blank?
17
+ #
18
+ # @return [true, false]
19
+ def blank?
20
+ respond_to?(:empty?) ? !!empty? : !self
21
+ end
22
+
23
+ # An object is present if it's not blank.
24
+ #
25
+ # @return [true, false]
26
+ def present?
27
+ !blank?
28
+ end
29
+
30
+ # Returns the receiver if it's present otherwise returns +nil+.
31
+ # <tt>object.presence</tt> is equivalent to
32
+ #
33
+ # object.present? ? object : nil
34
+ #
35
+ # For example, something like
36
+ #
37
+ # state = params[:state] if params[:state].present?
38
+ # country = params[:country] if params[:country].present?
39
+ # region = state || country || 'US'
40
+ #
41
+ # becomes
42
+ #
43
+ # region = params[:state].presence || params[:country].presence || 'US'
44
+ #
45
+ # @return [Object]
46
+ def presence
47
+ self if present?
48
+ end
49
+ end
50
+
51
+ class NilClass
52
+ # +nil+ is blank:
53
+ #
54
+ # nil.blank? # => true
55
+ #
56
+ # @return [true]
57
+ def blank?
58
+ true
59
+ end
60
+ end
61
+
62
+ class FalseClass
63
+ # +false+ is blank:
64
+ #
65
+ # false.blank? # => true
66
+ #
67
+ # @return [true]
68
+ def blank?
69
+ true
70
+ end
71
+ end
72
+
73
+ class TrueClass
74
+ # +true+ is not blank:
75
+ #
76
+ # true.blank? # => false
77
+ #
78
+ # @return [false]
79
+ def blank?
80
+ false
81
+ end
82
+ end
83
+
84
+ class Array
85
+ # An array is blank if it's empty:
86
+ #
87
+ # [].blank? # => true
88
+ # [1,2,3].blank? # => false
89
+ #
90
+ # @return [true, false]
91
+ alias_method :blank?, :empty?
92
+ end
93
+
94
+ class Hash
95
+ # A hash is blank if it's empty:
96
+ #
97
+ # {}.blank? # => true
98
+ # { key: 'value' }.blank? # => false
99
+ #
100
+ # @return [true, false]
101
+ alias_method :blank?, :empty?
102
+ end
103
+
104
+ class String
105
+ BLANK_RE = /\A[[:space:]]*\z/
106
+ ENCODED_BLANKS = Concurrent::Map.new do |h, enc|
107
+ h[enc] = Regexp.new(BLANK_RE.source.encode(enc), BLANK_RE.options | Regexp::FIXEDENCODING)
108
+ end
109
+
110
+ # A string is blank if it's empty or contains whitespaces only:
111
+ #
112
+ # ''.blank? # => true
113
+ # ' '.blank? # => true
114
+ # "\t\n\r".blank? # => true
115
+ # ' blah '.blank? # => false
116
+ #
117
+ # Unicode whitespace is supported:
118
+ #
119
+ # "\u00a0".blank? # => true
120
+ #
121
+ # @return [true, false]
122
+ def blank?
123
+ # The regexp that matches blank strings is expensive. For the case of empty
124
+ # strings we can speed up this method (~3.5x) with an empty? call. The
125
+ # penalty for the rest of strings is marginal.
126
+ empty? ||
127
+ begin
128
+ BLANK_RE.match?(self)
129
+ rescue Encoding::CompatibilityError
130
+ ENCODED_BLANKS[self.encoding].match?(self)
131
+ end
132
+ end
133
+ end
134
+
135
+ class Numeric #:nodoc:
136
+ # No number is blank:
137
+ #
138
+ # 1.blank? # => false
139
+ # 0.blank? # => false
140
+ #
141
+ # @return [false]
142
+ def blank?
143
+ false
144
+ end
145
+ end
146
+
147
+ class Time #:nodoc:
148
+ # No Time is blank:
149
+ #
150
+ # Time.now.blank? # => false
151
+ #
152
+ # @return [false]
153
+ def blank?
154
+ false
155
+ end
156
+ end
@@ -139,7 +139,7 @@ module Camper
139
139
  end
140
140
 
141
141
  def body_to_json?(params)
142
- @method == 'post' && params.key?(:body)
142
+ %w[post put].include?(@method) && params.key?(:body)
143
143
  end
144
144
  end
145
145
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Camper
4
- VERSION = '0.0.9'
4
+ VERSION = '0.0.10'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: camper
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.9
4
+ version: 0.0.10
5
5
  platform: ruby
6
6
  authors:
7
7
  - renehernandez
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-10-28 00:00:00.000000000 Z
11
+ date: 2020-10-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: httparty
@@ -38,6 +38,20 @@ dependencies:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: '1.14'
41
+ - !ruby/object:Gem::Dependency
42
+ name: concurrent-ruby
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.1'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.1'
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: rake
43
57
  requirement: !ruby/object:Gem::Requirement
@@ -113,6 +127,7 @@ files:
113
127
  - examples/oauth.rb
114
128
  - examples/obtain_acces_token.rb
115
129
  - examples/people.rb
130
+ - examples/projects.rb
116
131
  - examples/todolists.rb
117
132
  - examples/todos.rb
118
133
  - lib/camper.rb
@@ -126,6 +141,7 @@ files:
126
141
  - lib/camper/authorization.rb
127
142
  - lib/camper/client.rb
128
143
  - lib/camper/configuration.rb
144
+ - lib/camper/core_extensions/object.rb
129
145
  - lib/camper/error.rb
130
146
  - lib/camper/logging.rb
131
147
  - lib/camper/paginated_response.rb