avmtrf1-tools 0.4.0 → 0.5.0

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: a1a4ef4f8d57d9aa000216c4f531d4c531a220632b8c09e43f90cf9465c1b5a8
4
- data.tar.gz: 6276b7f1bb63b64447f19f8c25c0de1cdea1880a8020b3a9f62c224fdb873b1a
3
+ metadata.gz: 2d8d6c82baf32fce3a7b2cd8e524019d91de52e3d7df1396e8e7e5017177310d
4
+ data.tar.gz: 2816f7f03a19c4b87c076beda3ef0ba9330799a9e0ce2a2589a2ea773457594a
5
5
  SHA512:
6
- metadata.gz: 62fb2aaf5b5b3131e05e1e574c556f43a3e61913fa7b6eee4fcd55ec2834f4a40ab43de43ef921674f22eb9f9fa21caf1b5da8a3234716aed47f9799012c6e7c
7
- data.tar.gz: 41238e7ba019f46891bfe962b8df8d260e947e3dfc838e374def7922da42c63a8ac6dee9ff829ec77adf99d6432510f7ea3ee6fc49f6fc5d71b4a18c4b32c694
6
+ metadata.gz: 54b6265302b285dfb26724fad9ba7243e2838437ad95dc59e27290df16deb7b04db47414c110d704ff58892026d674d272108bf4e4524852369097f2eddfd08c
7
+ data.tar.gz: 7a041075a270a408e89bce071c2af63b3c374ba759d16be55b8529b5da080631ea7ddfa48bc51993cbb5fa24da38aebb9c67c634977821d450d60f3ebf9fceb7
@@ -4,9 +4,14 @@ module Avmtrf1
4
4
  require 'avmtrf1/active_directory'
5
5
  require 'avmtrf1/ad_user'
6
6
  require 'avmtrf1/configs'
7
+ require 'avmtrf1/default_jira'
8
+ require 'avmtrf1/git'
7
9
  require 'avmtrf1/ini'
10
+ require 'avmtrf1/issues'
11
+ require 'avmtrf1/jira'
8
12
  require 'avmtrf1/oracle'
9
13
  require 'avmtrf1/patches'
10
14
  require 'avmtrf1/red'
15
+ require 'avmtrf1/result'
11
16
  require 'avmtrf1/tools'
12
17
  end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'avmtrf1/jira/instance'
