avmtrf1-tools 0.29.0 → 0.30.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: deffef9fed701fdd895529665042b9e0d4ff93932eef2f51e66d5bcf82ede6b2
4
- data.tar.gz: 882cd5b9a5a0397bfde0c6e0bece1120e260374cf45205cb649257145201814f
3
+ metadata.gz: b61967bd7fdee216edfc174a67a238cb5f09fd625ae19c5bc029f0e13fc319ce
4
+ data.tar.gz: 4ecf717af9a51d39bda3ef107a5536ad97a27c4839cae2ff4255f89bccffa47e
5
5
  SHA512:
6
- metadata.gz: 3e724ff217082ef2242ab23d1ea6246e3a72f67248ea53418c9eb6b293ce3d11f8a1eebaa5bda4b3bac4e0bd5ea99afc96c33d77e2d7e25e080c8f7fbbd590a2
7
- data.tar.gz: '09c35fc0433617d22eb1efce1d9ff57ba7b100002b0b1d9f49a7875ae24ea3a5a927b59f6cdd2ac01ccd1b2fb331602d20113f3b7094d35e76e7242ef68e34a4'
6
+ metadata.gz: f4dcd615dec9efc8824e9307a8673a409ef411e27c41e0b52b4df8f2bf613a66425fda3c13fe7550dc5347088d83b6e097360fb033e78ee100d84ed779715aa2
7
+ data.tar.gz: 788d8843f20252d25d86e79e327f16e71f2aa9a9de370e754b65a99eb7043dbbbc2a40ba02bfc244f0287af4bd96daf579ea7849dfcc61e61966122419f9f368
@@ -1,19 +1,22 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'avmtrf1/esosti/raw_data_sanitizer'
4
+ require 'eac_ruby_utils/core_ext'
4
5
 
5
6
  module Avmtrf1
6
7
  module Esosti
7
8
  class Instance < ::Avmtrf1::RestProvider::Instance
8
9
  module Changed
9
10
  def changed(since)
10
- changed_parse_result(request(changed_url_suffix(since)))
11
+ changed_request(since).response.body_data_or_raise
11
12
  end
12
13
 
13
- def changed_parse_result(raw_data)
14
- ::Avmtrf1::Esosti::RawDataSanitizer.sanitize(
15
- raw_data.fetch('TICKETMboSet').fetch('TICKET')
16
- ).map { |ticket| ticket.fetch('Attributes').fetch('TICKETID').downcase }
14
+ def changed_request(since)
15
+ request_json(changed_url_suffix(since)) do |data|
16
+ ::Avmtrf1::Esosti::RawDataSanitizer.sanitize(
17
+ data.fetch('TICKETMboSet').fetch('TICKET')
18
+ ).map { |ticket| ticket.fetch('Attributes').fetch('TICKETID').downcase }
19
+ end
17
20
  end
18
21
 
19
22
  def changed_url_suffix(since)
@@ -31,7 +31,8 @@ module Avmtrf1
31
31
  private
32
32
 
33
33
  def issue_statuses
34
- request('/issue_statuses').fetch('issue_statuses').map do |data|
34
+ request_json('/issue_statuses').response.body_data_or_raise.fetch('issue_statuses')
35
+ .map do |data|
35
36
  ::Avmtrf1::Redmine::Entities::IssueStatus.new(self, data)
36
37
  end
37
38
  end
@@ -1,9 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'avmtrf1/rest_provider/request'
3
4
  require 'curb'
4
- require 'json'
5
- require 'avmtrf1/jira/entities/issue'
6
- require 'eac_ruby_utils/console/speaker'
5
+ require 'eac_ruby_utils/core_ext'
7
6
 
8
7
  module Avmtrf1
9
8
  module RestProvider
@@ -12,60 +11,19 @@ module Avmtrf1
12
11
  # * self.build_service_url(service_url_suffix)
13
12
  # * self.issue_get_url_suffix(provider_issue_id)
14
13
  class Instance
