avmtrf1-tools 0.29.0 → 0.30.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: 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