avmtrf1-tools 0.9.0 → 0.10.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: 777ea2b3c50e09553565dffe045f75d83355b6b80a44e3ee390f4fc9bc39401a
4
- data.tar.gz: 5323ea0237c1d9136c74dd9a227663184be4cd9822e204ae11d56c4e8e8b2a8f
3
+ metadata.gz: 67446ce01961d10946a8fc937e4b915f3c05f5ed677de2ae96eeec9326973fa5
4
+ data.tar.gz: 351e637a0c371bd1d4d5186cbd0c38fae2972701053ac2b2489adc1288d3d8e0
5
5
  SHA512:
6
- metadata.gz: c18ec390a1b12454422a6f973efcdba70708eb5f99f12ac2663bca459b6ff72819580e70485766256eda64992cc1e10cf4c75a2040601859c6f630a8517543d1
7
- data.tar.gz: d10352ab9f7c69141fa9fda14a18432a70f21787a1db0a23bde067661df90147c8678cd302b965154ff7aa6508abf7444ea49b158588968f793f6580e1dcb62f
6
+ metadata.gz: c1bf19d47042636ad7edaa9d0828003493e31d118492f77ceb03fa8f23042a04c6b1cbdf2fefdece9ebb2030d6fda7568d3b8eff08aaa7a954491287a958661d
7
+ data.tar.gz: 67a212a7482ef95aff8d91a7b3c16c703d9e9d3f8c94810456e72cee74580e6b2e20271904b689d6ea4608a405b249c38ac3e41a5ceae17a065c69cf092c1184
@@ -7,7 +7,6 @@ module Avmtrf1
7
7
  require 'avmtrf1/default_esosti'
8
8
  require 'avmtrf1/default_jira'
9
9
  require 'avmtrf1/default_redmine'
10
- require 'avmtrf1/filesystem_cache'
11
10
  require 'avmtrf1/fs_cache'
12
11
  require 'avmtrf1/git'