15
- include ::EacRubyUtils::Console::Speaker
16
-
17
- attr_reader :root_url, :username, :password
18
-
19
- def initialize(root_url, username, password)
20
- @root_url = root_url
21
- @username = username
22
- @password = password
23
- end
24
-
25
- def find_issue(global_issue_id)
26
- parsed = self.class.parse_issue_id(global_issue_id)
27
- parsed.present? ? issue(parsed.provider_issue_id) : nil
28
- end
29
-
30
- def issue(provider_issue_id)
31
- data = request(issue_get_url_suffix(provider_issue_id))
32
- data = issue_class.parse_data(data) if issue_class.respond_to?(:parse_data)
33
- data.present? ? issue_class.new(self, data) : nil
34
- end
35
-
36
- def request(service_url_suffix)
37
- url = build_service_url(service_url_suffix)
38
- infov 'URL', url
39
- c = ::Curl::Easy.new(url)
40
- c.http_auth_types = :basic
41
- c.username = username
42
- c.password = password
43
- c.headers['Accept'] = 'application/json'
44
- curl_perform(c)
45
- end
46
-
47
- def issue_class
48
- "#{self.class.name.deconstantize}::Entities::Issue".constantize
49
- end
50
-
51
- private
52
-
53
- def curl_perform(curl)
54
- raise 'Curl failed' unless curl.perform
55
-
56
- infov 'Return status', curl.status
57
- return JSON.parse(curl.body_str) if curl.status.to_i == 200
58
-
59
- raise curl_raise_message(curl)
14
+ require_sub __FILE__, include_modules: true
15
+ common_constructor :root_url, :username, :password
16
+
17
+ def request(service_url_suffix, headers = {}, &body_data_proc)
18
+ r = Avmtrf1::RestProvider::Request.new(build_service_url(service_url_suffix),
19
+ body_data_proc)
20
+ headers.each { |name, value| r.header(name, value) }
21
+ r.autenticate(username, password)
22
+ r
60
23
  end
61
24
 
62
- def curl_raise_message(curl)
63
- raise <<~MESSAGE
64
- "#{curl.url} returned #{curl.status.to_i}:
65
- #{'=' * 10}
66
- #{curl.body_str}
67
- #{'=' * 10}"
68
- MESSAGE
25
+ def request_json(service_url_suffix, headers = {}, &body_data_proc)
26
+ request(service_url_suffix, headers.merge('Accept' => 'application/json'), &body_data_proc)
69
27
  end
70
28
  end
71
29
  end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Avmtrf1