4
+
5
+ module Avmtrf1
6
+ DEFAULT_JIRA_PATH_PREFIX = 'default.jira'
7
+
8
+ class << self
9
+ def default_jira
10
+ @default_jira ||= ::Avmtrf1::Jira::Instance.new(
11
+ 'https://jira.engesoftware.com.br',
12
+ ::Avmtrf1.configs.read_entry("#{DEFAULT_JIRA_PATH_PREFIX}.username"),
13
+ ::Avmtrf1.configs.read_password("#{DEFAULT_JIRA_PATH_PREFIX}.password")
14
+ )
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Avmtrf1
4
+ module Git
5
+ require 'avmtrf1/git/cached_repository'
6
+ require 'avmtrf1/git/issue_on_repository'
7
+ require 'avmtrf1/git/reference'
8
+ end
9
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_launcher/git/base'
4
+
5
+ module Avmtrf1
6
+ module Git
7
+ class CachedRepository < ::EacLauncher::Git::Base
8
+ attr_reader :url
9
+
10
+ def initialize(url)
11
+ @url = url
12
+ super local_path
13
+ init
14
+ assert_remote_url('origin', url)
15
+ system!('fetch', 'origin', '-pPt')
16
+ end
17
+
18
+ private
19
+
20
+ def local_path
21
+ r = ::File.join(ENV['HOME'], '.cache', 'git_cached_repositories', url.parameterize)
22
+ ::FileUtils.mkdir_p(::File.dirname(r))
23
+ r
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,100 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/console/speaker'
4
+ require 'eac_ruby_utils/simple_cache'
5
+ require 'avmtrf1/result'
6
+
7
+ module Avmtrf1
8
+ module Git
9
+ class IssueOnRepository
10
+ include ::EacRubyUtils::Console::Speaker
11
+ include ::EacRubyUtils::SimpleCache
12
+
13
+ CHECKS = %w[no_branch_nor_tag branch_and_tag issue_not_found issue_closed_git_open
14
+ issue_open_git_closed issue_open_git_open issue_closed_git_closed].freeze
15
+
16
+ def initialize(issue_id, refs)
17
+ @issue_id = issue_id
18
+ @refs = refs
19
+ end
20
+
21
+ def check
22
+ infov issue_id, "#{result.label} [#{issue ? issue.status_name : '-'}]"
23
+ end
24
+
25
+ private
26
+
27
+ attr_reader :issue_id, :refs
28
+
29
+ def result_uncached
30
+ CHECKS.each do |check|
31
+ result = send("#{check}_check")
32
+ return result if result
33
+ end
34
+ ::Avmtrf1::Result.error('condição não encontrada')
35
+ end
36
+
37
+ def no_branch_nor_tag_check
38
+ return nil unless branch_ref.blank? && tag_ref.blank?
39
+
40
+ ::Avmtrf1::Result.error("nem branch nem tag encontrado com o nome \"#{issue_id}\"")
41
+ end
42
+
43
+ def branch_and_tag_check
44
+ return nil unless branch_ref.present? && tag_ref.present?
45
+
46
+ ::Avmtrf1::Result.error("há uma branch e uma tag com o nome \"#{issue_id}\"")
47
+ end
48
+
49
+ def issue_not_found_check
50
+ return nil if issue.present?
51
+
52
+ if tag_ref.present?
53
+ ::Avmtrf1::Result.ok('demanda não encontrada e Git fechado')
54
+ else
55
+ ::Avmtrf1::Result.error('demanda não encontrada e Git aberto')
56
+ end
57
+ end
58
+
59
+ def issue_closed_git_open_check
60
+ return nil unless issue.closed? && !git_closed?
61
+
62
+ ::Avmtrf1::Result.error('demanda fechada e Git aberto')
63
+ end
64
+
65
+ def issue_open_git_closed_check
66
+ return nil unless !issue.closed? && git_closed?
67
+
68
+ ::Avmtrf1::Result.error('demanda aberta e Git fechado')
69
+ end
70
+
71
+ def issue_open_git_open_check
72
+ return nil unless !issue.closed? && !git_closed?
73
+
74
+ ::Avmtrf1::Result.ok('demanda aberta e Git aberto')
75
+ end
76
+
77
+ def issue_closed_git_closed_check
78
+ return nil unless issue.closed? && git_closed?
79
+
80
+ ::Avmtrf1::Result.ok('demanda fechada e Git fechado')
81
+ end
82
+
83
+ def git_closed?
84
+ tag_ref.present?
85
+ end
86
+
87
+ def branch_ref_uncached
88
+ refs.find { |ref| ref.type == 'head' }
89
+ end
90
+
91
+ def tag_ref_uncached
92
+ refs.find { |ref| ref.type == 'tag' }
93
+ end
94
+
95
+ def issue_uncached
96
+ ::AvmTrf1::IssueFactory.find(issue_id)
97
+ end
98
+ end
99
+ end
100
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'ostruct'
4
+
5
+ module Avmtrf1
6
+ module Git
7
+ class Reference
8
+ include ::EacRubyUtils::SimpleCache
9
+
10
+ attr_reader :revision, :fullname
11
+
12
+ def initialize(git, fullname, revision)
13
+ @git = git
14
+ @fullname = fullname
15
+ @revision = revision
16
+ end
17
+
18
+ def type_uncached
19
+ parsed_fullname.type
20
+ end
21
+
22
+ def name
23
+ parsed_fullname.name
24
+ end
25
+
26
+ private
27
+
28
+ def parsed_fullname_uncached
29
+ m = %r{\Arefs/([^/]+)s/(.+)\z}.match(fullname)
30
+ return ::OpenStruct.new(name: m[2], type: m[1]) if m
31
+
32
+ raise "\"#{fullname}\" not match ref pattern"
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Avmtrf1
4
+ module Issues
5
+ require 'avmtrf1/issues/factory'
6
+ end
7
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'avmtrf1/default_jira'
4
+
5
+ module AvmTrf1
6
+ class IssueFactory
7
+ class << self
8
+ def find(issue_id)
9
+ factories.each do |factory|
10
+ issue = factory.find_issue(issue_id)
11
+ return issue if issue
12
+ end
13
+ nil
14
+ end
15
+
16
+ def factories
17
+ [::Avmtrf1.default_jira]
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Avmtrf1
4
+ module Jira
5
+ require 'avmtrf1/jira/entities'
6
+ require 'avmtrf1/jira/instance'
7
+ end
8
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Avmtrf1
4
+ module Jira
5
+ module Entities
6
+ require 'avmtrf1/jira/entities/base'
7
+ require 'avmtrf1/jira/entities/issue'
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/simple_cache'
4
+
5
+ module Avmtrf1
6
+ module Jira
7
+ module Entities
8
+ class Base
9
+ include ::EacRubyUtils::SimpleCache
10
+
11
+ attr_reader :instance, :data
12
+
13
+ def initialize(instance, data)
14
+ @instance = instance
15
+ @data = data
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'avmtrf1/jira/entities/base'
4
+
5
+ module Avmtrf1
6
+ module Jira
7
+ module Entities
8
+ class Issue < ::Avmtrf1::Jira::Entities::Base
9
+ CATEGORY_CLOSED_STATUSES = %w[Pendências Concluído].freeze
10
+ CATEGORY_OPEN_STATUSES = ['Em andamento'].freeze
11
+
12
+ def status_name
13
+ data.fetch('fields').fetch('status').fetch('name')
14
+ end
15
+
16
+ def status_category_name
17
+ data.fetch('fields').fetch('status').fetch('statusCategory').fetch('name')
18
+ end
19
+
20
+ def closed?
21
+ return true if CATEGORY_CLOSED_STATUSES.include?(status_category_name)
22
+ return false if CATEGORY_OPEN_STATUSES.include?(status_category_name)
23
+
24
+ raise "Unknown category status \"#{status_category_name}\"" \
25
+ " (Status: \"#{status_name}\")"
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,56 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'curb'
4
+ require 'json'
5
+
6
+ module Avmtrf1
7
+ module Jira
8
+ class Instance
9
+ ISSUE_ID_PATTERN = /\A([a-z][a-z0-9]+)\-(\d+)\z/i.freeze
10
+
11
+ class << self
12
+ def parse_issue_id(issue_id)
13
+ m = ISSUE_ID_PATTERN.match(issue_id)
14
+ return nil unless m
15
+
16
+ ::OpenStruct.new(project_id: m[1], project_issue_id: m[2])
17
+ end
18
+ end
19
+
20
+ attr_reader :root_url, :username
21
+
22
+ def initialize(root_url, username, password)
23
+ @root_url = root_url
24
+ @username = username
25
+ @password = password
26
+ end
27
+
28
+ def find_issue(issue_id)
29
+ parsed = self.class.parse_issue_id(issue_id)
30
+ parsed.present? ? issue(issue_id) : nil
31
+ end
32
+
33
+ def issue(issue_id)
34
+ ::Avmtrf1::Jira::Entities::Issue.new(self, request("/issue/#{issue_id}"))
35
+ end
36
+
37
+ def request(service_url_suffix)
38
+ c = ::Curl::Easy.new(build_service_url(service_url_suffix))
39
+ c.http_auth_types = :basic
40
+ c.username = username
41
+ c.password = password
42
+ raise 'Curl failed' unless c.perform
43
+
44
+ JSON.parse(c.body_str)
45
+ end
46
+
47
+ private
48
+
49
+ attr_reader :password
50
+
51
+ def build_service_url(service_url_suffix)
52
+ "#{root_url}/rest/api/latest#{service_url_suffix}"
53
+ end
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'colorize'
4
+
5
+ module Avmtrf1
6
+ class Result
7
+ class << self
8
+ def ok(output)
9
+ new(true, output)
10
+ end
11
+
12
+ def error(output)
13
+ new(false, output)
14
+ end
15
+ end
16
+
17
+ attr_reader :output
18
+
19
+ def initialize(is_ok, output)
20
+ @ok = is_ok
21
+ @output = output
22
+ end
23
+
24
+ def ok?
25
+ @ok ? true : false
26
+ end
27
+
28
+ def label
29
+ ok? ? output.green : output.red
30
+ end
31
+ end
32
+ end
@@ -3,6 +3,7 @@
3
3
  require 'eac_ruby_utils/console/docopt_runner'
