avmtrf1-tools 0.4.0 → 0.5.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 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