13
12
  require 'avmtrf1/ini'
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'aranha/parsers/html/item'
4
+ require 'eac_ruby_utils/require_sub'
5
+
6
+ module Avmtrf1
7
+ module Forponto
8
+ module Parsers
9
+ class Espelho < ::Aranha::Parsers::Html::Item
10
+ ::EacRubyUtils.require_sub(__FILE__)
11
+
12
+ def item_xpath
13
+ '//table[@class="fiotabelaponto"]//table//table'
14
+ end
15
+
16
+ def data
17
+ consumer = RowsConsumer.new
18
+ item_node.xpath('./tbody/tr').map do |row_node|
19
+ consumer.add_row(row_node)
20
+ end
21
+ consumer.data
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'sub_node'
4
+
5
+ module Avmtrf1
6
+ module Forponto
7
+ module Parsers
8
+ class Espelho < ::Aranha::Parsers::Html::Item
9
+ class DayNode < SubNode
10
+ include MethodsAsFields
11
+
12
+ FIELDS = %w[date marcacoes summaries].freeze
13
+ SUMMARIES_XPATH = './following-sibling::tr[1]//font[@class="fontetabptodados"]/p/text()'
14
+
15
+ def initialize(*args)
16
+ super(*args)
17
+ @summaries = []
18
+ end
19
+
20
+ def add_summary(summary)
21
+ @summaries << summary
22
+ end
23
+
24
+ def date_string
25
+ node.at_xpath('.//font[@class="fontetabptodata"]/text()').to_s
26
+ end
27
+
28
+ def date
29
+ m = %r{(\d{2})/(\d{2})/(\d{4})}.match(date_string)
30
+ return Date.new(m[3].to_i, m[2].to_i, m[1].to_i) if m
31
+
32
+ raise "Date not found at \"#{date_string}\""
33
+ end
34
+
35
+ def marcacoes_string
36
+ node.at_xpath('.//font[@class="fontetabptomarc"]/text()').to_s
37
+ end
38
+
39
+ def marcacoes
40
+ marcacoes_string.scan(/\d{2}:\d{2}/)
41
+ end
42
+
43
+ def summaries
44
+ @summaries.map(&:data)
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'aranha/parsers/html/item'
4
+
5
+ module Avmtrf1
6
+ module Forponto
7
+ module Parsers
8
+ class Espelho < ::Aranha::Parsers::Html::Item
9
+ module MethodsAsFields
10
+ def methods_as_fields(fields)
11
+ fields.map { |field| [field, send(field)] }.to_h
12
+ end
13
+
14
+ def data
15
+ methods_as_fields(self.class.const_get('FIELDS'))
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'sub_node'
4
+
5
+ module Avmtrf1
6
+ module Forponto
7
+ module Parsers
8
+ class Espelho < ::Aranha::Parsers::Html::Item
9
+ class RowNode < SubNode
10
+ def empty?
11
+ Utils.string_recursive(node).blank?
12
+ end
13
+
14
+ def css_class
15
+ node['class']
16
+ end
17
+
18
+ def day?
19
+ css_class == 'celulatabptomarc'
20
+ end
21
+
22
+ def summary?
23
+ css_class == 'celulatabptodados'
24
+ end
25
+
26
+ def days_area_end?
27
+ font = node.at_xpath('.//font[@class="fontetopotabelaponto"]')
28
+ font && font.text.to_s.include?('Total das Ocorr')
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,71 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Avmtrf1
4
+ module Forponto
5
+ module Parsers
6
+ class Espelho < ::Aranha::Parsers::Html::Item
7
+ class RowsConsumer
8
+ include MethodsAsFields
9
+
10
+ FIELDS = %w[days summaries].freeze
11
+
12
+ def initialize
13
+ @days = []
14
+ @summaries = []
15
+ @days_area = true
16
+ end
17
+
18
+ def add_row(row_node)
19
+ row_node = RowNode.new(row_node)
20
+ return if row_node.empty?
21
+
22
+ if @days_area
23
+ add_row_from_days_area(row_node)
24
+ else
25
+ add_row_from_summaries_area(row_node)
26
+ end
27
+ end
28
+
29
+ def days
30
+ @days.map(&:data)
31
+ end
32
+
33
+ def summaries
34
+ @summaries.map(&:data)
35
+ end
36
+
37
+ private
38
+
39
+ def add_row_from_days_area(row_node)
40
+ if row_node.days_area_end?
41
+ @days_area = false
42
+ elsif row_node.day?
43
+ add_day(row_node)
44
+ elsif row_node.summary?
45
+ add_summary_on_day(row_node)
46
+ else
47
+ "Unmapped class: \"#{row_node.css_class}\""
48
+ end
49
+ end
50
+
51
+ def add_row_from_summaries_area(row_node)
52
+ raise "Not a summary node found on summaries area: #{row_node.node}" unless
53
+ row_node.summary?
54
+
55
+ row_node.node.xpath('.//table').each do |table_node|
56
+ @summaries << SummaryNode.new(table_node)
57
+ end
58
+ end
59
+
60
+ def add_day(row_node)
61
+ @days << DayNode.new(row_node.node)
62
+ end
63
+
64
+ def add_summary_on_day(row_node)
65
+ @days.last.add_summary(SummaryNode.new(row_node.node))
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'aranha/parsers/html/item'
4
+ require_relative 'methods_as_fields'
5
+
6
+ module Avmtrf1
7
+ module Forponto
8
+ module Parsers
9
+ class Espelho < ::Aranha::Parsers::Html::Item
10
+ class SubNode
11
+ attr_reader :node
12
+
13
+ def initialize(node)
14
+ @node = node
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/simple_cache'
4
+ require_relative 'sub_node'
5
+
6
+ module Avmtrf1
7
+ module Forponto
8
+ module Parsers
9
+ class Espelho < ::Aranha::Parsers::Html::Item
10
+ class SummaryNode < SubNode
11
+ include ::EacRubyUtils::SimpleCache
12
+ include MethodsAsFields
13
+
14
+ FIELDS = %w[code description time minutes].freeze
15
+
16
+ def code
17
+ code_description_parsed.code
18
+ end
19
+
20
+ def description
21
+ code_description_parsed.description
22
+ end
23
+
24
+ def time
25
+ column_text('20%')
26
+ end
27
+
28
+ def minutes
29
+ m = /\A(\d+):(\d+)\z/.match(time)
30
+ raise "\"#{time}\" does not match time pattern" unless m
31
+
32
+ m[1].to_i * 60 + m[2].to_i
33
+ end
34
+
35
+ private
36
+
37
+ def column_text(width)
38
+ Utils.string_recursive(node.at_xpath(".//td[@width='#{width}']"))
39
+ end
40
+
41
+ def code_description
42
+ column_text('80%')
43
+ end
44
+
45
+ def code_description_parsed_uncached
46
+ return ::OpenStruct.new(code: nil, description: nil) if code_description.blank?
47
+
48
+ m = /\A(\d+)\s*-\s*(\S.+)\z/.match(code_description)
49
+ raise "Code/description pattern not match: \"#{code_description}\"" unless m
50
+
51
+ ::OpenStruct.new(code: m[1].to_i, description: m[2].strip)
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/simple_cache'
4
+ require_relative 'sub_node'
5
+
6
+ module Avmtrf1
7
+ module Forponto
8
+ module Parsers
9
+ class Espelho < ::Aranha::Parsers::Html::Item
10
+ class Utils
11
+ class << self
12
+ def string_recursive(node)
13
+ return nil unless node.present?
14
+ return sanitize_string(node.text) if node.is_a?(::Nokogiri::XML::Text)
15
+
16
+ s = ''
17
+ node.children.each do |child|
18
+ child_s = string_recursive(child)
19
+ s += ' ' + child_s if child_s.present?
20
+ end
21
+ sanitize_string(s)
22
+ end
23
+
24
+ def sanitize_string(obj)
25
+ obj.to_s.tr("\u00A0", ' ').strip
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,67 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'aranha/selenium/session'
4
+
5
+ module Avmtrf1
6
+ module Forponto
7
+ class Session
8
+ attr_reader :sub, :root_url, :matricula, :codigo
9
+
10
+ def initialize(root_url, matricula, codigo)
11
+ @root_url = root_url
12
+ @matricula = matricula
13
+ @codigo = codigo
14
+ @sub = ::Aranha::Selenium::Session.new(
15
+ user_agent: 'Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko'
16
+ )
17
+ end
18
+
19
+ def go_to_login_form
20
+ sub.navigate.to root_url
21
+ sub.wait_for_click(xpath: '//a[text() = "COLABORADOR"]')
22
+ end
23
+
24
+ def login(start_date, end_date)
25
+ go_to_login_form
26
+ login_fill_matricula
27
+ login_fill_codigo
28
+ login_fill_start_date(start_date)
29
+ login_fill_end_date(end_date)
30
+ sub.wait_for_click(xpath: '//input[@name="ok"]')
31
+ end
32
+
33
+ def interval_data(start_date, end_date)
34
+ tempfile = '/tmp/forponto.html'
35
+ ::File.write(tempfile, interval_source_code(start_date, end_date))
36
+ ::Avmtrf1::Forponto::Parsers::Espelho.new("file://#{tempfile}").data
37
+ end
38
+
39
+ def interval_source_code(start_date, end_date)
40
+ login(start_date, end_date)
41
+ sub.switch_to.frame(sub.wait_for_element(xpath: '//frame[@name="topFrame"]'))
42
+ sub.wait_for_element(xpath: '//form[@name="frmjustificativa"]')
43
+ sub.current_source
44
+ end
45
+
46
+ def login_fill_matricula
47
+ sub.wait_for_element(xpath: '//input[@name="deEdtFunCrachaSel"]').send_keys(matricula)
48
+ end
49
+
50
+ def login_fill_codigo
51
+ sub.wait_for_element(xpath: '//input[@name="deEdtFunConsulta"]').send_keys(codigo)
52
+ end
53
+
54
+ def login_fill_start_date(start_date)
55
+ sub.wait_for_element(xpath: '//input[@name="deEdtDataDe"]').send_keys(
56
+ start_date.strftime('%d/%m/%Y')
57
+ )
58
+ end
59
+
60
+ def login_fill_end_date(end_date)
61
+ sub.wait_for_element(xpath: '//input[@name="deEdtDataAte"]').send_keys(
62
+ end_date.strftime('%d/%m/%Y')
63
+ )
64
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/require_sub'
4
+ ::EacRubyUtils.require_sub(__FILE__)
5
+
6
+ module Avmtrf1
7
+ module Forponto
8
+ class User
9
+ attr_reader :url, :matricula, :codigo
10
+
11
+ def initialize(url, matricula, codigo)
12
+ @url = url
13
+ @matricula = matricula
14
+ @codigo = codigo
15
+ end
16
+
17
+ def month(year, month)
18
+ ::Avmtrf1::Forponto::User::Month.new(self, year, month)
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,127 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'active_support/json'
4
+ require 'eac_ruby_utils/core_ext'
5
+ require 'eac_ruby_utils/yaml'
6
+ require 'avmtrf1/forponto/parsers/espelho'
7
+ require 'avmtrf1/forponto/session'
8
+ require 'avmtrf1/fs_cache'
9
+
10
+ module Avmtrf1
11
+ module Forponto
12
+ class User
13
+ class Month
14
+ enable_simple_cache
15
+
16
+ DEBITO_CODE = 66
17
+ CREDITO_CODE = 72
18
+
19
+ attr_reader :user, :year, :month
20
+
21
+ def initialize(user, year, month)
22
+ @user = user
23
+ @year = year
24
+ @month = month
25
+ end
26
+
27
+ def data_uncached
28
+ if recache?
29
+ r = fresh_data
30
+ data_cache.write(r.to_yaml)
31
+ r
32
+ else
33
+ ::EacRubyUtils::Yaml.load_common(data_cache.read)
34
+ end
35
+ end
36
+
37
+ def to_s
38
+ month.to_s.rjust(2, '0') + '/' + year.to_s
39
+ end
40
+
41
+ def empty?
42
+ os_data.summaries.empty?
43
+ end
44
+
45
+ def debito_acumulado; end
46
+
47
+ def debito
48
+ summary_minutes(DEBITO_CODE)
49
+ end
50
+
51
+ def debito_acum
52
+ debito + (parent_month ? parent_month.debito_acum : 0)
53
+ end
54
+
55
+ def credito_acum
56
+ credito + (parent_month ? parent_month.credito_acum : 0)
57
+ end
58
+
59
+ def saldo
60
+ credito - debito
61
+ end
62
+
63
+ def saldo_acum
64
+ credito_acum - debito_acum
65
+ end
66
+
67
+ def credito
68
+ summary_minutes(CREDITO_CODE)
69
+ end
70
+
71
+ private
72
+
73
+ def summary_minutes(code)
74
+ summary = os_data.summaries.find { |s| s.code == code }
75
+ summary ? summary.minutes : 0
76
+ end
77
+
78
+ def parent_month_uncached
79
+ date = Date.civil(year, month, 1) - 1.month
80
+ r = user.month(date.year, date.month)
81
+ r.empty? ? nil : r
82
+ end
83
+
84
+ def os_data_uncached
85
+ ::RecursiveOpenStruct.new(data, recurse_over_arrays: true)
86
+ end
87
+
88
+ def recache?
89
+ !data_cache.cached?
90
+ end
91
+
92
+ def data_cache_uncached
93
+ ::Avmtrf1.fs_cache.child('forponto', user.matricula, month.to_s.rjust(2, '0'))
94
+ end
95
+
96
+ def date(day)
97
+ ::Date.civil(year, month, day)
98
+ end
99
+
100
+ def start_date_uncached
101
+ date(1)
102
+ end
103
+
104
+ def end_date_uncached
105
+ date(-1)
106
+ end
107
+
108
+ def fresh_data
109
+ session = new_session
110
+ begin
111
+ session.interval_data(start_date, end_date).merge(fetch_data)
112
+ ensure
113
+ session.sub.close
114
+ end
115
+ end
116
+
117
+ def fetch_data
118
+ { year: year, month: month, url: user.url, matricula: user.matricula }
119
+ end
120
+
121
+ def new_session
122
+ ::Avmtrf1::Forponto::Session.new(user.url, user.matricula, user.codigo)
123
+ end
124
+ end
125
+ end
126
+ end
127
+ end
@@ -1,11 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'avmtrf1/filesystem_cache'
3
+ require 'eac_ruby_utils/filesystem_cache'
4
4
 
