avmtrf1-tools 0.9.0 → 0.10.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: 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