eac_tools 0.37.2 → 0.38.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (128) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +55 -48
  3. data/lib/eac_tools/version.rb +1 -1
  4. data/sub/aranha-parsers/Gemfile +8 -0
  5. data/sub/aranha-parsers/aranha-parsers.gemspec +25 -0
  6. data/sub/aranha-parsers/lib/aranha/parsers/base.rb +81 -0
  7. data/sub/aranha-parsers/lib/aranha/parsers/html/base.rb +47 -0
  8. data/sub/aranha-parsers/lib/aranha/parsers/html/item.rb +24 -0
  9. data/sub/aranha-parsers/lib/aranha/parsers/html/item_list.rb +33 -0
  10. data/sub/aranha-parsers/lib/aranha/parsers/html/node/base.rb +34 -0
  11. data/sub/aranha-parsers/lib/aranha/parsers/html/node/default/numeric_support.rb +70 -0
  12. data/sub/aranha-parsers/lib/aranha/parsers/html/node/default/string_support.rb +77 -0
  13. data/sub/aranha-parsers/lib/aranha/parsers/html/node/default.rb +34 -0
  14. data/sub/aranha-parsers/lib/aranha/parsers/html/node.rb +13 -0
  15. data/sub/aranha-parsers/lib/aranha/parsers/html.rb +11 -0
  16. data/sub/aranha-parsers/lib/aranha/parsers/invalid_state_exception.rb +8 -0
  17. data/sub/aranha-parsers/lib/aranha/parsers/json/base.rb +20 -0
  18. data/sub/aranha-parsers/lib/aranha/parsers/json.rb +11 -0
  19. data/sub/aranha-parsers/lib/aranha/parsers/patches/ofx_parser.rb +38 -0
  20. data/sub/aranha-parsers/lib/aranha/parsers/patches.rb +11 -0
  21. data/sub/aranha-parsers/lib/aranha/parsers/rspec/setup.rb +15 -0
  22. data/sub/aranha-parsers/lib/aranha/parsers/rspec/shared_examples/source_target_fixtures.rb +74 -0
  23. data/sub/aranha-parsers/lib/aranha/parsers/rspec/source_target_fixtures_controller.rb +39 -0
  24. data/sub/aranha-parsers/lib/aranha/parsers/rspec.rb +11 -0
  25. data/sub/aranha-parsers/lib/aranha/parsers/source_address/fetch_content_error.rb +10 -0
  26. data/sub/aranha-parsers/lib/aranha/parsers/source_address/file.rb +31 -0
  27. data/sub/aranha-parsers/lib/aranha/parsers/source_address/hash_http_base.rb +92 -0
  28. data/sub/aranha-parsers/lib/aranha/parsers/source_address/hash_http_get.rb +13 -0
  29. data/sub/aranha-parsers/lib/aranha/parsers/source_address/hash_http_post.rb +13 -0
  30. data/sub/aranha-parsers/lib/aranha/parsers/source_address/http_get.rb +59 -0
  31. data/sub/aranha-parsers/lib/aranha/parsers/source_address.rb +57 -0
  32. data/sub/aranha-parsers/lib/aranha/parsers/source_target_fixtures/source_target_file.rb +19 -0
  33. data/sub/aranha-parsers/lib/aranha/parsers/source_target_fixtures.rb +78 -0
  34. data/sub/aranha-parsers/lib/aranha/parsers/version.rb +7 -0
  35. data/sub/aranha-parsers/lib/aranha/parsers.rb +9 -0
  36. data/sub/aranha-parsers/spec/lib/aranha/parsers/rspec/shared_examples/source_target_fixtures_spec.rb +9 -0
  37. data/sub/aranha-parsers/spec/lib/aranha/parsers/rspec/shared_examples/source_target_fixtures_spec_files/fixture1.source.txt +1 -0
  38. data/sub/aranha-parsers/spec/lib/aranha/parsers/rspec/shared_examples/source_target_fixtures_spec_files/fixture1.target.yaml +3 -0
  39. data/sub/aranha-parsers/spec/lib/aranha/parsers/source_address/http_get_spec.rb +21 -0
  40. data/sub/aranha-parsers/spec/lib/aranha/parsers/source_address_spec.rb +74 -0
  41. data/sub/aranha-parsers/spec/lib/aranha/parsers/source_target_fixtures_spec.rb +27 -0
  42. data/sub/aranha-parsers/spec/lib/aranha/parsers/source_target_fixtures_spec_files/stub1.source.txt +1 -0
  43. data/sub/aranha-parsers/spec/lib/aranha/parsers/source_target_fixtures_spec_files/stub1.target.html +1 -0
  44. data/sub/aranha-parsers/spec/lib/aranha/parsers/source_target_fixtures_spec_files/stub2.source.html +1 -0
  45. data/sub/aranha-parsers/spec/lib/aranha/parsers/source_target_fixtures_spec_files/stub3.target.yaml +1 -0
  46. data/sub/aranha-parsers/spec/lib/rubocop_check_spec.rb +3 -0
  47. data/sub/aranha-parsers/spec/spec_helper.rb +4 -0
  48. data/sub/avm/avm.gemspec +2 -0
  49. data/sub/avm/lib/avm/executables.rb +1 -1
  50. data/sub/avm/lib/avm/file_formats/base.rb +2 -1
  51. data/sub/{avm-files/lib/avm/files/formatter.rb → avm/lib/avm/file_formats/search_formatter.rb} +17 -11
  52. data/sub/avm/lib/avm/file_formats/utf8_assert.rb +72 -0
  53. data/sub/avm/lib/avm/rspec/setup.rb +2 -1
  54. data/sub/avm/lib/avm/rspec/shared_examples/avm_file_formats_with_fixtures.rb +32 -0
  55. data/sub/avm/lib/avm/version.rb +1 -1
  56. data/sub/avm-eac_generic_base0/avm-eac_generic_base0.gemspec +1 -1
  57. data/sub/avm-eac_generic_base0/lib/avm/eac_generic_base0/file_formats/base.rb +2 -2
  58. data/sub/avm-eac_generic_base0/lib/avm/eac_generic_base0/version.rb +1 -1
  59. data/sub/avm-eac_generic_base0/spec/lib/avm/eac_generic_base0/file_formats/base_spec.rb +7 -0
  60. data/sub/{avm-tools/spec/lib/avm/tools/runner/files/format_spec_files → avm-eac_generic_base0/spec/lib/avm/eac_generic_base0/file_formats/base_spec_files}/plain_text.source +0 -0
  61. data/sub/{avm-tools/spec/lib/avm/tools/runner/files/format_spec_files → avm-eac_generic_base0/spec/lib/avm/eac_generic_base0/file_formats/base_spec_files}/plain_text.target +0 -0
  62. data/sub/avm-eac_latex_base0/avm-eac_latex_base0.gemspec +3 -3
  63. data/sub/avm-eac_latex_base0/lib/avm/eac_latex_base0/executables.rb +22 -0
  64. data/sub/avm-eac_latex_base0/lib/avm/eac_latex_base0/sources/build.rb +3 -1
  65. data/sub/avm-eac_latex_base0/lib/avm/eac_latex_base0/version.rb +1 -1
  66. data/sub/avm-eac_php_base0/avm-eac_php_base0.gemspec +2 -2
  67. data/sub/avm-eac_php_base0/lib/avm/eac_php_base0/executables.rb +22 -0
  68. data/sub/avm-eac_php_base0/lib/avm/eac_php_base0/file_formats/base.rb +2 -2
  69. data/sub/avm-eac_php_base0/lib/avm/eac_php_base0/version.rb +1 -1
  70. data/sub/avm-eac_php_base0/spec/lib/avm/eac_php_base0/file_formats/base_spec.rb +7 -0
  71. data/sub/{avm-tools/spec/lib/avm/tools/runner/files/format_spec_files → avm-eac_php_base0/spec/lib/avm/eac_php_base0/file_formats/base_spec_files}/php_code.php.source +0 -0
  72. data/sub/{avm-tools/spec/lib/avm/tools/runner/files/format_spec_files → avm-eac_php_base0/spec/lib/avm/eac_php_base0/file_formats/base_spec_files}/php_code.php.target +0 -0
  73. data/sub/{avm-tools/spec/lib/avm/tools/runner/files/format_spec_files → avm-eac_php_base0/spec/lib/avm/eac_php_base0/file_formats/base_spec_files}/php_code2.php.source +0 -0
  74. data/sub/{avm-tools/spec/lib/avm/tools/runner/files/format_spec_files → avm-eac_php_base0/spec/lib/avm/eac_php_base0/file_formats/base_spec_files}/php_code2.php.target +0 -0
  75. data/sub/{avm-tools/spec/lib/avm/tools/runner/files/format_spec_files → avm-eac_php_base0/spec/lib/avm/eac_php_base0/file_formats/base_spec_files}/php_html_code.php.source +0 -0
  76. data/sub/{avm-tools/spec/lib/avm/tools/runner/files/format_spec_files → avm-eac_php_base0/spec/lib/avm/eac_php_base0/file_formats/base_spec_files}/php_html_code.php.target +0 -0
  77. data/sub/{avm-tools/spec/lib/avm/tools/runner/files/format_spec_files → avm-eac_php_base0/spec/lib/avm/eac_php_base0/file_formats/base_spec_files}/php_iso88591_code.php.source +0 -0
  78. data/sub/{avm-tools/spec/lib/avm/tools/runner/files/format_spec_files → avm-eac_php_base0/spec/lib/avm/eac_php_base0/file_formats/base_spec_files}/php_iso88591_code.php.target +0 -0
  79. data/sub/avm-eac_python_base0/avm-eac_python_base0.gemspec +2 -2
  80. data/sub/avm-eac_python_base0/lib/avm/eac_python_base0/executables.rb +22 -0
  81. data/sub/avm-eac_python_base0/lib/avm/eac_python_base0/file_formats/base.rb +2 -2
  82. data/sub/avm-eac_python_base0/lib/avm/eac_python_base0/version.rb +1 -1
  83. data/sub/avm-eac_python_base0/spec/lib/avm/eac_python_base0/file_formats/base_spec.rb +7 -0
  84. data/sub/{avm-tools/spec/lib/avm/tools/runner/files/format_spec_files → avm-eac_python_base0/spec/lib/avm/eac_python_base0/file_formats/base_spec_files}/python_code.source +0 -0
  85. data/sub/{avm-tools/spec/lib/avm/tools/runner/files/format_spec_files → avm-eac_python_base0/spec/lib/avm/eac_python_base0/file_formats/base_spec_files}/python_code.target +0 -0
  86. data/sub/avm-eac_ruby_base1/avm-eac_ruby_base1.gemspec +3 -3
  87. data/sub/avm-eac_ruby_base1/lib/avm/eac_ruby_base1/version.rb +1 -1
  88. data/sub/avm-eac_ruby_base1/spec/lib/avm/eac_ruby_base1/file_formats/base_spec.rb +7 -0
  89. data/sub/{avm-tools/spec/lib/avm/tools/runner/files/format_spec_files → avm-eac_ruby_base1/spec/lib/avm/eac_ruby_base1/file_formats/base_spec_files}/Gemfile.source +0 -0
  90. data/sub/{avm-tools/spec/lib/avm/tools/runner/files/format_spec_files → avm-eac_ruby_base1/spec/lib/avm/eac_ruby_base1/file_formats/base_spec_files}/Gemfile.target +0 -0
  91. data/sub/{avm-tools/spec/lib/avm/tools/runner/files/format_spec_files → avm-eac_ruby_base1/spec/lib/avm/eac_ruby_base1/file_formats/base_spec_files}/ruby_code.rb.source +0 -0
  92. data/sub/{avm-tools/spec/lib/avm/tools/runner/files/format_spec_files → avm-eac_ruby_base1/spec/lib/avm/eac_ruby_base1/file_formats/base_spec_files}/ruby_code.rb.target +0 -0
  93. data/sub/avm-eac_webapp_base0/avm-eac_webapp_base0.gemspec +3 -3
  94. data/sub/avm-eac_webapp_base0/lib/avm/eac_webapp_base0/executables.rb +26 -0
  95. data/sub/avm-eac_webapp_base0/lib/avm/eac_webapp_base0/file_formats/css/file_apply.rb +48 -0
  96. data/sub/avm-eac_webapp_base0/lib/avm/eac_webapp_base0/file_formats/css.rb +22 -0
  97. data/sub/avm-eac_webapp_base0/lib/avm/eac_webapp_base0/file_formats/javascript.rb +2 -2
  98. data/sub/avm-eac_webapp_base0/lib/avm/eac_webapp_base0/file_formats/provider.rb +2 -1
  99. data/sub/avm-eac_webapp_base0/lib/avm/eac_webapp_base0/file_formats/xml.rb +2 -2
  100. data/sub/avm-eac_webapp_base0/lib/avm/eac_webapp_base0/version.rb +1 -1
  101. data/sub/avm-eac_webapp_base0/spec/lib/avm/eac_webapp_base0/file_formats/css_spec.rb +7 -0
  102. data/sub/avm-eac_webapp_base0/spec/lib/avm/eac_webapp_base0/file_formats/css_spec_files/css1.source.css +11 -0
  103. data/sub/avm-eac_webapp_base0/spec/lib/avm/eac_webapp_base0/file_formats/css_spec_files/css1.target.css +11 -0
  104. data/sub/avm-eac_webapp_base0/spec/lib/avm/eac_webapp_base0/file_formats/html_spec.rb +7 -0
  105. data/sub/{avm-tools/spec/lib/avm/tools/runner/files/format_spec_files → avm-eac_webapp_base0/spec/lib/avm/eac_webapp_base0/file_formats/html_spec_files}/html_code.html.erb.source +0 -0
  106. data/sub/{avm-tools/spec/lib/avm/tools/runner/files/format_spec_files → avm-eac_webapp_base0/spec/lib/avm/eac_webapp_base0/file_formats/html_spec_files}/html_code.html.erb.target +0 -0
  107. data/sub/{avm-tools/spec/lib/avm/tools/runner/files/format_spec_files → avm-eac_webapp_base0/spec/lib/avm/eac_webapp_base0/file_formats/html_spec_files}/html_code.html.source +0 -0
  108. data/sub/{avm-tools/spec/lib/avm/tools/runner/files/format_spec_files → avm-eac_webapp_base0/spec/lib/avm/eac_webapp_base0/file_formats/html_spec_files}/html_code.html.target +0 -0
  109. data/sub/avm-eac_webapp_base0/spec/lib/avm/eac_webapp_base0/file_formats/javascript_spec.rb +7 -0
  110. data/sub/{avm-tools/spec/lib/avm/tools/runner/files/format_spec_files → avm-eac_webapp_base0/spec/lib/avm/eac_webapp_base0/file_formats/javascript_spec_files}/javascript_code1.js.source +0 -0
  111. data/sub/{avm-tools/spec/lib/avm/tools/runner/files/format_spec_files → avm-eac_webapp_base0/spec/lib/avm/eac_webapp_base0/file_formats/javascript_spec_files}/javascript_code1.js.target +0 -0
  112. data/sub/avm-eac_webapp_base0/spec/lib/avm/eac_webapp_base0/file_formats/json_spec.rb +7 -0
  113. data/sub/{avm-tools/spec/lib/avm/tools/runner/files/format_spec_files → avm-eac_webapp_base0/spec/lib/avm/eac_webapp_base0/file_formats/json_spec_files}/json_code.json.source +0 -0
  114. data/sub/{avm-tools/spec/lib/avm/tools/runner/files/format_spec_files → avm-eac_webapp_base0/spec/lib/avm/eac_webapp_base0/file_formats/json_spec_files}/json_code.json.target +0 -0
  115. data/sub/avm-eac_webapp_base0/spec/lib/avm/eac_webapp_base0/file_formats/xml_spec.rb +7 -0
  116. data/sub/{avm-tools/spec/lib/avm/tools/runner/files/format_spec_files → avm-eac_webapp_base0/spec/lib/avm/eac_webapp_base0/file_formats/xml_spec_files}/xml_code.xml.source +0 -0
  117. data/sub/{avm-tools/spec/lib/avm/tools/runner/files/format_spec_files → avm-eac_webapp_base0/spec/lib/avm/eac_webapp_base0/file_formats/xml_spec_files}/xml_code.xml.target +0 -0
  118. data/sub/avm-files/avm-files.gemspec +2 -2
  119. data/sub/avm-files/lib/avm/files/version.rb +1 -1
  120. data/sub/avm-tools/avm-tools.gemspec +4 -7
  121. data/sub/avm-tools/lib/avm/tools/runner/files/format.rb +5 -5
  122. data/sub/avm-tools/lib/avm/tools/runner/git/auto_commit.rb +4 -2
  123. data/sub/avm-tools/lib/avm/tools/version.rb +1 -1
  124. data/sub/eac_ruby_utils/lib/eac_ruby_utils/patches/object/to_bool.rb +12 -0
  125. data/sub/eac_ruby_utils/lib/eac_ruby_utils/version.rb +1 -1
  126. metadata +113 -51
  127. data/sub/avm-files/lib/avm/files/formatter/utf8_assert.rb +0 -74
  128. data/sub/avm-tools/spec/lib/avm/tools/runner/files/format_spec.rb +0 -56
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'aranha/parsers/base'
4
+ require 'json'
5
+
6
+ module Aranha
7
+ module Parsers
8
+ module Json
9
+ class Base < ::Aranha::Parsers::Base
10
+ def data
11
+ default_data
12
+ end
13
+
14
+ def default_data
15
+ ::JSON.parse(content)
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/core_ext'
4
+
5
+ module Aranha
6
+ module Parsers
7
+ module Json
8
+ require_sub __FILE__
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'ofx-parser'
4
+
5
+ module Aranha
6
+ module Parsers
7
+ module Patches
8
+ module OfxParser
9
+ module OfxParser
10
+ def self.included(base)
11
+ base.class_eval do
12
+ class << self
13
+ prepend ClassMethods
14
+ end
15
+ end
16
+ end
17
+
18
+ module ClassMethods
19
+ def build_transaction(transaction)
20
+ r = super
21
+ r.currate = (transaction / 'CURRENCY/CURRATE').inner_text
22
+ r
23
+ end
24
+ end
25
+ end
26
+
27
+ module Transaction
28
+ attr_accessor :currate, :cursym
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
34
+
35
+ require 'eac_ruby_utils/patch'
36
+
37
+ ::EacRubyUtils.patch(::OfxParser::OfxParser, ::Aranha::Parsers::Patches::OfxParser::OfxParser)
38
+ ::EacRubyUtils.patch(::OfxParser::Transaction, ::Aranha::Parsers::Patches::OfxParser::Transaction)
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/require_sub'
4
+
5
+ module Aranha
6
+ module Parsers
7
+ module Patches
8
+ ::EacRubyUtils.require_sub __FILE__
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/core_ext'
4
+
5
+ module Aranha
6
+ module Parsers
7
+ module Rspec
8
+ module Setup
9
+ def self.extended(_setup_obj)
10
+ require 'aranha/parsers/rspec/shared_examples/source_target_fixtures'
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,74 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'aranha/parsers/rspec/source_target_fixtures_controller'
4
+ require 'aranha/parsers/source_target_fixtures'
5
+ require 'yaml'
6
+
7
+ RSpec.shared_examples 'source_target_fixtures' do |spec_file| # rubocop:disable Metrics/BlockLength
8
+ fixtures_controller = ::Aranha::Parsers::Rspec::SourceTargetFixturesController
9
+ .new(self, spec_file)
10
+
11
+ let(:fixtures_controller) { fixtures_controller }
12
+ let(:spec_file) { spec_file }
13
+
14
+ it 'fixtures directory should exist' do
15
+ expect(::File.directory?(fixtures_controller.fixtures_dir)).to be true
16
+ end
17
+
18
+ context 'with fixtures directory' do
19
+ it 'has at least one file' do
20
+ expect(source_target_fixtures.source_target_files.count).to be > 0 # rubocop:disable Style/NumericPredicate
21
+ end
22
+
23
+ fixtures_controller.source_target_fixtures.source_target_files.each do |st|
24
+ context "when source file is \"#{::File.basename(st.source)}\"" do
25
+ if fixtures_controller.write_target_fixtures?
26
+ it 'writes target data' do
27
+ sd = sort_results(source_data(st.source))
28
+ basename = ::Aranha::Parsers::SourceTargetFixtures.source_target_basename(st.source)
29
+ target_file = File.expand_path("../#{basename}.target#{target_file_extname}", st.source)
30
+ File.write(target_file, target_content(sd))
31
+ end
32
+ else
33
+ it 'parses data' do
34
+ assert_source_target_complete(st)
35
+ sd = source_data(st.source)
36
+ td = target_data(st.target)
37
+ expect(sort_results(sd)).to eq(sort_results(td))
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
43
+
44
+ delegate :source_target_fixtures, to: :fixtures_controller
45
+
46
+ def assert_source_target_complete(source_target)
47
+ expect(source_target.source).to(be_truthy, "Source not found (Target: #{source_target.target})")
48
+ expect(source_target.target).to(be_truthy, "Target not found (Source: #{source_target.source})")
49
+ end
50
+
51
+ def source_data(source_file)
52
+ instance = described_class.new(source_file)
53
+ return instance.data if instance.respond_to?(:data)
54
+
55
+ raise "#{instance} has no \"data\" method. You need to implement \"#{instance}.data\" or " \
56
+ "\"#{self}.source_data(source_file)\""
57
+ end
58
+
59
+ def sort_results(results)
60
+ results
61
+ end
62
+
63
+ def target_data(target_file)
64
+ ::YAML.load_file(target_file)
65
+ end
66
+
67
+ def target_content(data)
68
+ data.to_yaml
69
+ end
70
+
71
+ def target_file_extname
72
+ '.yaml'
73
+ end
74
+ end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/core_ext'
4
+
5
+ module Aranha
6
+ module Parsers
7
+ module Rspec
8
+ class SourceTargetFixturesController
9
+ enable_simple_cache
10
+ common_constructor :example, :spec_file
11
+
12
+ def default_fixtures_dir
13
+ ::File.join(
14
+ ::File.dirname(spec_file),
15
+ ::File.basename(spec_file, '.*') + '_files'
16
+ )
17
+ end
18
+
19
+ def fixtures_dir
20
+ if example.respond_to?(:fixtures_dir)
21
+ example.fixtures_dir
22
+ else
23
+ default_fixtures_dir
24
+ end
25
+ end
26
+
27
+ def write_target_fixtures?
28
+ ENV['WRITE_TARGET_FIXTURES'].to_bool
29
+ end
30
+
31
+ private
32
+
33
+ def source_target_fixtures_uncached
34
+ ::Aranha::Parsers::SourceTargetFixtures.new(fixtures_dir)
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/core_ext'
4
+
5
+ module Aranha
6
+ module Parsers
7
+ module Rspec
8
+ require_sub __FILE__
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Aranha
4
+ module Parsers
5
+ class SourceAddress
6
+ class FetchContentError < ::RuntimeError
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'aranha/parsers/source_address/http_get'
4
+
5
+ module Aranha
6
+ module Parsers
7
+ class SourceAddress
8
+ class File < ::Aranha::Parsers::SourceAddress::HttpGet
9
+ SCHEME = 'file://'
10
+
11
+ class << self
12
+ def valid_source?(source)
13
+ source.to_s.start_with?(SCHEME + '/', '/')
14
+ end
15
+ end
16
+
17
+ def initialize(source)
18
+ super source.to_s.gsub(/\A#{Regexp.quote(SCHEME)}/, '')
19
+ end
20
+
21
+ def url
22
+ "#{SCHEME}#{source}"
23
+ end
24
+
25
+ def content
26
+ ::File.open(source, &:read)
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,92 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'aranha/parsers/source_address/fetch_content_error'
4
+ require 'aranha/parsers/source_address/hash_http_base'
5
+ require 'eac_ruby_utils/core_ext'
6
+ require 'faraday_middleware'
7
+ require 'faraday/gzip'
8
+ require 'yaml'
9
+
10
+ module Aranha
11
+ module Parsers
12
+ class SourceAddress
13
+ class HashHttpBase
14
+ class << self
15
+ def http_method
16
+ const_get 'HTTP_METHOD'
17
+ end
18
+
19
+ def valid_source?(source)
20
+ source.is_a?(::Hash) &&
21
+ source.with_indifferent_access[:method].to_s.downcase.strip == http_method.to_s
22
+ end
23
+ end
24
+
25
+ DEFAULT_BODY = ''
26
+ DEFAULT_FOLLOW_REDIRECT = true
27
+ DEFAULT_HEADERS = {}.freeze
28
+ DEFAULT_PARAMS = {}.freeze
29
+
30
+ enable_simple_cache
31
+
32
+ common_constructor :source do
33
+ self.source = source.with_indifferent_access
34
+ end
35
+ compare_by :source
36
+
37
+ def body
38
+ param(:body, DEFAULT_BODY)
39
+ end
40
+
41
+ def follow_redirect?
42
+ param(:follow_redirect, DEFAULT_FOLLOW_REDIRECT)
43
+ end
44
+
45
+ def headers
46
+ param(:headers, DEFAULT_HEADERS)
47
+ end
48
+
49
+ def url
50
+ source.fetch(:url)
51
+ end
52
+
53
+ def serialize
54
+ source.to_yaml
55
+ end
56
+
57
+ # @return [Faraday]
58
+ def faraday_connection
59
+ ::Faraday.new do |f|
60
+ f.request :gzip
61
+ f.response :follow_redirects if follow_redirect?
62
+ end
63
+ end
64
+
65
+ def content
66
+ req = faraday_request
67
+ return req.body if req.status == 200
68
+
69
+ raise ::Aranha::Parsers::SourceAddress::FetchContentError,
70
+ "Get #{url} returned #{req.status.to_i}"
71
+ end
72
+
73
+ def param(key, default_value)
74
+ source[key] || params[key] || default_value
75
+ end
76
+
77
+ def params
78
+ source[:params].if_present(DEFAULT_PARAMS)
79
+ end
80
+
81
+ private
82
+
83
+ def faraday_request_uncached
84
+ faraday_connection.send(self.class.http_method, url) do |req|
85
+ headers.if_present { |v| req.headers = v }
86
+ body.if_present { |v| req.body = v }
87
+ end
88
+ end
89
+ end
90
+ end
91
+ end
92
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'aranha/parsers/source_address/hash_http_base'
4
+
5
+ module Aranha
6
+ module Parsers
7
+ class SourceAddress
8
+ class HashHttpGet < ::Aranha::Parsers::SourceAddress::HashHttpBase
9
+ HTTP_METHOD = :get
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'aranha/parsers/source_address/hash_http_base'
4
+
5
+ module Aranha
6
+ module Parsers
7
+ class SourceAddress
8
+ class HashHttpPost < ::Aranha::Parsers::SourceAddress::HashHttpBase
9
+ HTTP_METHOD = :post
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,59 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'addressable'
4
+ require 'curb'
5
+ require 'aranha/parsers/source_address/fetch_content_error'
6
+ require 'faraday_middleware'
7
+
8
+ module Aranha
9
+ module Parsers
10
+ class SourceAddress
11
+ class HttpGet
12
+ class << self
13
+ def location_uri(source_uri, location)
14
+ ::Addressable::URI.join(source_uri, location).to_s
15
+ end
16
+
17
+ def valid_source?(source)
18
+ source.to_s =~ %r{\Ahttps?://}
19
+ end
20
+ end
21
+
22
+ attr_reader :source
23
+
24
+ def initialize(source)
25
+ @source = source.to_s
26
+ end
27
+
28
+ def ==(other)
29
+ self.class == other.class && source == other.source
30
+ end
31
+
32
+ def url
33
+ source
34
+ end
35
+
36
+ def final_url
37
+ content unless @final_url
38
+ @final_url
39
+ end
40
+
41
+ def content
42
+ conn = ::Faraday.new do |f|
43
+ f.request :retry # retry transient failures
44
+ f.response :follow_redirects # follow redirects
45
+ end
46
+ c = conn.get(url)
47
+ return c.body if c.status == 200
48
+
49
+ raise ::Aranha::Parsers::SourceAddress::FetchContentError,
50
+ "Get #{url} returned #{c.status.to_i}"
51
+ end
52
+
53
+ def serialize
54
+ url
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'active_support/core_ext/module/delegation'
4
+ require 'eac_ruby_utils/core_ext'
5
+ require 'yaml'
6
+
7
+ module Aranha
8
+ module Parsers
9
+ class SourceAddress
10
+ require_sub __FILE__
11
+
12
+ class << self
13
+ SUBS = [
14
+ ::Aranha::Parsers::SourceAddress::HashHttpGet,
15
+ ::Aranha::Parsers::SourceAddress::HashHttpPost,
16
+ ::Aranha::Parsers::SourceAddress::HttpGet,
17
+ ::Aranha::Parsers::SourceAddress::File
18
+ ].freeze
19
+
20
+ def detect_sub(source)
21
+ return source.sub if source.is_a?(self)
22
+
23
+ SUBS.each do |sub|
24
+ return sub.new(source) if sub.valid_source?(source)
25
+ end
26
+ raise "No content fetcher found for source \"#{source}\""
27
+ end
28
+
29
+ def deserialize(string)
30
+ new(string =~ %r{\A[a-z]+://} ? string.strip : ::YAML.load(string)) # rubocop:disable Security/YAMLLoad
31
+ end
32
+
33
+ def from_file(path)
34
+ deserialize(::File.read(path))
35
+ end
36
+ end
37
+
38
+ enable_simple_cache
39
+ common_constructor :source
40
+ delegate :content, :url, to: :sub
41
+
42
+ def to_s
43
+ sub.url
44
+ end
45
+
46
+ def serialize
47
+ sub.serialize.strip + "\n"
48
+ end
49
+
50
+ private
51
+
52
+ def sub_uncached
53
+ self.class.detect_sub(source)
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Aranha
4
+ module Parsers
5
+ class SourceTargetFixtures
6
+ class SourceTargetFile
7
+ common_constructor :owner, :basename
8
+
9
+ def source
10
+ owner.source_file(basename)
11
+ end
12
+
13
+ def target
14
+ owner.target_file(basename)
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,78 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'active_support/core_ext/object'
4
+ require 'active_support/core_ext/string'
5
+
6
+ module Aranha
7
+ module Parsers
8
+ # Lists pairs of source/target files in a directory.
9
+ class SourceTargetFixtures
10
+ require_sub __FILE__
11
+
12
+ class << self
13
+ def source_target_basename(file)
14
+ m = /^(.+)\.(?:source|target)(?:\..+)?$/.match(File.basename(file))
15
+ m ? m[1] : nil
16
+ end
17
+ end
18
+
19
+ attr_reader :fixtures_directory
20
+
21
+ def initialize(fixtures_directory)
22
+ @fixtures_directory = fixtures_directory
23
+ end
24
+
25
+ def source_target_files
26
+ sources_targets_basenames.map do |basename|
27
+ ::Aranha::Parsers::SourceTargetFixtures::SourceTargetFile.new(self, basename)
28
+ end
29
+ end
30
+
31
+ def source_files
32
+ r = []
33
+ source_target_files.each do |st|
34
+ r << st.source if st.source
35
+ end
36
+ r
37
+ end
38
+
39
+ def target_files
40
+ r = []
41
+ source_target_files.each do |st|
42
+ r << st.target if st.target
43
+ end
44
+ r
45
+ end
46
+
47
+ def target_file(basename)
48
+ fixture_file(basename, 'target')
49
+ end
50
+
51
+ def source_file(basename)
52
+ fixture_file(basename, 'source')
53
+ end
54
+
55
+ private
56
+
57
+ def fixture_file(basename, suffix)
58
+ prefix = "#{basename}.#{suffix}"
59
+ Dir.foreach(fixtures_directory) do |item|
60
+ next if %w[. ..].include?(item)
61
+ return File.expand_path(item, fixtures_directory) if item.starts_with?(prefix)
62
+ end
63
+ nil
64
+ end
65
+
66
+ def sources_targets_basenames
67
+ basenames = Set.new
68
+ Dir.foreach(fixtures_directory) do |item|
69
+ next if %w[. ..].include?(item)
70
+
71
+ b = self.class.source_target_basename(item)
72
+ basenames << b if b.present?
73
+ end
74
+ basenames
75
+ end
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Aranha
4
+ module Parsers
5
+ VERSION = '0.14.4'
6
+ end
7
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/require_sub'
4
+
5
+ module Aranha
6
+ module Parsers
7
+ ::EacRubyUtils.require_sub __FILE__
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ ::RSpec.describe 'RSpec.shared_examples(\'source_target_fixtures\')' do # rubocop:disable RSpec/DescribeClass
4
+ include_examples 'source_target_fixtures', __FILE__
5
+
6
+ def source_data(source_file)
7
+ ::File.read(source_file)
8
+ end
9
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'aranha/parsers/source_address/http_get'
4
+
5
+ RSpec.describe ::Aranha::Parsers::SourceAddress::HttpGet do
6
+ SOURCE_URI = 'http://example.net/abc' # rubocop:disable RSpec/LeakyConstantDeclaration
7
+
8
+ describe '#location_uri' do
9
+ [
10
+ { location: 'http://example.net/def', expected: 'http://example.net/def' },
11
+ { location: '/def', expected: 'http://example.net/def' }
12
+ ].each do |stub|
13
+ context "when source_uri is \"#{SOURCE_URI}\" and location is \"#{stub.fetch(:location)}\"" do
14
+ it "return #{stub.fetch(:expected)}" do
15
+ expect(described_class.location_uri(SOURCE_URI, stub.fetch(:location)))
16
+ .to eq(stub.fetch(:expected))
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end