5
5
  module Avmtrf1
6
6
  class << self
7
7
  def fs_cache
8
- @fs_cache ||= ::Avmtrf1::FilesystemCache.new(ENV['HOME'], '.cache', 'avmtrf1-tools')
8
+ @fs_cache ||= ::EacRubyUtils::FilesystemCache.new(ENV['HOME'], '.cache', 'avmtrf1-tools')
9
9
  end
10
10
  end
11
11
  end
@@ -31,7 +31,7 @@ module Avmtrf1
31
31
  end
32
32
 
33
33
  def fs_cache
34
- @fs_cache ||= ::Avmtrf1.fs_cache.sub(::File.expand_path(git).parameterize)
34
+ @fs_cache ||= ::Avmtrf1.fs_cache.child(::File.expand_path(git).parameterize)
35
35
  end
36
36
 
37
37
  private
@@ -5,11 +5,11 @@ module Avmtrf1
5
5
  class PushLarge
6
6
  class LfsCommit
7
7
  def fs_cache_uncached
8
- source_commit.fs_cache.sub(lfs_file_min_size.present? ? lfs_file_min_size : 'nil')
8
+ source_commit.fs_cache.child(lfs_file_min_size.present? ? lfs_file_min_size : 'nil')
9
9
  end
10
10
 