4
+ module RestProvider
5
+ class Instance
6
+ module Issues
7
+ def find_issue(global_issue_id)
8
+ parsed = self.class.parse_issue_id(global_issue_id)
9
+ parsed.present? ? issue(parsed.provider_issue_id) : nil
10
+ end
11
+
12
+ def issue(provider_issue_id)
13
+ issue_request(provider_issue_id).response.body_data_or_raise
14
+ end
15
+
16
+ # @return [Avmtrf1::RestProvider::Request]
17
+ def issue_request(provider_issue_id)
18
+ request_json(issue_get_url_suffix(provider_issue_id)) do |data|
19
+ data = issue_class.parse_data(data) if issue_class.respond_to?(:parse_data)
20
+ data.present? ? issue_class.new(self, data) : nil
21
+ end
22
+ end
23
+
24
+ def issue_class
25
+ "#{self.class.name.deconstantize}::Entities::Issue".constantize
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'avmtrf1/rest_provider/response'
4
+ require 'eac_ruby_utils/core_ext'
5
+ require 'ostruct'
6
+
7
+ module Avmtrf1
8
+ module RestProvider
9
+ class Request
10
+ common_constructor :url, :body_data_proc, default: [nil]
11
+
12
+ def autenticate(username, password)
13
+ self.auth = ::OpenStruct.new(username: username, password: password)
14
+ end
15
+
16
+ def header(name, value)
17
+ headers[name.to_s] = value
18
+ end
19
+
20
+ def response
21
+ ::Avmtrf1::RestProvider::Response.new(build_curl, body_data_proc)
22
+ end
23
+
24
+ private
25
+
26
+ attr_accessor :auth
27
+
28
+ def build_curl
29
+ r = ::Curl::Easy.new(url)
30
+ auth.if_present do |a|
31
+ r.http_auth_types = :basic
32
+ r.username = a.username
33
+ r.password = a.password
34
+ end
35
+ r.headers.merge!(headers)
36
+ r
37
+ end
38
+
39
+ def headers
40
+ @headers ||= {}
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,77 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'active_support/core_ext/hash/conversions'
4
+ require 'eac_ruby_utils/core_ext'
5
+ require 'json'
6
+
7
+ module Avmtrf1
8
+ module RestProvider
9
+ class Response < ::StandardError
10
+ common_constructor :curl, :body_data_proc
11
+
12
+ def body_data
13
+ r = performed_curl.headers['Accept'].if_present(body_str) do |v|
14
+ send("body_data_from_#{v.parameterize.underscore}")
15
+ end
16
+ r = body_data_proc.call(r) if body_data_proc.present?
17
+ r
18
+ end
19
+
20
+ def body_data_or_raise
21
+ raise_unless_200
22
+
23
+ body_data
24
+ end
25
+
26
+ def body_str
27
+ performed_curl.body_str
28
+ end
29
+
30
+ def body_str_or_raise
31
+ raise_unless_200
32
+
33
+ body_str
34
+ end
35
+
36
+ def raise_unless_200
37
+ return nil if status == 200
38
+
39
+ raise self
40
+ end
41
+
42
+ def status
43
+ performed_curl.status.to_i
44
+ end
45
+
46
+ def url
47
+ curl.url
48
+ end
49
+
50
+ def to_s
51
+ "URL: #{url}\nStatus: #{status}\nBody:\n\n#{body_str}"
52
+ end
53
+
54
+ private
55
+
56
+ def body_data_from_application_json
57
+ ::JSON.parse(body_str)
58
+ end
59
+
60
+ def body_data_from_application_xml
61
+ Hash.from_xml(body_str)
62
+ end
63
+
64
+ def perform
65
+ @perform ||= begin
66
+ curl.perform || raise("CURL perform failed for #{url}")
67
+ true
68
+ end
69
+ end
70
+
71
+ def performed_curl
72
+ perform
73
+ curl
74
+ end
75
+ end
76
+ end
77
+ end
@@ -27,6 +27,7 @@ module Avmtrf1
27
27
 
28
28
  def run
29
29
  infov 'Time', time
30
+ infov 'URL', request.url
30
31
  out data.to_yaml
31
32
  end
32
33
 
@@ -34,7 +35,11 @@ module Avmtrf1
34
35
 
35
36
  def data_uncached
36
37
  infom 'Recuperando informações...'
37
- context(:esosti_instance).changed(time)
38
+ request.response.body_data_or_raise
39
+ end
40
+
41
+ def request_uncached
42
+ context(:esosti_instance).changed_request(time)
38
43
  end
39
44
 
40
45
  def time
@@ -26,15 +26,20 @@ module Avmtrf1
26
26
  DOCOPT
27
27
 
28
28
  def run
29
+ infov 'URL', request.url
29
30
  fatal_error("Issue não encontrado: #{solicitacao_id}") unless issue
30
31
  out issue.data.to_yaml
31
32
  end
32
33
 
33
34
  private
34
35
 
36
+ def request_uncached
37
+ context(:esosti_instance).issue_request(solicitacao_id)
38
+ end
39
+
35
40
  def issue_uncached
36
41
  infom "Recuperando informações de #{solicitacao_id}..."
37
- context(:esosti_instance).issue(solicitacao_id)
42
+ request.response.body_data_or_raise
38
43
  end
39
44
 
40
45
  def solicitacao_id
