bitbuckets 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (122) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE.txt +7 -0
  3. data/README.md +169 -0
  4. data/Rakefile +1 -0
  5. data/lib/bitbucket_rest_api.rb +86 -0
  6. data/lib/bitbucket_rest_api/api.rb +104 -0
  7. data/lib/bitbucket_rest_api/api/actions.rb +32 -0
  8. data/lib/bitbucket_rest_api/api_factory.rb +29 -0
  9. data/lib/bitbucket_rest_api/authorization.rb +31 -0
  10. data/lib/bitbucket_rest_api/client.rb +53 -0
  11. data/lib/bitbucket_rest_api/configuration.rb +103 -0
  12. data/lib/bitbucket_rest_api/connection.rb +97 -0
  13. data/lib/bitbucket_rest_api/constants.rb +57 -0
  14. data/lib/bitbucket_rest_api/core_ext/array.rb +6 -0
  15. data/lib/bitbucket_rest_api/core_ext/hash.rb +58 -0
  16. data/lib/bitbucket_rest_api/deprecation.rb +36 -0
  17. data/lib/bitbucket_rest_api/error.rb +37 -0
  18. data/lib/bitbucket_rest_api/error/bad_events.rb +10 -0
  19. data/lib/bitbucket_rest_api/error/bad_request.rb +11 -0
  20. data/lib/bitbucket_rest_api/error/blank_value.rb +10 -0
  21. data/lib/bitbucket_rest_api/error/client_error.rb +19 -0
  22. data/lib/bitbucket_rest_api/error/forbidden.rb +11 -0
  23. data/lib/bitbucket_rest_api/error/internal_server_error.rb +11 -0
  24. data/lib/bitbucket_rest_api/error/invalid_options.rb +17 -0
  25. data/lib/bitbucket_rest_api/error/no_events.rb +10 -0
  26. data/lib/bitbucket_rest_api/error/not_found.rb +11 -0
  27. data/lib/bitbucket_rest_api/error/required_params.rb +17 -0
  28. data/lib/bitbucket_rest_api/error/service_error.rb +18 -0
  29. data/lib/bitbucket_rest_api/error/service_unavailable.rb +11 -0
  30. data/lib/bitbucket_rest_api/error/unauthorized.rb +11 -0
  31. data/lib/bitbucket_rest_api/error/unknown_value.rb +17 -0
  32. data/lib/bitbucket_rest_api/error/unprocessable_entity.rb +11 -0
  33. data/lib/bitbucket_rest_api/error/validations.rb +17 -0
  34. data/lib/bitbucket_rest_api/invitations.rb +14 -0
  35. data/lib/bitbucket_rest_api/issues.rb +229 -0
  36. data/lib/bitbucket_rest_api/issues/comments.rb +116 -0
  37. data/lib/bitbucket_rest_api/issues/components.rb +105 -0
  38. data/lib/bitbucket_rest_api/issues/milestones.rb +105 -0
  39. data/lib/bitbucket_rest_api/normalizer.rb +24 -0
  40. data/lib/bitbucket_rest_api/parameter_filter.rb +29 -0
  41. data/lib/bitbucket_rest_api/repos.rb +276 -0
  42. data/lib/bitbucket_rest_api/repos/changesets.rb +52 -0
  43. data/lib/bitbucket_rest_api/repos/commits.rb +38 -0
  44. data/lib/bitbucket_rest_api/repos/components.rb +35 -0
  45. data/lib/bitbucket_rest_api/repos/default_reviewers.rb +60 -0
  46. data/lib/bitbucket_rest_api/repos/download.rb +15 -0
  47. data/lib/bitbucket_rest_api/repos/following.rb +38 -0
  48. data/lib/bitbucket_rest_api/repos/forks.rb +66 -0
  49. data/lib/bitbucket_rest_api/repos/keys.rb +86 -0
  50. data/lib/bitbucket_rest_api/repos/pull_request.rb +158 -0
  51. data/lib/bitbucket_rest_api/repos/services.rb +101 -0
  52. data/lib/bitbucket_rest_api/repos/sources.rb +36 -0
  53. data/lib/bitbucket_rest_api/repos/webhooks.rb +99 -0
  54. data/lib/bitbucket_rest_api/request.rb +71 -0
  55. data/lib/bitbucket_rest_api/request/basic_auth.rb +30 -0
  56. data/lib/bitbucket_rest_api/request/jsonize.rb +39 -0
  57. data/lib/bitbucket_rest_api/request/oauth.rb +50 -0
  58. data/lib/bitbucket_rest_api/response.rb +26 -0
  59. data/lib/bitbucket_rest_api/response/helpers.rb +18 -0
  60. data/lib/bitbucket_rest_api/response/jsonize.rb +25 -0
  61. data/lib/bitbucket_rest_api/response/mashify.rb +23 -0
  62. data/lib/bitbucket_rest_api/response/raise_error.rb +28 -0
  63. data/lib/bitbucket_rest_api/response/xmlize.rb +25 -0
  64. data/lib/bitbucket_rest_api/result.rb +136 -0
  65. data/lib/bitbucket_rest_api/teams.rb +91 -0
  66. data/lib/bitbucket_rest_api/user.rb +87 -0
  67. data/lib/bitbucket_rest_api/users.rb +20 -0
  68. data/lib/bitbucket_rest_api/users/account.rb +50 -0
  69. data/lib/bitbucket_rest_api/utils/url.rb +61 -0
  70. data/lib/bitbucket_rest_api/validations.rb +23 -0
  71. data/lib/bitbucket_rest_api/validations/format.rb +21 -0
  72. data/lib/bitbucket_rest_api/validations/presence.rb +21 -0
  73. data/lib/bitbucket_rest_api/validations/required.rb +37 -0
  74. data/lib/bitbucket_rest_api/validations/token.rb +38 -0
  75. data/lib/bitbucket_rest_api/version.rb +10 -0
  76. data/lib/bitbuckets.rb +2 -0
  77. data/spec/bitbucket_rest_api/api/actions_spec.rb +18 -0
  78. data/spec/bitbucket_rest_api/api_factory_spec.rb +28 -0
  79. data/spec/bitbucket_rest_api/api_spec.rb +87 -0
  80. data/spec/bitbucket_rest_api/authorization_spec.rb +74 -0
  81. data/spec/bitbucket_rest_api/client_spec.rb +17 -0
  82. data/spec/bitbucket_rest_api/core_ext/array_spec.rb +13 -0
  83. data/spec/bitbucket_rest_api/core_ext/hash_spec.rb +47 -0
  84. data/spec/bitbucket_rest_api/deprecation_spec.rb +31 -0
  85. data/spec/bitbucket_rest_api/error/bad_events_spec.rb +11 -0
  86. data/spec/bitbucket_rest_api/error/blank_value_spec.rb +14 -0
  87. data/spec/bitbucket_rest_api/error/no_events_spec.rb +11 -0
  88. data/spec/bitbucket_rest_api/invitations_spec.rb +21 -0
  89. data/spec/bitbucket_rest_api/issues/comments_spec.rb +89 -0
  90. data/spec/bitbucket_rest_api/issues/components_spec.rb +89 -0
  91. data/spec/bitbucket_rest_api/issues/milestones_spec.rb +89 -0
  92. data/spec/bitbucket_rest_api/issues_spec.rb +91 -0
  93. data/spec/bitbucket_rest_api/normalizer_spec.rb +29 -0
  94. data/spec/bitbucket_rest_api/parameter_filter_spec.rb +42 -0
  95. data/spec/bitbucket_rest_api/repos/changesets_spec.rb +44 -0
  96. data/spec/bitbucket_rest_api/repos/commits_spec.rb +21 -0
  97. data/spec/bitbucket_rest_api/repos/components_spec.rb +43 -0
  98. data/spec/bitbucket_rest_api/repos/default_reviewers_spec.rb +65 -0
  99. data/spec/bitbucket_rest_api/repos/download_spec.rb +10 -0
  100. data/spec/bitbucket_rest_api/repos/following_spec.rb +53 -0
  101. data/spec/bitbucket_rest_api/repos/forks_spec.rb +46 -0
  102. data/spec/bitbucket_rest_api/repos/keys_spec.rb +73 -0
  103. data/spec/bitbucket_rest_api/repos/pull_request_spec.rb +283 -0
  104. data/spec/bitbucket_rest_api/repos/sources_spec.rb +78 -0
  105. data/spec/bitbucket_rest_api/repos/webhooks_spec.rb +245 -0
  106. data/spec/bitbucket_rest_api/repos_spec.rb +158 -0
  107. data/spec/bitbucket_rest_api/request/jsonize_spec.rb +19 -0
  108. data/spec/bitbucket_rest_api/request/oauth_spec.rb +26 -0
  109. data/spec/bitbucket_rest_api/request_spec.rb +88 -0
  110. data/spec/bitbucket_rest_api/response/jsonize_spec.rb +13 -0
  111. data/spec/bitbucket_rest_api/response/mashify_spec.rb +33 -0
  112. data/spec/bitbucket_rest_api/response/raise_error_spec.rb +42 -0
  113. data/spec/bitbucket_rest_api/teams_spec.rb +136 -0
  114. data/spec/bitbucket_rest_api/user_spec.rb +78 -0
  115. data/spec/bitbucket_rest_api/utils/url_spec.rb +34 -0
  116. data/spec/bitbucket_rest_api/validations/format_spec.rb +30 -0
  117. data/spec/bitbucket_rest_api/validations/presence_spec.rb +13 -0
  118. data/spec/bitbucket_rest_api/validations/required_spec.rb +44 -0
  119. data/spec/bitbucket_rest_api/validations/token_spec.rb +17 -0
  120. data/spec/bitbucket_rest_api_spec.rb +17 -0
  121. data/spec/spec_helper.rb +24 -0
  122. metadata +358 -0