11
11
  %w[sha1 files_size push_pack_error].each do |attr|
12
- define_method("#{attr}_cache_uncached") { fs_cache.sub(attr) }
12
+ define_method("#{attr}_cache_uncached") { fs_cache.child(attr) }
13
13
  end
14
14
  end
15
15
  end
@@ -33,7 +33,7 @@ module Avmtrf1
33
33
  end
34
34
 
35
35
  def fs_cache
36
- @fs_cache ||= push_large.fs_cache.sub(sha1)
36
+ @fs_cache ||= push_large.fs_cache.child(sha1)
37
37
  end
38
38
 
39
39
  private
@@ -11,7 +11,7 @@ module Avmtrf1
11
11
  LFS_FILE_MIN_SIZES = [nil, 1_048_576, 524_288, 131_072].freeze
12
12
 
13
13
  def pushed_revision_uncached
14
- fs_cache.sub('pushed_revision')
14
+ fs_cache.child('pushed_revision')
15
15
  end
16
16
 
17
17
  def run_pushs
@@ -4,6 +4,7 @@ require 'aranha/selenium/driver_factory/base'
4
4
  require 'eac_ruby_utils/console/docopt_runner'
5
5
  require 'avmtrf1/tools/runner/check_point'
6
6
  require 'avmtrf1/tools/runner/esosti'
