tinybucket 0.1.7 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +3 -0
- data/.rubocop.yml +2 -1
- data/Gemfile +4 -4
- data/README.md +48 -20
- data/Rakefile +7 -0
- data/lib/tinybucket.rb +7 -4
- data/lib/tinybucket/api/base_api.rb +2 -19
- data/lib/tinybucket/api/branch_restrictions_api.rb +35 -11
- data/lib/tinybucket/api/comments_api.rb +38 -4
- data/lib/tinybucket/api/commits_api.rb +60 -10
- data/lib/tinybucket/api/diff_api.rb +22 -0
- data/lib/tinybucket/api/helper/api_helper.rb +0 -11
- data/lib/tinybucket/api/helper/commits_helper.rb +7 -0
- data/lib/tinybucket/api/pull_requests_api.rb +79 -22
- data/lib/tinybucket/api/repo_api.rb +37 -17
- data/lib/tinybucket/api/repos_api.rb +13 -6
- data/lib/tinybucket/api/team_api.rb +54 -29
- data/lib/tinybucket/api/user_api.rb +43 -23
- data/lib/tinybucket/api_factory.rb +2 -4
- data/lib/tinybucket/client.rb +39 -20
- data/lib/tinybucket/config.rb +1 -1
- data/lib/tinybucket/connection.rb +3 -3
- data/lib/tinybucket/enumerator.rb +44 -0
- data/lib/tinybucket/error.rb +2 -0
- data/lib/tinybucket/error/conflict.rb +6 -0
- data/lib/tinybucket/error/not_found.rb +6 -0
- data/lib/tinybucket/error/service_error.rb +8 -4
- data/lib/tinybucket/iterator.rb +77 -0
- data/lib/tinybucket/model/base.rb +6 -6
- data/lib/tinybucket/model/branch_restriction.rb +27 -0
- data/lib/tinybucket/model/comment.rb +32 -6
- data/lib/tinybucket/model/commit.rb +63 -9
- data/lib/tinybucket/model/concerns.rb +1 -0
- data/lib/tinybucket/model/concerns/enumerable.rb +18 -0
- data/lib/tinybucket/model/error_response.rb +16 -1
- data/lib/tinybucket/model/page.rb +25 -49
- data/lib/tinybucket/model/profile.rb +56 -8
- data/lib/tinybucket/model/pull_request.rb +114 -18
- data/lib/tinybucket/model/repository.rb +177 -36
- data/lib/tinybucket/model/team.rb +70 -10
- data/lib/tinybucket/request.rb +2 -0
- data/lib/tinybucket/response.rb +1 -1
- data/lib/tinybucket/response/handler.rb +21 -0
- data/lib/tinybucket/version.rb +1 -1
- data/spec/fixtures/repositories/test_owner/test_repo/commit/1/approve/post.json +16 -0
- data/spec/lib/tinybucket/api/branch_restrictions_api_spec.rb +1 -2
- data/spec/lib/tinybucket/api/comments_api_spec.rb +1 -2
- data/spec/lib/tinybucket/api/commits_api_spec.rb +92 -3
- data/spec/lib/tinybucket/api/pull_requests_api_spec.rb +34 -4
- data/spec/lib/tinybucket/api/repo_api_spec.rb +1 -2
- data/spec/lib/tinybucket/api/repos_api_spec.rb +1 -2
- data/spec/lib/tinybucket/api/team_api_spec.rb +1 -6
- data/spec/lib/tinybucket/api/user_api_spec.rb +15 -2
- data/spec/lib/tinybucket/api_factory_spec.rb +2 -7
- data/spec/lib/tinybucket/client_spec.rb +10 -25
- data/spec/lib/tinybucket/error/service_error_spec.rb +23 -0
- data/spec/lib/tinybucket/model/commit_spec.rb +27 -4
- data/spec/lib/tinybucket/model/page_spec.rb +0 -30
- data/spec/lib/tinybucket/model/profile_spec.rb +3 -3
- data/spec/lib/tinybucket/model/pull_request_spec.rb +11 -5
- data/spec/lib/tinybucket/model/repository_spec.rb +5 -5
- data/spec/lib/tinybucket/model/team_spec.rb +4 -4
- data/spec/lib/tinybucket_spec.rb +10 -27
- data/spec/spec_helper.rb +3 -2
- data/spec/support/api_response_macros.rb +2 -2
- metadata +12 -3
- data/lib/tinybucket/response/error_handler.rb +0 -14
@@ -1,9 +1,7 @@
|
|
1
1
|
module Tinybucket
|
2
2
|
class ApiFactory
|
3
3
|
class << self
|
4
|
-
def create_instance(klass_name
|
5
|
-
options.symbolize_keys!
|
6
|
-
|
4
|
+
def create_instance(klass_name)
|
7
5
|
klass =
|
8
6
|
begin
|
9
7
|
name = "#{klass_name}Api".intern
|
@@ -14,7 +12,7 @@ module Tinybucket
|
|
14
12
|
raise ArgumentError, 'must provide klass to be instantiated'
|
15
13
|
end
|
16
14
|
|
17
|
-
klass.new
|
15
|
+
klass.new
|
18
16
|
end
|
19
17
|
end
|
20
18
|
end
|
data/lib/tinybucket/client.rb
CHANGED
@@ -1,14 +1,6 @@
|
|
1
1
|
module Tinybucket
|
2
2
|
class Client
|
3
|
-
include
|
4
|
-
|
5
|
-
def initialize(options = {})
|
6
|
-
options.each_pair do |key, value|
|
7
|
-
config.send("#{key}=", value)
|
8
|
-
end
|
9
|
-
|
10
|
-
yield(config) if block_given?
|
11
|
-
end
|
3
|
+
include ::Tinybucket::Model::Concerns::Enumerable
|
12
4
|
|
13
5
|
# Get Repositories
|
14
6
|
#
|
@@ -25,7 +17,8 @@ module Tinybucket
|
|
25
17
|
# @overload repos(options)
|
26
18
|
# get public repositories.
|
27
19
|
# @option options [Hash] a hash with options
|
28
|
-
# @return Tinybucket::
|
20
|
+
# @return [Tinybucket::Enumerator] enumerator to enumerate repositories
|
21
|
+
# as [Tinybucket::Model::Repository]
|
29
22
|
def repos(*args)
|
30
23
|
case args.size
|
31
24
|
when 0
|
@@ -46,25 +39,36 @@ module Tinybucket
|
|
46
39
|
end
|
47
40
|
end
|
48
41
|
|
42
|
+
# Get the repository
|
43
|
+
#
|
44
|
+
# @param owner [String] repository owner name.
|
45
|
+
# @param repo_slug [String] repository slug. (about {https://confluence.atlassian.com/bitbucket/repositories-endpoint-423626330.html#repositoriesEndpoint-Overview
|
46
|
+
# repo_slug})
|
47
|
+
# @return [Tinybucket::Model::Repository]
|
49
48
|
def repo(owner, repo_slug)
|
50
49
|
m = Tinybucket::Model::Repository.new({})
|
51
50
|
m.repo_owner = owner
|
52
51
|
m.repo_slug = repo_slug
|
53
|
-
m.api_config = config.dup
|
54
52
|
m
|
55
53
|
end
|
56
54
|
|
55
|
+
# Get the team
|
56
|
+
#
|
57
|
+
# @param teamname [String] the team name.
|
58
|
+
# @return [Tinybucket::Model::Team]
|
57
59
|
def team(teamname)
|
58
60
|
m = Tinybucket::Model::Team.new({})
|
59
61
|
m.username = teamname
|
60
|
-
m.api_config = config.dup
|
61
62
|
m
|
62
63
|
end
|
63
64
|
|
65
|
+
# Get the user profile
|
66
|
+
#
|
67
|
+
# @param username [String] the user name.
|
68
|
+
# @return [Tinybucket::Model::Profile]
|
64
69
|
def user(username)
|
65
70
|
m = Tinybucket::Model::Profile.new({})
|
66
71
|
m.username = username
|
67
|
-
m.api_config = config.dup
|
68
72
|
m
|
69
73
|
end
|
70
74
|
|
@@ -74,8 +78,11 @@ module Tinybucket
|
|
74
78
|
options = args.empty? ? {} : args.first
|
75
79
|
raise ArgumentError unless options.is_a?(Hash)
|
76
80
|
|
77
|
-
|
78
|
-
|
81
|
+
enumerator(
|
82
|
+
repos_api,
|
83
|
+
:list,
|
84
|
+
options
|
85
|
+
)
|
79
86
|
end
|
80
87
|
|
81
88
|
def owners_repos(*args)
|
@@ -83,13 +90,25 @@ module Tinybucket
|
|
83
90
|
options = (args.size == 2) ? args[1] : {}
|
84
91
|
raise ArgumentError unless options.is_a?(Hash)
|
85
92
|
|
86
|
-
|
87
|
-
|
88
|
-
|
93
|
+
enumerator(
|
94
|
+
user_api(owner),
|
95
|
+
:repos,
|
96
|
+
options
|
97
|
+
)
|
98
|
+
end
|
99
|
+
|
100
|
+
def repos_api
|
101
|
+
create_instance('Repos')
|
102
|
+
end
|
103
|
+
|
104
|
+
def user_api(owner)
|
105
|
+
api = create_instance('User')
|
106
|
+
api.username = owner
|
107
|
+
api
|
89
108
|
end
|
90
109
|
|
91
|
-
def create_instance(name
|
92
|
-
ApiFactory.create_instance(name
|
110
|
+
def create_instance(name)
|
111
|
+
ApiFactory.create_instance(name)
|
93
112
|
end
|
94
113
|
end
|
95
114
|
end
|
data/lib/tinybucket/config.rb
CHANGED
@@ -32,8 +32,8 @@ module Tinybucket
|
|
32
32
|
def default_middleware(_options)
|
33
33
|
proc do |conn|
|
34
34
|
oauth_secrets = {
|
35
|
-
consumer_key:
|
36
|
-
consumer_secret: config
|
35
|
+
consumer_key: Tinybucket.config.oauth_token,
|
36
|
+
consumer_secret: Tinybucket.config.oauth_secret
|
37
37
|
}
|
38
38
|
|
39
39
|
conn.request :multipart
|
@@ -42,7 +42,7 @@ module Tinybucket
|
|
42
42
|
|
43
43
|
conn.response :follow_oauth_redirects, oauth_secrets
|
44
44
|
conn.response :json, content_type: /\bjson$/
|
45
|
-
conn.use Tinybucket::Response::
|
45
|
+
conn.use Tinybucket::Response::Handler
|
46
46
|
conn.use :instrumentation
|
47
47
|
|
48
48
|
conn.adapter Faraday.default_adapter
|
@@ -0,0 +1,44 @@
|
|
1
|
+
module Tinybucket
|
2
|
+
class Enumerator < ::Enumerator
|
3
|
+
# Constructor
|
4
|
+
#
|
5
|
+
# This method create a enumerator to enumerate each items of iterator.
|
6
|
+
#
|
7
|
+
# @note This method return Lazy Enumerator if run on ruby 2.0.0 later.
|
8
|
+
#
|
9
|
+
# @param iterator [Tinybucket::Iterator] iterator instance.
|
10
|
+
# @param block [Proc] a proc object to handle each item.
|
11
|
+
def initialize(iterator, block)
|
12
|
+
@iterator = iterator
|
13
|
+
|
14
|
+
super() do |y|
|
15
|
+
loop do
|
16
|
+
m = y.yield(@iterator.next)
|
17
|
+
m = block.call(m) if block
|
18
|
+
m
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
lazy if lazy_enumerable?
|
23
|
+
end
|
24
|
+
|
25
|
+
# Get collection size.
|
26
|
+
#
|
27
|
+
# @see Tinybucket::Iterator#size
|
28
|
+
#
|
29
|
+
# @return [Fixnum, NillClass] collection size.
|
30
|
+
def size
|
31
|
+
@iterator.size
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
def lazy_enumerable?
|
37
|
+
ruby_major_version >= 2
|
38
|
+
end
|
39
|
+
|
40
|
+
def ruby_major_version
|
41
|
+
RUBY_VERSION.split('.')[0].to_i
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
data/lib/tinybucket/error.rb
CHANGED
@@ -2,18 +2,22 @@ module Tinybucket
|
|
2
2
|
module Error
|
3
3
|
class ServiceError < BaseError
|
4
4
|
attr_accessor :http_headers
|
5
|
+
attr_reader :http_method, :request_url, :status_code, :response_body
|
5
6
|
|
6
7
|
def initialize(env)
|
7
8
|
super generate_message(env)
|
8
9
|
@http_headers = env[:response_headers]
|
9
10
|
end
|
10
11
|
|
12
|
+
private
|
13
|
+
|
11
14
|
def generate_message(env)
|
12
|
-
http_method = env[:method].to_s.upcase
|
13
|
-
|
14
|
-
|
15
|
+
@http_method = env[:method].to_s.upcase
|
16
|
+
@request_url = env[:url].to_s
|
17
|
+
@status_code = env[:status]
|
18
|
+
@response_body = env[:body]
|
15
19
|
|
16
|
-
"#{http_method} #{
|
20
|
+
"#{@http_method} #{@request_url} #{@status_code} #{@response_body}"
|
17
21
|
end
|
18
22
|
end
|
19
23
|
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
module Tinybucket
|
2
|
+
# Iterator
|
3
|
+
#
|
4
|
+
# This iterator iterate items by sending request ot Bitbucket Cloud REST API.
|
5
|
+
class Iterator
|
6
|
+
# Constructor
|
7
|
+
#
|
8
|
+
# @param api_client [Tinybucket::Api::Base] an instance of Api Client class.
|
9
|
+
# @param method [Symbol] method name to invoke api_client method.
|
10
|
+
# @param args [Array<Object>] arguments to pass method call of
|
11
|
+
# api_client as arguments.
|
12
|
+
def initialize(api_client, method, *args)
|
13
|
+
@client = api_client
|
14
|
+
@method = method
|
15
|
+
@args = args
|
16
|
+
|
17
|
+
@attrs = {}
|
18
|
+
@values = []
|
19
|
+
@pos = nil
|
20
|
+
end
|
21
|
+
|
22
|
+
def next
|
23
|
+
next_value
|
24
|
+
end
|
25
|
+
|
26
|
+
# Get collection size.
|
27
|
+
#
|
28
|
+
# @note This method return {https://confluence.atlassian.com/bitbucket/version-2-423626329.html#Version2-Pagingthroughobjectcollections
|
29
|
+
# size attribute of object collection wrapper}.
|
30
|
+
# So this method may return nil.
|
31
|
+
#
|
32
|
+
# @see https://confluence.atlassian.com/bitbucket/version-2-423626329.html#Version2-Pagingthroughobjectcollections
|
33
|
+
# Paging through object collections
|
34
|
+
#
|
35
|
+
# @return [Fixnum, NillClas] collection size.
|
36
|
+
def size
|
37
|
+
load_next if next?
|
38
|
+
@attrs[:size]
|
39
|
+
end
|
40
|
+
|
41
|
+
private
|
42
|
+
|
43
|
+
def next_value
|
44
|
+
load_next if next?
|
45
|
+
|
46
|
+
@values.fetch(@pos).tap { @pos += 1 }
|
47
|
+
rescue IndexError
|
48
|
+
raise StopIteration
|
49
|
+
end
|
50
|
+
|
51
|
+
def next?
|
52
|
+
@pos.nil? || (@values.size == @pos && @attrs[:next])
|
53
|
+
end
|
54
|
+
|
55
|
+
def load_next
|
56
|
+
@pos = 0 if @pos.nil?
|
57
|
+
|
58
|
+
page = @client.send(@method, *next_params)
|
59
|
+
|
60
|
+
@attrs = page.attrs
|
61
|
+
@values.concat(page.items)
|
62
|
+
end
|
63
|
+
|
64
|
+
def next_params
|
65
|
+
params =
|
66
|
+
if @attrs.empty?
|
67
|
+
{}
|
68
|
+
else
|
69
|
+
unescaped_query = URI.unescape(URI.parse(@attrs[:next]).query)
|
70
|
+
Hash[*unescaped_query.split(/&|=/)]
|
71
|
+
end
|
72
|
+
|
73
|
+
@args[-1].merge!(params)
|
74
|
+
@args
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
@@ -3,7 +3,8 @@ module Tinybucket
|
|
3
3
|
class Base
|
4
4
|
include ::ActiveModel::Serializers::JSON
|
5
5
|
include Concerns::AcceptableAttributes
|
6
|
-
|
6
|
+
include Concerns::Enumerable
|
7
|
+
include Concerns::Reloadable
|
7
8
|
|
8
9
|
def self.concern_included?(concern_name)
|
9
10
|
mod_name = "Tinybucket::Model::Concerns::#{concern_name}".constantize
|
@@ -12,7 +13,6 @@ module Tinybucket
|
|
12
13
|
|
13
14
|
def initialize(json)
|
14
15
|
self.attributes = json
|
15
|
-
@api_config = {}
|
16
16
|
@_loaded = !json.empty?
|
17
17
|
end
|
18
18
|
|
@@ -36,12 +36,12 @@ module Tinybucket
|
|
36
36
|
|
37
37
|
protected
|
38
38
|
|
39
|
-
def create_api(api_key, keys
|
39
|
+
def create_api(api_key, keys)
|
40
40
|
key = ('@' + api_key.underscore).intern
|
41
41
|
api = instance_variable_get(key)
|
42
42
|
return api if api.present?
|
43
43
|
|
44
|
-
api = create_instance(api_key
|
44
|
+
api = create_instance(api_key)
|
45
45
|
api.repo_owner = keys[:repo_owner]
|
46
46
|
api.repo_slug = keys[:repo_slug]
|
47
47
|
instance_variable_set(key, api)
|
@@ -49,8 +49,8 @@ module Tinybucket
|
|
49
49
|
api
|
50
50
|
end
|
51
51
|
|
52
|
-
def create_instance(klass_name
|
53
|
-
ApiFactory.create_instance(klass_name
|
52
|
+
def create_instance(klass_name)
|
53
|
+
ApiFactory.create_instance(klass_name)
|
54
54
|
end
|
55
55
|
|
56
56
|
def logger
|
@@ -1,14 +1,41 @@
|
|
1
1
|
module Tinybucket
|
2
2
|
module Model
|
3
|
+
# BranchRestriction
|
4
|
+
#
|
5
|
+
# @see https://confluence.atlassian.com/bitbucket/branch-restrictions-resource-387449181.html
|
6
|
+
# branch-restrictions Resource - Bitbucket Cloud REST API document
|
7
|
+
#
|
8
|
+
# @!attribute [rw] groups
|
9
|
+
# @return [Array]
|
10
|
+
# @!attribute [rw] id
|
11
|
+
# @return [Fixnum]
|
12
|
+
# @!attribute [rw] kind
|
13
|
+
# @return [String]
|
14
|
+
# @!attribute [rw] links
|
15
|
+
# @return [Hash]
|
16
|
+
# @!attribute [rw] pattern
|
17
|
+
# @return [String]
|
18
|
+
# @!attribute [rw] users
|
19
|
+
# @return [Array]
|
20
|
+
# @!attribute [rw] uuid
|
21
|
+
# @return [NillClass]
|
3
22
|
class BranchRestriction < Base
|
4
23
|
include Tinybucket::Model::Concerns::RepositoryKeys
|
5
24
|
|
6
25
|
acceptable_attributes :groups, :id, :kind, :links, :pattern, :users, :uuid
|
7
26
|
|
27
|
+
# Update this branch restriction
|
28
|
+
#
|
29
|
+
# @todo to be implemented
|
30
|
+
# @raise [NotImplementedError] to be implemented.
|
8
31
|
def update(_params)
|
9
32
|
raise NotImplementedError
|
10
33
|
end
|
11
34
|
|
35
|
+
# Delete this branch restriction
|
36
|
+
#
|
37
|
+
# @todo to be implemented
|
38
|
+
# @raise [NotImplementedError] to be implemented.
|
12
39
|
def destroy
|
13
40
|
raise NotImplementedError
|
14
41
|
end
|
@@ -1,32 +1,58 @@
|
|
1
1
|
module Tinybucket
|
2
2
|
module Model
|
3
|
+
# Comment
|
4
|
+
#
|
5
|
+
# @see https://confluence.atlassian.com/bitbucket/pullrequests-resource-423626332.html#pullrequestsResource-GETalistofapullrequestcomments
|
6
|
+
# Comment resource - Bitbucket Cloud REST API document
|
7
|
+
#
|
8
|
+
# @!attribute [rw] links
|
9
|
+
# @return [Hash]
|
10
|
+
# @!attribute [rw] id
|
11
|
+
# @return [Fixnum]
|
12
|
+
# @!attribute [rw] parent
|
13
|
+
# @return [Hash]
|
14
|
+
# @!attribute [rw] filename
|
15
|
+
# @return [String]
|
16
|
+
# @!attribute [rw] content
|
17
|
+
# @return [Hash]
|
18
|
+
# @!attribute [rw] user
|
19
|
+
# @return [Hash]
|
20
|
+
# @!attribute [rw] inline
|
21
|
+
# @return [Hash]
|
22
|
+
# @!attribute [rw] created_on
|
23
|
+
# @return [String]
|
24
|
+
# @!attribute [rw] updated_on
|
25
|
+
# @return [String]
|
26
|
+
# @!attribute [rw] uuid
|
27
|
+
# @return [NillClass]
|
3
28
|
class Comment < Base
|
4
29
|
include Tinybucket::Model::Concerns::RepositoryKeys
|
5
|
-
include Tinybucket::Model::Concerns::Reloadable
|
6
30
|
|
7
31
|
acceptable_attributes \
|
8
32
|
:links, :id, :parent, :filename, :content, :user, :inline, \
|
9
33
|
:created_on, :updated_on, :uuid
|
10
34
|
|
35
|
+
# @!attribute [rw] commented_to
|
36
|
+
# @return [Tinybucket::Model::PullRequest, Tinybucket::Model::Commit]
|
11
37
|
attr_accessor :commented_to
|
12
38
|
|
13
39
|
private
|
14
40
|
|
15
41
|
def commit_api
|
16
|
-
create_api('Comments', repo_keys
|
42
|
+
create_api('Comments', repo_keys)
|
17
43
|
end
|
18
44
|
|
19
|
-
def pull_request_api
|
20
|
-
create_api('PullRequests', repo_keys
|
45
|
+
def pull_request_api
|
46
|
+
create_api('PullRequests', repo_keys)
|
21
47
|
end
|
22
48
|
|
23
49
|
def load_model
|
24
50
|
api =
|
25
51
|
case commented_to
|
26
52
|
when Tinybucket::Model::Commit
|
27
|
-
commit_api
|
53
|
+
commit_api
|
28
54
|
when Tinybucket::Model::PullRequest
|
29
|
-
pull_request_api
|
55
|
+
pull_request_api
|
30
56
|
else
|
31
57
|
raise ArgumentError, 'commented_to was invalid'
|
32
58
|
end
|