lita-snap-ci 1.0.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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: ddb586b39cafbd3a068d285725ef323ca321e38b
4
+ data.tar.gz: 724efdc826a385ba9daed8599aa803f3f8d4411d
5
+ SHA512:
6
+ metadata.gz: dcb9956c0ca47defa2bdc96144e7fd2f0f481a27230e46979f76860da8f5dac9fe967182089ea6e2393649f528bcb366ddea5b19bca799f685785ed69ffccc80
7
+ data.tar.gz: ee38d9a0f1cab171177995fce11b7f9302f5b99a353a46105ee19ff8cd0d06c3bb456abf13a9a0db754a04a6a1b64480a0f52cd22ba04cf7bafdad0b4e7d2d2b
@@ -0,0 +1,19 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ lita_config.rb
19
+ .byebug_history
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source "https://rubygems.org"
2
+
3
+ gemspec
@@ -0,0 +1,87 @@
1
+ # lita-snap-ci
2
+
3
+ Reports from [snap-ci]('https://snap-ci.com/'). [![Build Status](https://snap-ci.com/groteck/lita-snap-ci/branch/master/build_image)](https://snap-ci.com/groteck/lita-snap-ci/branch/master)
4
+
5
+ ## Installation
6
+
7
+ Add lita-snap-ci to your Lita instance's Gemfile:
8
+
9
+ ``` ruby
10
+ gem "lita-snap-ci"
11
+ ```
12
+
13
+ ## Configuration
14
+
15
+ Information that you need:
16
+
17
+ * [api-key from Snap-ci](https://snap-ci.com/settings/api_key)
18
+ * snap-ci username
19
+ * projects info
20
+
21
+ Configure your `lita-config.rb`.
22
+
23
+ Example:
24
+
25
+ ```
26
+ config.handlers.snap_ci.user = "snapUser"
27
+ config.handlers.snap_ci.token = "Snap-ci-api-key"
28
+ config.handlers.snap_ci.projects = [
29
+ {
30
+ owner: 'oneorg',
31
+ repository: 'api',
32
+ branches: ['development', 'staging', 'master']
33
+ },{
34
+ owner: 'oneorg',
35
+ repository: 'front',
36
+ branches: ['staging', 'master']
37
+ },{
38
+ owner: 'otherorg',
39
+ repository: 'websites',
40
+ branches: ['develop' , 'master']
41
+ }
42
+ ]
43
+ ```
44
+
45
+ ## Usage
46
+
47
+ ### Display the status of your repositories.
48
+
49
+ Chat input:
50
+
51
+ `snap-ci report`
52
+
53
+ Chat output:
54
+
55
+ ```
56
+ Project: otherorg/websites:
57
+ develop: failed (Test: failed)
58
+ master: failed (Test: failed)
59
+
60
+ Project: oneorg/front:
61
+ staging: passed (TEST: passed, deploy_staging: passed)
62
+ master: passed (TEST: passed, deploy_prod: passed)
63
+
64
+ Project: oneorg/api:
65
+ development: passed (Integration: passed, Brakeman: passed)
66
+ staging: passed (Integration: passed, deploy_staging: passed)
67
+ master: passed (FastFeedback: passed, Integration: passed, deploy_prod: unknown)
68
+ ```
69
+
70
+ ### Display the status of one repository.
71
+
72
+ Chat input:
73
+
74
+ `snap-ci project api` or `snap-ci project oneorg/api`
75
+
76
+ Chat output:
77
+
78
+ ```
79
+ Project: oneorg/api:
80
+ development: passed (Integration: passed, Brakeman: passed)
81
+ staging: passed (Integration: passed, deploy_staging: passed)
82
+ master: passed (FastFeedback: passed, Integration: passed, deploy_prod: unknown)
83
+ ```
84
+
85
+ ## License
86
+
87
+ lita-snap-ci is released under the [MIT License](http://www.opensource.org/licenses/MIT).
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task default: :spec
@@ -0,0 +1,12 @@
1
+ require "lita"
2
+
3
+ Lita.load_locales Dir[File.expand_path(
4
+ File.join("..", "..", "locales", "*.yml"), __FILE__
5
+ )]
6
+
7
+ require "lita/handlers/snap_ci"
8
+
9
+ Lita::Handlers::SnapCi.template_root File.expand_path(
10
+ File.join("..", "..", "templates"),
11
+ __FILE__
12
+ )
@@ -0,0 +1,45 @@
1
+ require_relative '../../snap_ci'
2
+
3
+ module Lita
4
+ module Handlers
5
+ class SnapCi < Handler
6
+ config :user, type: String, required: true
7
+ config :token, type: String, required: true
8
+ config :projects, type: Array, required: true
9
+
10
+ route(/^snap-ci\s+report$/,
11
+ :all_projects,
12
+ help: { t('report.command') => t('report.desc') })
13
+
14
+ def all_projects(response)
15
+ response.reply ::SnapCi::ProjectList.new(config).to_message
16
+ end
17
+
18
+ route(/^snap-ci\s+project\s+(.+)$/,
19
+ :project,
20
+ help: { t('project.command') => t('project.desc') })
21
+
22
+ # Return the first match, for an exact match use owner/repository format
23
+ def project(response)
24
+ format = if response.args[1].slice("/").nil?
25
+ :repo
26
+ else
27
+ :owner
28
+ end
29
+
30
+ project_arg = config.projects.detect do |project|
31
+ if format == :owner
32
+ project[:owner] == response.args[1].partition("/").first &&
33
+ project[:repository] == response.args[1].partition("/").last
34
+ else
35
+ project[:repository] == response.args[1]
36
+ end
37
+ end
38
+
39
+ response.reply ::SnapCi::Project.new(project_arg, config).to_message
40
+ end
41
+
42
+ Lita.register_handler(self)
43
+ end
44
+ end
45
+ end
@@ -0,0 +1 @@
1
+ Dir[File.dirname(__FILE__) + '/snap_ci/**/*.rb'].each { |file| require file }
@@ -0,0 +1,20 @@
1
+ require 'faraday'
2
+
3
+ module SnapCi
4
+ class Http
5
+ URL = 'https://api.snap-ci.com'
6
+
7
+ def initialize(config)
8
+ @http = Faraday.new(url: URL) do |conection|
9
+ conection.basic_auth(config.user, config.token)
10
+ conection.headers['Content-Type'] = 'text/plain'
11
+ conection.headers['Accept'] = 'application/vnd.snap-ci.com.v1+json'
12
+ conection.adapter Faraday.default_adapter
13
+ end
14
+ end
15
+
16
+ def get(parameters = '')
17
+ @http.get(parameters)
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,16 @@
1
+ require 'multi_json'
2
+
3
+ module SnapCi
4
+ class Parser
5
+ def initialize(response)
6
+ @pipeline = MultiJson.load(response.body)['_embedded']['pipelines'].last
7
+ end
8
+
9
+ def to_parameters
10
+ {
11
+ status: @pipeline['result'],
12
+ steps: @pipeline['stages']
13
+ }
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,63 @@
1
+ require_relative 'http'
2
+ require_relative 'parser'
3
+
4
+ module SnapCi
5
+ class Project
6
+ attr_reader :owner, :repository, :branches
7
+
8
+ def initialize(args, config)
9
+ @owner = args[:owner]
10
+ @repository = args[:repository]
11
+ @branches = args[:branches]
12
+ @http = Http.new(config)
13
+ end
14
+
15
+ def to_message
16
+ "Project: #{owner}/#{repository}:\n" + pipelines_to_s
17
+ end
18
+
19
+ private
20
+
21
+ def fetch_pipelines
22
+ pipelines = {}
23
+ mutex = Mutex.new
24
+
25
+ uris.map do |uri|
26
+ Thread.new do
27
+ pipeline = @http.get(uri[:path])
28
+ mutex.synchronize { pipelines[uri[:branch]] = pipeline }
29
+ end
30
+ end.each(&:join)
31
+
32
+ pipelines
33
+ end
34
+
35
+ def pipelines_to_s
36
+ pipelines = []
37
+
38
+ fetch_pipelines.each do |branch, pipeline|
39
+ parameters = Parser.new(pipeline).to_parameters
40
+ pipelines << pipeline_to_s(branch, parameters)
41
+ end
42
+
43
+ pipelines.join("\n")
44
+ end
45
+
46
+ def pipeline_to_s(branch, parameters)
47
+ " #{branch}: #{parameters[:status]} (#{steps_to_s(parameters[:steps])})"
48
+ end
49
+
50
+ def steps_to_s(steps)
51
+ steps.map { |step| "#{step["name"]}: #{step["result"]}" }.join(", ")
52
+ end
53
+
54
+ def uris
55
+ branches.map do |branch|
56
+ {
57
+ branch: branch,
58
+ path: "/project/#{owner}/#{repository}/branch/#{branch}/pipelines"
59
+ }
60
+ end
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,23 @@
1
+ require_relative 'project'
2
+
3
+ module SnapCi
4
+ class ProjectList
5
+ attr_reader :list
6
+
7
+ def initialize(args)
8
+ @list = []
9
+ mutex = Mutex.new
10
+
11
+ args.projects.map do |project_info|
12
+ Thread.new do
13
+ project_message = Project.new(project_info, args).to_message
14
+ mutex.synchronize { @list << project_message }
15
+ end
16
+ end.each(&:join)
17
+ end
18
+
19
+ def to_message
20
+ list.join("\n\n")
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,25 @@
1
+ Gem::Specification.new do |spec|
2
+ spec.name = "lita-snap-ci"
3
+ spec.version = "1.0.0"
4
+ spec.authors = ["Juan Fraire"]
5
+ spec.email = ["groteck@gmail.com"]
6
+ spec.description = "Snap-ci integration with lita"
7
+ spec.summary = "Lita , Snap-ci, ChatOps"
8
+ spec.homepage = "https://github.com/groteck/lita-snap-ci"
9
+ spec.license = "MIT"
10
+ spec.metadata = { "lita_plugin_type" => "handler" }
11
+
12
+ spec.files = `git ls-files`.split($/)
13
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
14
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
15
+ spec.require_paths = ["lib"]
16
+
17
+ spec.add_runtime_dependency "lita", ">= 4.7"
18
+
19
+ spec.add_development_dependency "bundler", "~> 1.3"
20
+ spec.add_development_dependency "pry-byebug"
21
+ spec.add_development_dependency "rake"
22
+ spec.add_development_dependency "rack-test"
23
+ spec.add_development_dependency "webmock"
24
+ spec.add_development_dependency "rspec", ">= 3.0.0"
25
+ end
@@ -0,0 +1,10 @@
1
+ en:
2
+ lita:
3
+ handlers:
4
+ snap_ci:
5
+ report:
6
+ command: snap-ci report
7
+ desc: display a general report, with all the branches and status per project
8
+ project:
9
+ command: snap-ci status <owner>/<repo> or <repo>
10
+ desc: display a single project report with all the branches and status
@@ -0,0 +1,107 @@
1
+ {
2
+ "_links": {
3
+ "self": {
4
+ "href": ""
5
+ },
6
+ "previous": {
7
+ "href": ""
8
+ },
9
+ "latest": {
10
+ "href": ""
11
+ },
12
+ "oldest": {
13
+ "href": ""
14
+ }
15
+ },
16
+ "_embedded": {
17
+ "pipelines": [
18
+ {
19
+ "_links": {
20
+ "self": {
21
+ "href": ""
22
+ },
23
+ "latest": {
24
+ "href": ""
25
+ },
26
+ "oldest": {
27
+ "href": ""
28
+ },
29
+ "previous": {
30
+ "href": ""
31
+ },
32
+ "next": {
33
+ "href": ""
34
+ },
35
+ "docs": {
36
+ "href": ""
37
+ }
38
+ },
39
+ "counter": 177,
40
+ "result": "passed",
41
+ "commits": [
42
+ {
43
+ "_links": {
44
+ "github": [
45
+ {
46
+ "rel": "api",
47
+ "href": ""
48
+ },
49
+ {
50
+ "rel": "http",
51
+ "href": ""
52
+ }
53
+ ]
54
+ },
55
+ "sha": "02a8b141f57640c545043f5ede86f26ab4b32b3d",
56
+ "short_sha": "02a8b14",
57
+ "author": "",
58
+ "message": "",
59
+ "time": "2016-05-19T09:43:56Z"
60
+ }
61
+ ],
62
+ "stages": [
63
+ {
64
+ "name": "Integration",
65
+ "full_name": "zenmate/api (development) :: Integration",
66
+ "result": "passed",
67
+ "duration": 119,
68
+ "workers": [
69
+ {
70
+ "counter": 1,
71
+ "result": "passed",
72
+ "duration": 93.09199094772339,
73
+ "artifacts": [
74
+
75
+ ],
76
+ "started_at": "2016-05-19T09:44:40Z",
77
+ "completed_at": "2016-05-19T09:46:13Z"
78
+ }
79
+ ],
80
+ "started_at": "2016-05-19T09:44:15Z",
81
+ "completed_at": "2016-05-19T09:46:14Z"
82
+ },
83
+ {
84
+ "name": "Brakeman",
85
+ "full_name": "oneorg/api (development) :: Brakeman",
86
+ "result": "passed",
87
+ "duration": 47,
88
+ "workers": [
89
+ {
90
+ "counter": 1,
91
+ "result": "passed",
92
+ "duration": 44.53549098968506,
93
+ "artifacts": [
94
+
95
+ ],
96
+ "started_at": "2016-05-19T09:46:16Z",
97
+ "completed_at": "2016-05-19T09:47:01Z"
98
+ }
99
+ ],
100
+ "started_at": "2016-05-19T09:46:15Z",
101
+ "completed_at": "2016-05-19T09:47:02Z"
102
+ }
103
+ ]
104
+ }
105
+ ]
106
+ }
107
+ }