7
+ require 'avmtrf1/tools/runner/forponto'
7
8
  require 'avmtrf1/tools/runner/git'
8
9
  require 'avmtrf1/tools/runner/oracle'
9
10
  require 'avmtrf1/tools/runner/red'
@@ -0,0 +1,79 @@
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/require_sub'
6
+ ::EacRubyUtils.require_sub(__FILE__)
7
+ require 'avmtrf1/configs'
8
+ require 'avmtrf1/forponto/user'
9
+
10
+ module Avmtrf1
11
+ module Tools
12
+ class Runner < ::EacRubyUtils::Console::DocoptRunner
13
+ class Forponto < ::EacRubyUtils::Console::DocoptRunner
14
+ include ::EacRubyUtils::SimpleCache
15
+ include ::EacRubyUtils::Console::Speaker
16
+
17
+ DEFAULT_VALUES = {
18
+ url: 'http://pontoeletronico.trf1.jus.br/forponto/fptoweb.exe'
19
+ }.freeze
20
+
21
+ DOC = <<~DOCOPT
22
+ Operações para Forponto.
23
+
24
+ Usage:
25
+ __PROGRAM__ [options] __SUBCOMMANDS__
26
+ __PROGRAM__ -h | --help
27
+
28
+ Options:
29
+ -h --help Show this screen.
30
+ -u --url=<url> URL inicial.
31
+ -m --matricula=<matricula> Matrícula.
32
+ -c --codigo=<codigo> Código.
33
+ DOCOPT
34
+
35
+ def run
36
+ start_banner
37
+ run_with_subcommand
38
+ end
39
+
40
+ def start_banner
41
+ infov 'URL', user.url
42
+ infov 'Matrícula', user.matricula
43
+ end
44
+
45
+ def attr_value(name, read_options = {})
46
+ value_by_option(name) || value_by_default(name) || value_by_entry(name, read_options)
47
+ end
48
+
49
+ def value_by_option(name)
50
+ options.fetch("--#{name}")
51
+ end
52
+
53
+ def value_by_default(name)
54
+ DEFAULT_VALUES[name.to_sym]
55
+ end
56
+
57
+ def value_by_entry(name, read_options)
58
+ ::Avmtrf1.configs.read_entry("trf1.forponto.#{name}", read_options)
59
+ end
60
+
61
+ def user_uncached
62
+ ::Avmtrf1::Forponto::User.new(url, matricula, codigo)
63
+ end
64
+
65
+ def url
66
+ attr_value(__method__)
67
+ end
68
+
69
+ def matricula
70
+ attr_value(__method__)
71
+ end
72
+
73
+ def codigo
74
+ attr_value(__method__, noecho: true)
75
+ end
76
+ end
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,53 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Avmtrf1
4
+ module Tools
5
+ class Runner < ::EacRubyUtils::Console::DocoptRunner
6
+ class Forponto < ::EacRubyUtils::Console::DocoptRunner
7
+ class Espelho < ::EacRubyUtils::Console::DocoptRunner
8
+ include ::EacRubyUtils::SimpleCache
9
+ include ::EacRubyUtils::Console::Speaker
10
+
11
+ DOC = <<~DOCOPT
12
+ Recupera e trata dados do Forponto.
13
+
14
+ Usage:
15
+ __PROGRAM__ [options] <year> <month>
16
+ __PROGRAM__ -h | --help
17
+
18
+ Options:
19
+ -h --help Show this screen.
20
+ DOCOPT
21
+
22
+ def run
23
+ infov 'Start date', user_month.start_date
24
+ infov 'End date', user_month.end_date
25
+ out(fetched_data.to_yaml)
26
+ end
27
+
28
+ private
29
+
30
+ def fetched_data
31
+ user_month.data
32
+ end
33
+
34
+ def user_month_uncached
35
+ context(:user).month(year, month)
36
+ end
37
+
38
+ def year
39
+ options.fetch('<year>').to_i
40
+ end
41
+
42
+ def month
43
+ options.fetch('<month>').to_i
44
+ end
45
+
46
+ def date(day)
47
+ ::Date.civil(year, month, day)
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Avmtrf1
4
4
  module Tools
