find-circle-yml 0.1.0

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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: ad3e5216155d142793a5985488898882306bea77
4
+ data.tar.gz: 77b09f85bcdefff11c3ab35e48446d51cfe801f0
5
+ SHA512:
6
+ metadata.gz: d63eefc0c6a60da841c4c9a588d5dd37efecd324fa915828be9a92d42b9aea811080b88f854d1910770420012ddb5310abc35bc2f73eb632b8e5b836df038e35
7
+ data.tar.gz: 843965e38d1edf5440fe9dc0890f1d31f45def0ac47e94090462b694134996b352fcf0179be6495c9c2aad87ae6a76f3f9b690783786e1675dd1eb317adad9d3
data/README.md ADDED
@@ -0,0 +1,53 @@
1
+ # find-circle-yml
2
+
3
+ A command-line tool for finding which repositories in your GitHub organization or Bitbucket team have `circle.yml` configuration files.
4
+
5
+ ## Installation
6
+
7
+ $ gem install find-circle-yml
8
+
9
+ ## Usage
10
+
11
+ **GitHub**
12
+
13
+ $ GITHUB_ORGANIZATION=<your github org> GITHUB_USER=<your github user> GITHUB_ACCESS_TOKEN=<your personal access token> find-circle-yml
14
+ https://github.com/your-org/your-repo/blob/master/circle.yml
15
+ https://github.com/your-org/another-repo/blob/master/circle.yml
16
+
17
+ **Bitbucket**
18
+
19
+ $ BITBUCKET_TEAM=<your bitbucket team> BITBUCKET_USER=<your bitbucket user> BITBUCKET_APP_PASSWORD=<your bitbucket password> find-circle-yml
20
+ https://bitbucket.org/your-team/your-repo/src/bb030e9dcee6218d0ce521b7312e60e5cc5db4a3/circle.yml
21
+ https://bitbucket.org/your-team/another-repo/src/cf9f1078be258dd902ff49718e5ee5422e2dd08f/circle.yml
22
+
23
+ Writes a list of repositories that contain a `circle.yml` to standard out.
24
+
25
+ ## Authorization
26
+
27
+ Authorization requires creating an app-specific password for your platform:
28
+
29
+ **GitHub**
30
+
31
+ See [the docs for creating a personal access token](https://help.github.com/articles/creating-a-personal-access-token-for-the-command-line/). Ensure that the token has the **repo** and **read:org** scope. Use the token as the value of `GITHUB_ACCESS_TOKEN` environment variable.
32
+
33
+ **Bitbucket**
34
+
35
+ See [the docs for creating an app password](https://confluence.atlassian.com/bitbucket/app-passwords-828781300.html). Ensure that the app password has the **Team membership Read** and **Repositories Read** permissions. Use the app password as the value of `BITBUCKET_APP_PASSWORD` environment variable.
36
+
37
+ ## Development
38
+
39
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
40
+
41
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
42
+
43
+ ## Contributing
44
+
45
+ Bug reports and pull requests are welcome on GitHub at https://github.com/circleci/find-circle-yml. 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.
46
+
47
+ ## License
48
+
49
+ The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
50
+
51
+ ## Code of Conduct
52
+
53
+ Everyone interacting in the circleci-audit project is expected to follow the [code of conduct](https://github.com/CircleCI-Public/find-circle-yml/blob/master/CODE_OF_CONDUCT.md).
@@ -0,0 +1,28 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require 'find_circle_yml'
5
+
6
+ provided_configurations = [
7
+ FindCircleYml::Bitbucket::Configuration.new(ENV),
8
+ FindCircleYml::GitHub::Configuration.new(ENV)
9
+ ].select(&:provided?)
10
+
11
+ if provided_configurations.empty?
12
+ STDERR.puts 'Provide a Bitbucket or GitHub configuration'
13
+ exit 1
14
+ end
15
+
16
+ provided_configurations.each do |configuration|
17
+ if configuration.valid?
18
+ service = configuration.service
19
+ service.repositories.each do |repository|
20
+ if (configuration_file = service.configuration_file(repository))
21
+ puts configuration_file.url
22
+ end
23
+ end
24
+ else
25
+ STDERR.puts configuration.error_message
26
+ exit 1
27
+ end
28
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'octokit'
4
+ require 'net/http'
5
+ require 'uri'
6
+ require 'json'
7
+
8
+ require 'find_circle_yml/repository'
9
+ require 'find_circle_yml/configuration_file'
10
+ require 'find_circle_yml/github/service'
11
+ require 'find_circle_yml/github/configuration'
12
+ require 'find_circle_yml/bitbucket/configuration'
13
+ require 'find_circle_yml/bitbucket/service'
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ module FindCircleYml
4
+ module Bitbucket
5
+ class Configuration
6
+ ENVIRONMENT_VARIABLES = %w[
7
+ BITBUCKET_USER
8
+ BITBUCKET_APP_PASSWORD
9
+ BITBUCKET_TEAM
10
+ ].freeze
11
+
12
+ attr_reader :environment
13
+
14
+ def initialize(environment)
15
+ @environment = environment
16
+ end
17
+
18
+ def provided?
19
+ ENVIRONMENT_VARIABLES.any? do |environment_variable|
20
+ environment.key?(environment_variable)
21
+ end
22
+ end
23
+
24
+ def valid?
25
+ missing.empty?
26
+ end
27
+
28
+ def error_message
29
+ "Set environment variables: #{missing.join(', ')}"
30
+ end
31
+
32
+ def service
33
+ Bitbucket::Service.new(
34
+ environment.fetch('BITBUCKET_USER'),
35
+ environment.fetch('BITBUCKET_APP_PASSWORD'),
36
+ environment.fetch('BITBUCKET_TEAM')
37
+ )
38
+ end
39
+
40
+ private
41
+
42
+ def missing
43
+ ENVIRONMENT_VARIABLES.reject do |environment_variable|
44
+ environment.key?(environment_variable)
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+
3
+ module FindCircleYml
4
+ module Bitbucket
5
+ class Service
6
+ attr_reader :user, :password, :team
7
+
8
+ def initialize(user, password, team)
9
+ @user = user
10
+ @password = password
11
+ @team = team
12
+ end
13
+
14
+ def repositories
15
+ Enumerator.new do |y|
16
+ url = "/repositories/#{team}"
17
+ loop do
18
+ response = request(url)
19
+ parsed_response = JSON.parse(response.body)
20
+ parsed_response.fetch('values', []).each do |value|
21
+ y << Repository.new(
22
+ value.fetch('full_name'),
23
+ value.dig('mainbranch', 'branch') || 'master',
24
+ value.fetch('links').fetch('html').fetch('href')
25
+ )
26
+ end
27
+ break unless parsed_response.key?('next')
28
+ url = parsed_response.fetch('next')
29
+ end
30
+ end
31
+ end
32
+
33
+ def configuration_file(repository)
34
+ response = request("/repositories/#{repository.name}/src/#{repository.main_branch}/circle.yml?format=meta")
35
+ return unless response.code == '200'
36
+ parsed_response = JSON.parse(response.body)
37
+ commit = parsed_response.fetch('commit', {}).fetch('hash', repository.main_branch)
38
+ path = parsed_response.fetch('path')
39
+ ConfigurationFile.new("#{repository.url}/src/#{commit}/#{path}")
40
+ end
41
+
42
+ private
43
+
44
+ def request(path)
45
+ uri = URI("https://api.bitbucket.org/2.0#{path}")
46
+ Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
47
+ request = Net::HTTP::Get.new(uri)
48
+ request.basic_auth(user, password)
49
+ http.request request
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module FindCircleYml
4
+ ConfigurationFile = Struct.new(:url)
5
+ end
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ module FindCircleYml
4
+ module GitHub
5
+ class Configuration
6
+ ENVIRONMENT_VARIABLES = %w[
7
+ GITHUB_USER
8
+ GITHUB_ACCESS_TOKEN
9
+ GITHUB_ORGANIZATION
10
+ ].freeze
11
+
12
+ attr_reader :environment
13
+
14
+ def initialize(environment)
15
+ @environment = environment
16
+ end
17
+
18
+ def provided?
19
+ ENVIRONMENT_VARIABLES.any? do |environment_variable|
20
+ environment.key?(environment_variable)
21
+ end
22
+ end
23
+
24
+ def valid?
25
+ missing.empty?
26
+ end
27
+
28
+ def error_message
29
+ "Set environment variables: #{missing.join(', ')}"
30
+ end
31
+
32
+ def service
33
+ GitHub::Service.new(
34
+ environment.fetch('GITHUB_USER'),
35
+ environment.fetch('GITHUB_ACCESS_TOKEN'),
36
+ environment.fetch('GITHUB_ORGANIZATION')
37
+ )
38
+ end
39
+
40
+ private
41
+
42
+ def missing
43
+ ENVIRONMENT_VARIABLES.reject do |environment_variable|
44
+ environment.key?(environment_variable)
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ module FindCircleYml
4
+ module GitHub
5
+ class Service
6
+ attr_reader :user, :access_token, :organization
7
+
8
+ def initialize(user, access_token, organization)
9
+ @user = user
10
+ @access_token = access_token
11
+ @organization = organization
12
+ end
13
+
14
+ def repositories
15
+ client.organization_repositories(organization).map do |response|
16
+ Repository.new(
17
+ response[:full_name],
18
+ response[:default_branch],
19
+ response[:html_url]
20
+ )
21
+ end
22
+ end
23
+
24
+ def configuration_file(repository)
25
+ ConfigurationFile.new(
26
+ client.contents(repository.name, path: 'circle.yml')[:html_url]
27
+ )
28
+ rescue Octokit::NotFound
29
+ nil
30
+ end
31
+
32
+ private
33
+
34
+ def client
35
+ Octokit.auto_paginate = true
36
+ Octokit::Client.new(login: user, password: access_token)
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module FindCircleYml
4
+ Repository = Struct.new(:name, :main_branch, :url)
5
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module FindCircleYml
4
+ VERSION = '0.1.0'
5
+ end
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ $LOAD_PATH.unshift File.expand_path('../lib', __dir__)
4
+ require 'find_circle_yml'
5
+
6
+ require 'minitest/autorun'
metadata ADDED
@@ -0,0 +1,115 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: find-circle-yml
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - nwjsmith
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2018-03-14 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: minitest
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '='
32
+ - !ruby/object:Gem::Version
33
+ version: 5.11.3
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '='
39
+ - !ruby/object:Gem::Version
40
+ version: 5.11.3
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '='
46
+ - !ruby/object:Gem::Version
47
+ version: 12.3.0
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '='
53
+ - !ruby/object:Gem::Version
54
+ version: 12.3.0
55
+ - !ruby/object:Gem::Dependency
56
+ name: octokit
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ description: |2
70
+ A command-line tool for finding which repositories in your GitHub
71
+ organization or Bitbucket team have circle.yml configuration files.
72
+ email:
73
+ - sayhi@circleci.com
74
+ executables:
75
+ - find-circle-yml
76
+ extensions: []
77
+ extra_rdoc_files: []
78
+ files:
79
+ - README.md
80
+ - exe/find-circle-yml
81
+ - lib/find_circle_yml.rb
82
+ - lib/find_circle_yml/bitbucket/configuration.rb
83
+ - lib/find_circle_yml/bitbucket/service.rb
84
+ - lib/find_circle_yml/configuration_file.rb
85
+ - lib/find_circle_yml/github/configuration.rb
86
+ - lib/find_circle_yml/github/service.rb
87
+ - lib/find_circle_yml/repository.rb
88
+ - lib/find_circle_yml/version.rb
89
+ - test/test_helper.rb
90
+ homepage: https://github.com/CircleCI-Public/find-circle-yml
91
+ licenses:
92
+ - MIT
93
+ metadata: {}
94
+ post_install_message:
95
+ rdoc_options: []
96
+ require_paths:
97
+ - lib
98
+ required_ruby_version: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - ">="
101
+ - !ruby/object:Gem::Version
102
+ version: 2.4.0
103
+ required_rubygems_version: !ruby/object:Gem::Requirement
104
+ requirements:
105
+ - - ">="
106
+ - !ruby/object:Gem::Version
107
+ version: '0'
108
+ requirements: []
109
+ rubyforge_project:
110
+ rubygems_version: 2.6.13
111
+ signing_key:
112
+ specification_version: 4
113
+ summary: Finds circle.yml files
114
+ test_files:
115
+ - test/test_helper.rb