4
4
  require 'avmtrf1/tools/runner/check_point'
5
5
  require 'avmtrf1/tools/runner/esosti'
6
+ require 'avmtrf1/tools/runner/git'
6
7
  require 'avmtrf1/tools/runner/oracle'
7
8
  require 'avmtrf1/tools/runner/red'
8
9
 
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/console/docopt_runner'
4
+ require 'avmtrf1/tools/runner/git/issues_check'
5
+
6
+ module Avmtrf1
7
+ module Tools
8
+ class Runner < ::EacRubyUtils::Console::DocoptRunner
9
+ class Git < ::EacRubyUtils::Console::DocoptRunner
10
+ DOC = <<~DOCOPT
11
+ Utilidades para Git.
12
+
13
+ Usage:
14
+ __PROGRAM__ __SUBCOMMANDS__
15
+ __PROGRAM__ -h | --help
16
+
17
+ Options:
18
+ -h --help Mostra esta ajuda.
19
+ DOCOPT
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,70 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/console/docopt_runner'
4
+ require 'eac_ruby_utils/console/speaker'
5
+ require 'eac_ruby_utils/simple_cache'
6
+ require 'avmtrf1/git/cached_repository'
7
+
8
+ module Avmtrf1
9
+ module Tools
10
+ class Runner < ::EacRubyUtils::Console::DocoptRunner
11
+ class Git < ::EacRubyUtils::Console::DocoptRunner
12
+ class IssuesCheck < ::EacRubyUtils::Console::DocoptRunner
13
+ include ::EacRubyUtils::SimpleCache
14
+ include ::EacRubyUtils::Console::Speaker
15
+
16
+ DOC = <<~DOCOPT
17
+ Confronta situação das demandas no Git com a situação nos trackers.
18
+
19
+ Usage:
20
+ __PROGRAM__ [options] <git-url>
21
+ __PROGRAM__ -h | --help
22
+
23
+ Options:
24
+ -h --help Mostra esta ajuda.
25
+ DOCOPT
26
+
27
+ def run
28
+ infov 'Repository path', git_url
29
+ infov 'Remote hashs found', remote_hashs.count
30
+ infov 'Issues found', issues_on_repository.count
31
+ issues_on_repository.each(&:check)
32
+ end
33
+
34
+ private
35
+
36
+ def git_url
37
+ options.fetch('<git-url>')
38
+ end
39
+
40
+ def git_uncached
41
+ ::Avmtrf1::Git::CachedRepository.new(git_url)
42
+ end
43
+
44
+ def remote_hashs_uncached
45
+ git.remote_hashs('origin').select do |fullname, _revision|
46
+ issue_ref?(fullname)
47
+ end
48
+ end
49
+
50
+ def issues_on_repository_uncached
51
+ r = {}
52
+ remote_hashs.each do |fullname, revision|
53
+ ref = ::Avmtrf1::Git::Reference.new(git, fullname, revision)
54
+ r[ref.name] ||= []
55
+ r[ref.name] << ref
56
+ end
57
+ r.sort.map { |issue_id, refs| ::Avmtrf1::Git::IssueOnRepository.new(issue_id, refs) }
58
+ end
59
+
60
+ def issue_ref?(fullname)
61
+ return false unless fullname.start_with?('refs/')
62
+ return false if fullname == 'refs/heads/master'
63
+
64
+ true
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Avmtrf1
4
4
  module Tools