5
- VERSION = '0.9.0'
5
+ VERSION = '0.10.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.9.0
4
+ version: 0.10.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-10-02 00:00:00.000000000 Z
11
+ date: 2019-10-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: aranha-parsers
@@ -50,14 +50,20 @@ dependencies:
50
50
  requirements:
51
51
  - - "~>"
52
52
  - !ruby/object:Gem::Version
53
- version: '0.12'
53
+ version: '0.15'
54
+ - - ">="
55
+ - !ruby/object:Gem::Version
56
+ version: 0.15.1
54
57
  type: :runtime
55
58
  prerelease: false
56
59
  version_requirements: !ruby/object:Gem::Requirement
57
60
  requirements:
58
61
  - - "~>"
59
62
  - !ruby/object:Gem::Version
60
- version: '0.12'
63
+ version: '0.15'
64
+ - - ">="
65
+ - !ruby/object:Gem::Version
66
+ version: 0.15.1
61
67
  - !ruby/object:Gem::Dependency
62
68
  name: curb
63
69
  requirement: !ruby/object:Gem::Requirement
@@ -79,6 +85,9 @@ dependencies:
79
85
  - - "~>"
80
86
  - !ruby/object:Gem::Version
81
87
  version: '0.6'
88
+ - - ">="
89
+ - !ruby/object:Gem::Version
90
+ version: 0.6.2
82
91
  type: :runtime
83
92
  prerelease: false
84
93
  version_requirements: !ruby/object:Gem::Requirement
@@ -86,20 +95,23 @@ dependencies:
86
95
  - - "~>"
87
96
  - !ruby/object:Gem::Version
88
97
  version: '0.6'
98
+ - - ">="
99
+ - !ruby/object:Gem::Version
100
+ version: 0.6.2
89
101
  - !ruby/object:Gem::Dependency