@@ -0,0 +1,88 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/console/docopt_runner'
4
+ require 'eac_ruby_utils/core_ext'
5
+ require 'avmtrf1/default_esosti'
6
+ require 'avmtrf1/ini'
7
+ require 'avmtrf1/red/profile'
8
+
9
+ module Avmtrf1
10
+ module Tools
11
+ class Runner < ::EacRubyUtils::Console::DocoptRunner
12
+ class Esosti < ::EacRubyUtils::Console::DocoptRunner
13
+ class Request < ::EacRubyUtils::Console::DocoptRunner
14
+ enable_console_speaker
15
+ enable_simple_cache
16
+
17
+ DOC = <<~DOCOPT
18
+ Requisições genéricas para e-Sosti (Control Desk).
19
+
20
+ Usage:
21
+ __PROGRAM__ [options] <url-suffix>
22
+ __PROGRAM__ -h | --help
23
+
24
+ Options:
25
+ -h --help Mostra esta ajuda.
26
+ -d --default Opções --json e --yaml.
27
+ -j --json Solicita resposta em JSON.
28
+ -x --xml Solicita resposta em XML.
29
+ -y --yaml Imprime saída em YAML.
30
+ DOCOPT
31
+
32
+ def run
33
+ start_banner
34
+ output_data
35
+ end
36
+
37
+ private
38
+
39
+ def json?
40
+ options.fetch('--json') || options.fetch('--default')
41
+ end
42
+
43
+ def start_banner
44
+ infov 'URL', request.url
45
+ infom 'Recuperando informações...'
46
+ infov 'Response status', response.status
47
+ end
48
+
49
+ def output_data
50
+ if yaml?
51
+ out ::YAML.dump(response.body_data)
52
+ else
53
+ out response.body_str
54
+ end
55
+ end
56
+
57
+ def request_uncached
58
+ context(:esosti_instance).request(url_suffix, request_headers)
59
+ end
60
+
61
+ def request_headers
62
+ r = {}
63
+ %w[json xml].each do |format|
64
+ r['Accept'] = "application/#{format}" if send("#{format}?")
65
+ end
66
+ r
67
+ end
68
+
69
+ def response_uncached
70
+ request.response
71
+ end
72
+
73
+ def url_suffix
74
+ options.fetch('<url-suffix>')
75
+ end
76
+
77
+ def xml?
78
+ options.fetch('--xml')
79
+ end
80
+
81
+ def yaml?
82
+ options.fetch('--yaml') || options.fetch('--default')
83
+ end
84
+ end
85
+ end
86
+ end
87
+ end
88
+ end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Avmtrf1
4
4
  module Tools
5
- VERSION = '0.29.0'
5
+ VERSION = '0.30.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.29.0
4
+ version: 0.30.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: 2020-05-25 00:00:00.000000000 Z
11
+ date: 2020-06-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: aranha-parsers
@@ -299,6 +299,9 @@ files:
299
299
  - lib/avmtrf1/rest_provider.rb
300
300
  - lib/avmtrf1/rest_provider/entity.rb
301
301
  - lib/avmtrf1/rest_provider/instance.rb
302
+ - lib/avmtrf1/rest_provider/instance/issues.rb
303
+ - lib/avmtrf1/rest_provider/request.rb
304
+ - lib/avmtrf1/rest_provider/response.rb
302
305
  - lib/avmtrf1/result.rb
303
306
  - lib/avmtrf1/ruby.rb
304
307
  - lib/avmtrf1/ruby/gems.rb
@@ -312,6 +315,7 @@ files:
312
315
  - lib/avmtrf1/tools/runner/esosti.rb
313
316
  - lib/avmtrf1/tools/runner/esosti/changed.rb
314
317
  - lib/avmtrf1/tools/runner/esosti/fetch.rb
318
+ - lib/avmtrf1/tools/runner/esosti/request.rb
315
319
  - lib/avmtrf1/tools/runner/forponto.rb
316
320
  - lib/avmtrf1/tools/runner/forponto/espelho.rb
317
321
  - lib/avmtrf1/tools/runner/forponto/marcacoes.rb