5
- VERSION = '0.4.0'
5
+ VERSION = '0.5.0'
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: avmtrf1-tools
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Eduardo H. Bogoni
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-08-12 00:00:00.000000000 Z
11
+ date: 2019-08-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: aranha
@@ -24,6 +24,34 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: 0.9.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: curb
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 0.9.10
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 0.9.10
41
+ - !ruby/object:Gem::Dependency
42
+ name: eac_launcher
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '0.6'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '0.6'
27
55
  - !ruby/object:Gem::Dependency
28
56
  name: eac_ruby_utils
29
57
  requirement: !ruby/object:Gem::Requirement
@@ -145,6 +173,7 @@ files:
145
173
  - lib/avmtrf1/check_point/session.rb
146
174
  - lib/avmtrf1/check_point/session/login.rb
147
175
  - lib/avmtrf1/configs.rb
176
+ - lib/avmtrf1/default_jira.rb
148
177
  - lib/avmtrf1/esosti/parsers/solicitacao/main.rb
149
178
  - lib/avmtrf1/esosti/session.rb
150
179
  - lib/avmtrf1/esosti/session/action_base.rb
@@ -152,8 +181,19 @@ files:
152
181
  - lib/avmtrf1/esosti/session/login.rb
153
182
  - lib/avmtrf1/esosti/session/solicitacao.rb