@@ -0,0 +1,116 @@
1
+ # frozen_string_literal: true
2
+ module BitBucket
3
+ class Issues::Comments < API
4
+ VALID_ISSUE_COMMENT_PARAM_NAME = %w[
5
+ content
6
+ ].freeze
7
+
8
+ # Creates new Issues::Comments API
9
+ def initialize(options = {})
10
+ super(options)
11
+ end
12
+
13
+ # List comments on an issue
14
+ #
15
+ # = Examples
16
+ # bitbucket = BitBucket.new
17
+ # bitbucket.issues.comments.all 'user-name', 'repo-name', 'issue-id'
18
+ # bitbucket.issues.comments.all 'user-name', 'repo-name', 'issue-id' {|com| .. }
19
+ #
20
+ def list(user_name, repo_name, issue_id, params = {})
21
+ _update_user_repo_params(user_name, repo_name)
22
+ _validate_user_repo_params(user, repo) unless user? && repo?
23
+ _validate_presence_of issue_id
24
+
25
+ normalize! params
26
+ # _merge_mime_type(:issue_comment, params)
27
+
28
+ response = get_request("/1.0/repositories/#{user}/#{repo.downcase}/issues/#{issue_id}/comments/", params)
29
+ return response unless block_given?
30
+
31
+ response.each { |el| yield el }
32
+ end
33
+ alias all list
34
+
35
+ # Get a single comment
36
+ #
37
+ # = Examples
38
+ # bitbucket = BitBucket.new
39
+ # bitbucket.issues.comments.find 'user-name', 'repo-name', 'comment-id'
40
+ #
41
+ def get(user_name, repo_name, comment_id, params = {})
42
+ _update_user_repo_params(user_name, repo_name)
43
+ _validate_user_repo_params(user, repo) unless user? && repo?
44
+ _validate_presence_of comment_id
45
+
46
+ normalize! params
47
+ # _merge_mime_type(:issue_comment, params)
48
+
49
+ get_request("/1.0/repositories/#{user}/#{repo.downcase}/issues/comments/#{comment_id}", params)
50
+ end
51
+ alias find get
52
+
53
+ # Create a comment
54
+ #
55
+ # = Inputs
56
+ # <tt>:content</tt> Required string
57
+ #
58
+ # = Examples
59
+ # bitbucket = BitBucket.new
60
+ # bitbucket.issues.comments.create 'user-name', 'repo-name', 'issue-id',
61
+ # "content" => 'a new comment'
62
+ #
63
+ def create(user_name, repo_name, issue_id, params = {})
64
+ _update_user_repo_params(user_name, repo_name)
65
+ _validate_user_repo_params(user, repo) unless user? && repo?
66
+ _validate_presence_of issue_id
67
+
68
+ normalize! params
69
+ # _merge_mime_type(:issue_comment, params)
70
+ filter! VALID_ISSUE_COMMENT_PARAM_NAME, params
71
+ assert_required_keys(%w[content], params)
72
+
73
+ post_request("/1.0/repositories/#{user}/#{repo.downcase}/issues/#{issue_id}/comments/", params)
74
+ end
75
+
76
+ # Edit a comment
77
+ #
78
+ # = Inputs
79
+ # <tt>:content</tt> Required string
80
+ #
81
+ # = Examples
82
+ # bitbucket = BitBucket.new
83
+ # bitbucket.issues.comments.edit 'user-name', 'repo-name', 'comment-id',
84
+ # "content" => 'a new comment'
85
+ #
86
+ def edit(user_name, repo_name, comment_id, params = {})
87
+ _update_user_repo_params(user_name, repo_name)
88
+ _validate_user_repo_params(user, repo) unless user? && repo?
89
+ _validate_presence_of comment_id
90
+
91
+ normalize! params
92
+ # _merge_mime_type(:issue_comment, params)
93
+ filter! VALID_ISSUE_COMMENT_PARAM_NAME, params
94
+ assert_required_keys(%w[content], params)
95
+
96
+ put_request("/1.0/repositories/#{user}/#{repo.downcase}/issues/comments/#{comment_id}", params)
97
+ end
98
+
99
+ # Delete a comment
100
+ #
101
+ # = Examples
102
+ # bitbucket = BitBucket.new
103
+ # bitbucket.issues.comments.delete 'user-name', 'repo-name', 'comment-id'
104
+ #
105
+ def delete(user_name, repo_name, comment_id, params = {})
106
+ _update_user_repo_params(user_name, repo_name)
107
+ _validate_user_repo_params(user, repo) unless user? && repo?
108
+ _validate_presence_of comment_id
109
+
110
+ normalize! params
111
+ # _merge_mime_type(:issue_comment, params)
112
+
113
+ delete_request("/1.0/repositories/#{user}/#{repo.downcase}/issues/comments/#{comment_id}", params)
114
+ end
115
+ end # Issues::Comments
116
+ end # BitBucket
@@ -0,0 +1,105 @@
1
+ # frozen_string_literal: true
2
+ module BitBucket
3
+ class Issues::Components < API
4
+ VALID_COMPONENT_INPUTS = %w[name].freeze
5
+
6
+ # Creates new Issues::Components API
7
+ def initialize(options = {})
8
+ super(options)
9
+ end
10
+
11
+ # List all components for a repository
12
+ #
13
+ # = Examples
14
+ # bitbucket = BitBucket.new :user => 'user-name', :repo => 'repo-name'
15
+ # bitbucket.issues.components.list
16
+ # bitbucket.issues.components.list { |component| ... }
17
+ #
18
+ def list(user_name, repo_name, params = {})
19
+ _update_user_repo_params(user_name, repo_name)
20
+ _validate_user_repo_params(user, repo) unless user? && repo?
21
+ normalize! params
22
+
23
+ response = get_request("/1.0/repositories/#{user}/#{repo.downcase}/issues/components", params)
24
+ return response unless block_given?
25
+
26
+ response.each { |el| yield el }
27
+ end
28
+ alias all list
29
+
30
+ # Get a single component
31
+ #
32
+ # = Examples
33
+ # bitbucket = BitBucket.new
34
+ # bitbucket.issues.components.find 'user-name', 'repo-name', 'component-id'
35
+ #
36
+ def get(user_name, repo_name, component_id, params = {})
37
+ _update_user_repo_params(user_name, repo_name)
38
+ _validate_user_repo_params(user, repo) unless user? && repo?
39
+ _validate_presence_of component_id
40
+ normalize! params
41
+
42
+ get_request("/1.0/repositories/#{user}/#{repo.downcase}/issues/components/#{component_id}", params)
43
+ end
44
+ alias find get
45
+
46
+ # Create a component
47
+ #
48
+ # = Inputs
49
+ # <tt>:name</tt> - Required string
50
+ #
51
+ # = Examples
52
+ # bitbucket = BitBucket.new :user => 'user-name', :repo => 'repo-name'
53
+ # bitbucket.issues.components.create :name => 'API'
54
+ #
55
+ def create(user_name, repo_name, params = {})
56
+ _update_user_repo_params(user_name, repo_name)
57
+ _validate_user_repo_params(user, repo) unless user? && repo?
58
+
59
+ normalize! params
60
+ filter! VALID_COMPONENT_INPUTS, params
61
+ assert_required_keys(VALID_COMPONENT_INPUTS, params)
62
+
63
+ post_request("/1.0/repositories/#{user}/#{repo.downcase}/issues/components", params)
64
+ end
65
+
66
+ # Update a component
67
+ #
68
+ # = Inputs
69
+ # <tt>:name</tt> - Required string
70
+ #
71
+ # = Examples
72
+ # @bitbucket = BitBucket.new
73
+ # @bitbucket.issues.components.update 'user-name', 'repo-name', 'component-id',
74
+ # :name => 'API'
75
+ #
76
+ def update(user_name, repo_name, component_id, params = {})
77
+ _update_user_repo_params(user_name, repo_name)
78
+ _validate_user_repo_params(user, repo) unless user? && repo?
79
+ _validate_presence_of component_id
80
+
81
+ normalize! params
82
+ filter! VALID_COMPONENT_INPUTS, params
83
+ assert_required_keys(VALID_COMPONENT_INPUTS, params)
84
+
85
+ put_request("/1.0/repositories/#{user}/#{repo.downcase}/issues/components/#{component_id}", params)
86
+ end
87
+ alias edit update
88
+
89
+ # Delete a component
90
+ #
91
+ # = Examples
92
+ # bitbucket = BitBucket.new
93
+ # bitbucket.issues.components.delete 'user-name', 'repo-name', 'component-id'
94
+ #
95
+ def delete(user_name, repo_name, component_id, params = {})
96
+ _update_user_repo_params(user_name, repo_name)
97
+ _validate_user_repo_params(user, repo) unless user? && repo?
98
+
99
+ _validate_presence_of component_id
100
+ normalize! params
101
+
102
+ delete_request("/1.0/repositories/#{user}/#{repo.downcase}/issues/components/#{component_id}", params)
103
+ end
104
+ end # Issues::Components
105
+ end # BitBucket
@@ -0,0 +1,105 @@
1
+ # frozen_string_literal: true
2
+ module BitBucket
3
+ class Issues::Milestones < API
4
+ VALID_MILESTONE_INPUTS = %w[
5
+ name
6
+ ].freeze # :nodoc:
7
+
8
+ # Creates new Issues::Milestones API
9
+ def initialize(options = {})
10
+ super(options)
11
+ end
12
+
13
+ # List milestones for a repository
14
+ #
15
+ # = Examples
16
+ # bitbucket = BitBucket.new :user => 'user-name', :repo => 'repo-name'
17
+ # bitbucket.issues.milestones.list
18
+ #
19
+ def list(user_name, repo_name, params = {})
20
+ _update_user_repo_params(user_name, repo_name)
21
+ _validate_user_repo_params(user, repo) unless user? && repo?
22
+
23
+ normalize! params
24
+
25
+ response = get_request("/1.0/repositories/#{user}/#{repo.downcase}/issues/milestones", params)
26
+ return response unless block_given?
27
+
28
+ response.each { |el| yield el }
29
+ end
30
+ alias all list
31
+
32
+ # Get a single milestone
33
+ #
34
+ # = Examples
35
+ # bitbucket = BitBucket.new
36
+ # bitbucket.issues.milestones.get 'user-name', 'repo-name', 'milestone-id'
37
+ #
38
+ def get(user_name, repo_name, milestone_id, params = {})
39
+ _update_user_repo_params(user_name, repo_name)
40
+ _validate_user_repo_params(user, repo) unless user? && repo?
41
+ _validate_presence_of milestone_id
42
+ normalize! params
43
+
44
+ get_request("/1.0/repositories/#{user}/#{repo.downcase}/issues/milestones/#{milestone_id}", params)
45
+ end
46
+ alias find get
47
+
48
+ # Create a milestone
49
+ #
50
+ # = Inputs
51
+ # <tt>:name</tt> - Required string
52
+ #
53
+ # = Examples
54
+ # bitbucket = BitBucket.new :user => 'user-name', :repo => 'repo-name'
55
+ # bitbucket.issues.milestones.create :name => 'hello-world'
56
+ #
57
+ def create(user_name, repo_name, params = {})
58
+ _update_user_repo_params(user_name, repo_name)
59
+ _validate_user_repo_params(user, repo) unless user? && repo?
60
+
61
+ normalize! params
62
+ filter! VALID_MILESTONE_INPUTS, params
63
+ assert_required_keys(%w[name], params)
64
+
65
+ post_request("/1.0/repositories/#{user}/#{repo.downcase}/issues/milestones", params)
66
+ end
67
+
68
+ # Update a milestone
69
+ #
70
+ # = Inputs
71
+ # <tt>:name</tt> - Required string
72
+ #
73
+ # = Examples
74
+ # bitbucket = BitBucket.new
75
+ # bitbucket.issues.milestones.update 'user-name', 'repo-name', 'milestone-id',
76
+ # :name => 'hello-world'
77
+ #
78
+ def update(user_name, repo_name, milestone_id, params = {})
79
+ _update_user_repo_params(user_name, repo_name)
80
+ _validate_user_repo_params(user, repo) unless user? && repo?
81
+ _validate_presence_of milestone_id
82
+
83
+ normalize! params
84
+ filter! VALID_MILESTONE_INPUTS, params
85
+ assert_required_keys(%w[name], params)
86
+
87
+ put_request("/1.0/repositories/#{user}/#{repo.downcase}/issues/milestones/#{milestone_id}", params)
88
+ end
89
+
90
+ # Delete a milestone
91
+ #
92
+ # = Examples
93
+ # bitbucket = BitBucket.new
94
+ # bitbucket.issues.milestones.delete 'user-name', 'repo-name', 'milestone-id'
95
+ #
96
+ def delete(user_name, repo_name, milestone_id, params = {})
97
+ _update_user_repo_params(user_name, repo_name)
98
+ _validate_user_repo_params(user, repo) unless user? && repo?
99
+ _validate_presence_of milestone_id
100
+ normalize! params
101
+
102
+ delete_request("/1.0/repositories/#{user}/#{repo.downcase}/issues/milestones/#{milestone_id}", params)
103
+ end
104
+ end # Issues::Milestones
105
+ end # BitBucket
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+ module BitBucket
3
+ # Deals with normalizing client supplied parameter keys.
4
+ module Normalizer
5
+ # Turns any keys from nested hashes including nested arrays into strings
6
+ #
7
+ def normalize!(params)
8
+ case params
9
+ when Hash
10
+ params.keys.each do |k|
11
+ params[k.to_s] = params.delete(k)
12
+ normalize!(params[k.to_s])
13
+ end
14
+ when Array
15
+ params.map! do |el|
16
+ normalize!(el)
17
+ end
18
+ else
19
+ params.to_s
20
+ end
21
+ params
22
+ end
23
+ end # Normalizer
24
+ end # BitBucket
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+ module BitBucket
3
+ # Allows you to specify parameters keys which will be preserved
4
+ # in parameters hash and its subhashes. Any keys from the nested
5
+ # hash that do not match will be removed.
6
+ module ParameterFilter
7
+ # Removes any keys from nested hashes that don't match predefiend keys
8
+ #
9
+ def filter!(keys, params, options = { recursive: true }) # :nodoc:
10
+ case params
11
+ when Hash
12
+ params.keys.each do |k, _v|
13
+ if keys.include?(k) || BitBucket::Validations::VALID_API_KEYS.include?(k)
14
+ filter!(keys, params[k]) if options[:recursive]
15
+ else
16
+ params.delete(k)
17
+ end
18
+ end
19
+ when Array
20
+ params.map! do |el|
21
+ filter!(keys, el) if options[:recursive]
22
+ end
23
+ else
24
+ params
25
+ end
26
+ params
27
+ end
28
+ end # Filter
29
+ end # BitBucket
@@ -0,0 +1,276 @@
1
+ # frozen_string_literal: true
2
+ module BitBucket
3
+ class Repos < API
4
+ extend AutoloadHelper
5
+
6
+ # Load all the modules after initializing Repos to avoid superclass mismatch
7
+ autoload_all 'bitbucket_rest_api/repos',
8
+ Changesets: 'changesets',
9
+ Keys: 'keys',
10
+ Services: 'services',
11
+ Following: 'following',
12
+ Sources: 'sources',
13
+ Forks: 'forks',
14
+ Commits: 'commits',
15
+ Download: 'download',
16
+ Webhooks: 'webhooks',
17
+ PullRequest: 'pull_request',
18
+ DefaultReviewers: 'default_reviewers',
19
+ Components: 'components'
20
+
21
+ DEFAULT_REPO_OPTIONS = {
22
+ 'website' => '',
23
+ 'is_private' => false,
24
+ 'has_issues' => false,
25
+ 'has_wiki' => false,
26
+ 'scm' => 'git',
27
+ 'no_public_forks' => false
28
+ }.freeze
29
+
30
+ VALID_REPO_OPTIONS = %w[
31
+ owner
32
+ name
33
+ description
34
+ website
35
+ is_private
36
+ has_issues
37
+ has_wiki
38
+ no_public_forks
39
+ language
40
+ scm
41
+ ].freeze
42
+
43
+ # Creates new Repositories API
44
+ def initialize(options = {})
45
+ super(options)
46
+ end
47
+
48
+ # Access to Repos::Commits API
49
+ def changesets
50
+ @changesets ||= ApiFactory.new 'Repos::Changesets'
51
+ end
52
+
53
+ # Access to Repos::Keys API
54
+ def keys
55
+ @keys ||= ApiFactory.new 'Repos::Keys'
56
+ end
57
+
58
+ # Access to Repos::Watchin API
59
+ def following
60
+ @following ||= ApiFactory.new 'Repos::Following'
61
+ end
62
+
63
+ # Access to Repos::Commits API
64
+ def sources
65
+ @sources ||= ApiFactory.new 'Repos::Sources'
66
+ end
67
+
68
+ # Access to Repos::Services API
69
+ def services
70
+ @services ||= ApiFactory.new 'Repos::Services'
71
+ end
72
+
73
+ def forks
74
+ @forks ||= ApiFactory.new 'Repos::Forks'
75
+ end
76
+
77
+ def commits
78
+ @commits ||= ApiFactory.new 'Repos::Commits'
79
+ end
80
+
81
+ def download
82
+ @download ||= ApiFactory.new 'Repos::Download'
83
+ end
84
+
85
+ # Access to Repos::PullRequests API
86
+ def pull_request
87
+ @pull_request ||= ApiFactory.new 'Repos::PullRequest'
88
+ end
89
+
90
+ def default_reviewers
91
+ @default_reviewers ||= ApiFactory.new 'Repos::DefaultReviewers'
92
+ end
93
+
94
+ def components
95
+ @components ||= ApiFactory.new 'Repos::Components'
96
+ end
97
+
98
+ def webhooks
99
+ @webhooks ||= ApiFactory.new 'Repos::Webhooks'
100
+ end
101
+
102
+ # List branches
103
+ #
104
+ # = Examples
105
+ #
106
+ # bitbucket = BitBucket.new
107
+ # bibucket.repos.branches 'user-name', 'repo-name'
108
+ #
109
+ # repos = BitBucket::Repos.new
110
+ # repos.branches 'user-name', 'repo-name'
111
+ #
112
+ def branches(user_name, repo_name, params = {})
113
+ _update_user_repo_params(user_name, repo_name)
114
+ _validate_user_repo_params(user, repo) unless user? && repo?
115
+ normalize! params
116
+
117
+ response = get_request("/1.0/repositories/#{user}/#{repo.downcase}/branches/", params)
118
+ return response unless block_given?
119
+
120
+ response.each { |el| yield el }
121
+ end
122
+
123
+ alias list_branches branches
124
+
125
+ # FIXME: 'POST a new repository' is a deprecated feature of the API
126
+ # Create a new repository for the authenticated user.
127
+ #
128
+ # = Parameters
129
+ # <tt>:name</tt> - Required string
130
+ # <tt>:description</tt> - Optional string
131
+ # <tt>:website</tt> - Optional string
132
+ # <tt>:is_private</tt> - Optional boolean - <tt>true</tt> to create a private repository, <tt>false</tt> to create a public one.
133
+ # <tt>:has_issues</tt> - Optional boolean - <tt>true</tt> to enable issues for this repository, <tt>false</tt> to disable them
134
+ # <tt>:has_wiki</tt> - Optional boolean - <tt>true</tt> to enable the wiki for this repository, <tt>false</tt> to disable it. Default is <tt>true</tt>
135
+ # <tt>:owner</tt> Optional string - The team in which this repository will be created
136
+ #
137
+ # = Examples
138
+ # bitbucket = BitBucket.new
139
+ # bitbucket.repos.create "name" => 'repo-name'
140
+ # "description": "This is your first repo",
141
+ # "website": "https://bitbucket.com",
142
+ # "is_private": false,
143
+ # "has_issues": true,
144
+ # "has_wiki": true
145
+ #
146
+ # Create a new repository in this team. The authenticated user
147
+ # must be a member of this team
148
+ #
149
+ # Examples:
150
+ # bitbucket = BitBucket.new :oauth_token => '...', :oauth_secret => '...'
151
+ # bitbucket.repos.create :name => 'repo-name', :owner => 'team-name'
152
+ #
153
+ def create(*args)
154
+ params = args.extract_options!
155
+ normalize! params
156
+ filter! VALID_REPO_OPTIONS + %w[org], params
157
+ assert_required_keys(%w[name], params)
158
+
159
+ # Requires authenticated user
160
+ post_request('/1.0/repositories/', DEFAULT_REPO_OPTIONS.merge(params))
161
+ end
162
+
163
+ # Edit a repository
164
+ #
165
+ # = Parameters
166
+ # * <tt>:name</tt> Required string
167
+ # * <tt>:description</tt> Optional string
168
+ # * <tt>:website</tt> Optional string
169
+ # * <tt>:private</tt> - Optional boolean - <tt>false</tt> to create public reps, <tt>false</tt> to create a private one
170
+ # * <tt>:has_issues</tt> Optional boolean - <tt>true</tt> to enable issues for this repository, <tt>false</tt> to disable them
171
+ # * <tt>:has_wiki</tt> Optional boolean - <tt>true</tt> to enable the wiki for this repository, <tt>false</tt> to disable it. Default is <tt>true</tt>
172
+ # * <tt>:has_downloads</tt> Optional boolean - <tt>true</tt> to enable downloads for this repository
173
+ #
174
+ # = Examples
175
+ #
176
+ # bitbucket = BitBucket.new
177
+ # bitbucket.repos.edit 'user-name', 'repo-name',
178
+ # :name => 'hello-world',
179
+ # :description => 'This is your first repo',
180
+ # :website => "https://bitbucket.com",
181
+ # :public => true, :has_issues => true
182
+ #
183
+ def edit(user_name, repo_name, params = {})
184
+ _update_user_repo_params(user_name, repo_name)
185
+ _validate_user_repo_params(user, repo) unless user? && repo?
186
+
187
+ normalize! params
188
+ filter! VALID_REPO_OPTIONS, params
189
+
190
+ put_request("/1.0/repositories/#{user}/#{repo.downcase}/", DEFAULT_REPO_OPTIONS.merge(params))
191
+ end
192
+
193
+ # Get a repository
194
+ #
195
+ # = Examples
196
+ # bitbucket = BitBucket.new
197
+ # bitbucket.repos.get 'user-name', 'repo-name'
198
+ #
199
+ def get(user_name, repo_name, params = {})
200
+ _update_user_repo_params(user_name, repo_name)
201
+ _validate_user_repo_params(user, repo) unless user? && repo?
202
+ normalize! params
203
+
204
+ get_request("/1.0/repositories/#{user}/#{repo.downcase}", params)
205
+ end
206
+
207
+ alias find get
208
+
209
+ # FIXME: 'DELETE an existing repository' is a deprecated feature of the API
210
+ # Delete a repository
211
+ #
212
+ # = Examples
213
+ # @bitbucket = BitBucket.new
214
+ # @bitbucket.repos.delete 'user-name', 'repo-name'
215
+ #
216
+ def delete(user_name, repo_name)
217
+ _update_user_repo_params(user_name, repo_name)
218
+ _validate_user_repo_params(user, repo) unless user? && repo?
219
+
220
+ delete_request("/1.0/repositories/#{user}/#{repo.downcase}")
221
+ end
222
+
223
+ # List repositories for the authenticated user
224
+ #
225
+ # = Examples
226
+ # bitbucket = BitBucket.new :oauth_token => '...', :oauth_secret => '...'
227
+ # bitbucket.repos.list
228
+ # bitbucket.repos.list { |repo| ... }
229
+ #
230
+ # List public repositories for the specified user.
231
+ #
232
+ # = Examples
233
+ # bitbucket = BitBucket.new
234
+ # bitbucket.repos.list :user => 'user-name', :role => 'owner'
235
+ # bitbucket.repos.list :user => 'user-name', { |repo| ... }
236
+ def list(*args)
237
+ params = args.extract_options!
238
+ normalize! params
239
+ _merge_user_into_params!(params) unless params.key?('user')
240
+ params.merge!('pagelen' => 100) unless params.key?('pagelen')
241
+
242
+ filter! %w[user role pagelen], params
243
+
244
+ response = get_request('/2.0/repositories', params)
245
+
246
+ response = response[:values]
247
+ return response unless block_given?
248
+
249
+ response.each { |el| yield el }
250
+ end
251
+
252
+ alias all list
253
+
254
+ # List tags
255
+ #
256
+ # = Examples
257
+ # bitbucket = BitBucket.new
258
+ # bitbucket.repos.tags 'user-name', 'repo-name'
259
+ # bitbucket.repos.tags 'user-name', 'repo-name' { |tag| ... }
260
+ #
261
+ def tags(user_name, repo_name, params = {})
262
+ _update_user_repo_params(user_name, repo_name)
263
+ _validate_user_repo_params(user, repo) unless user? && repo?
264
+ normalize! params
265
+
266
+ response = get_request("/1.0/repositories/#{user}/#{repo.downcase}/tags/", params)
267
+ return response unless block_given?
268
+
269
+ response.each { |el| yield el }
270
+ end
271
+
272
+ alias list_tags tags
273
+ alias repo_tags tags
274
+ alias repository_tags tags
275
+ end # Repos
276
+ end # BitBucket