90
102
  name: eac_ruby_utils
91
103
  requirement: !ruby/object:Gem::Requirement
92
104
  requirements:
93
105
  - - "~>"
94
106
  - !ruby/object:Gem::Version
95
- version: '0.12'
107
+ version: '0.15'
96
108
  type: :runtime
97
109
  prerelease: false
98
110
  version_requirements: !ruby/object:Gem::Requirement
99
111
  requirements:
100
112
  - - "~>"
101
113
  - !ruby/object:Gem::Version
102
- version: '0.12'
114
+ version: '0.15'
103
115
  - !ruby/object:Gem::Dependency
104
116
  name: filesize
105
117
  requirement: !ruby/object:Gem::Requirement
@@ -229,7 +241,17 @@ files:
229
241
  - lib/avmtrf1/esosti/session/login.rb
230
242
  - lib/avmtrf1/esosti/session/solicitacao.rb
231
243
  - lib/avmtrf1/esosti/session/solicitacao/main.rb
232
- - lib/avmtrf1/filesystem_cache.rb
244
+ - lib/avmtrf1/forponto/parsers/espelho.rb
245
+ - lib/avmtrf1/forponto/parsers/espelho/day_node.rb
246
+ - lib/avmtrf1/forponto/parsers/espelho/methods_as_fields.rb
247
+ - lib/avmtrf1/forponto/parsers/espelho/row_node.rb
248
+ - lib/avmtrf1/forponto/parsers/espelho/rows_consumer.rb
249
+ - lib/avmtrf1/forponto/parsers/espelho/sub_node.rb
250
+ - lib/avmtrf1/forponto/parsers/espelho/summary_node.rb
251
+ - lib/avmtrf1/forponto/parsers/espelho/utils.rb
252
+ - lib/avmtrf1/forponto/session.rb
253
+ - lib/avmtrf1/forponto/user.rb
254
+ - lib/avmtrf1/forponto/user/month.rb
233
255
  - lib/avmtrf1/fs_cache.rb
234
256
  - lib/avmtrf1/git.rb
235
257
  - lib/avmtrf1/git/cached_repository.rb
@@ -283,6 +305,8 @@ files:
283
305
  - lib/avmtrf1/tools/runner/check_point.rb
284
306
  - lib/avmtrf1/tools/runner/check_point/login.rb
285
307
  - lib/avmtrf1/tools/runner/esosti.rb
308
+ - lib/avmtrf1/tools/runner/forponto.rb
309
+ - lib/avmtrf1/tools/runner/forponto/espelho.rb
286
310
  - lib/avmtrf1/tools/runner/git.rb
287
311
  - lib/avmtrf1/tools/runner/git/issues_check.rb
288
312
  - lib/avmtrf1/tools/runner/git/push_large.rb
@@ -1,53 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Avmtrf1
4
- class FilesystemCache
5
- attr_reader :path
6
-
7
- def initialize(*path_parts)
8
- raise ArgumentError, "\"#{path_parts}\" is empty" if path_parts.empty?
9
-
10
- @path = ::File.join(*path_parts.map(&:to_s))
11
- end
12
-
13
- def read
14
- check_file
15
- return nil unless ::File.exist?(path)
16
-
17
- ::File.read(path)
18
- end
19
-
20
- def write(value)
21
- raise "\"#{value}\" is blank" if value.blank?
22
-
23
- check_file
24
- ::File.write(path, value)
25
- value
26
- end
27
-
28
- def sub(*path_parts)
29
- self.class.new(absolute_path, *path_parts)
30
- end
31
-
32
- def absolute_path
33
- ::File.expand_path(path)
34
- end
35
-
36
- def dirname
37
- ::File.dirname
38
- end
39
-
40
- private
41
-
42
- def check_file
43
- dirname = ::File.dirname(absolute_path)
44
- raise "#{dirname}|#{dirname.class}" unless dirname.is_a?(String)
45
-
46
- ::FileUtils.mkdir_p(dirname)
47
- return unless ::File.exist?(absolute_path)
48
- return if ::File.file?(absolute_path)
49
-
50
- raise "\"#{absolute_path}\" exist and is not a path"
51
- end
52
- end
53
- end