154
183
  - lib/avmtrf1/esosti/session/solicitacao/main.rb
184
+ - lib/avmtrf1/git.rb
185
+ - lib/avmtrf1/git/cached_repository.rb
186
+ - lib/avmtrf1/git/issue_on_repository.rb
187
+ - lib/avmtrf1/git/reference.rb
155
188
  - lib/avmtrf1/ini.rb
156
189
  - lib/avmtrf1/ini/profile.rb
190
+ - lib/avmtrf1/issues.rb
191
+ - lib/avmtrf1/issues/factory.rb
192
+ - lib/avmtrf1/jira.rb
193
+ - lib/avmtrf1/jira/entities.rb
194
+ - lib/avmtrf1/jira/entities/base.rb
195
+ - lib/avmtrf1/jira/entities/issue.rb
196
+ - lib/avmtrf1/jira/instance.rb
157
197
  - lib/avmtrf1/oracle.rb
158
198
  - lib/avmtrf1/oracle/connection.rb
159
199
  - lib/avmtrf1/oracle/connection/base.rb
@@ -167,11 +207,14 @@ files:
167
207
  - lib/avmtrf1/red/profile.rb
168
208
  - lib/avmtrf1/red/profile/put_file.xml.erb
169
209
  - lib/avmtrf1/red/server.rb
210
+ - lib/avmtrf1/result.rb
170
211
  - lib/avmtrf1/tools.rb
171
212
  - lib/avmtrf1/tools/runner.rb
172
213
  - lib/avmtrf1/tools/runner/check_point.rb
173
214
  - lib/avmtrf1/tools/runner/check_point/login.rb
174
215
  - lib/avmtrf1/tools/runner/esosti.rb
216
+ - lib/avmtrf1/tools/runner/git.rb
217
+ - lib/avmtrf1/tools/runner/git/issues_check.rb
175
218
  - lib/avmtrf1/tools/runner/oracle.rb
176
219
  - lib/avmtrf1/tools/runner/oracle/source_get.rb
177
220
  - lib/avmtrf1/tools/runner/red.rb