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.
- checksums.yaml +4 -4
- data/Gemfile.lock +55 -48
- data/lib/eac_tools/version.rb +1 -1
- data/sub/aranha-parsers/Gemfile +8 -0
- data/sub/aranha-parsers/aranha-parsers.gemspec +25 -0
- data/sub/aranha-parsers/lib/aranha/parsers/base.rb +81 -0
- data/sub/aranha-parsers/lib/aranha/parsers/html/base.rb +47 -0
- data/sub/aranha-parsers/lib/aranha/parsers/html/item.rb +24 -0
- data/sub/aranha-parsers/lib/aranha/parsers/html/item_list.rb +33 -0
- data/sub/aranha-parsers/lib/aranha/parsers/html/node/base.rb +34 -0
- data/sub/aranha-parsers/lib/aranha/parsers/html/node/default/numeric_support.rb +70 -0
- data/sub/aranha-parsers/lib/aranha/parsers/html/node/default/string_support.rb +77 -0
- data/sub/aranha-parsers/lib/aranha/parsers/html/node/default.rb +34 -0
- data/sub/aranha-parsers/lib/aranha/parsers/html/node.rb +13 -0
- data/sub/aranha-parsers/lib/aranha/parsers/html.rb +11 -0
- data/sub/aranha-parsers/lib/aranha/parsers/invalid_state_exception.rb +8 -0
- data/sub/aranha-parsers/lib/aranha/parsers/json/base.rb +20 -0
- data/sub/aranha-parsers/lib/aranha/parsers/json.rb +11 -0
- data/sub/aranha-parsers/lib/aranha/parsers/patches/ofx_parser.rb +38 -0
- data/sub/aranha-parsers/lib/aranha/parsers/patches.rb +11 -0
- data/sub/aranha-parsers/lib/aranha/parsers/rspec/setup.rb +15 -0
- data/sub/aranha-parsers/lib/aranha/parsers/rspec/shared_examples/source_target_fixtures.rb +74 -0
- data/sub/aranha-parsers/lib/aranha/parsers/rspec/source_target_fixtures_controller.rb +39 -0
- data/sub/aranha-parsers/lib/aranha/parsers/rspec.rb +11 -0
- data/sub/aranha-parsers/lib/aranha/parsers/source_address/fetch_content_error.rb +10 -0
- data/sub/aranha-parsers/lib/aranha/parsers/source_address/file.rb +31 -0
- data/sub/aranha-parsers/lib/aranha/parsers/source_address/hash_http_base.rb +92 -0
- data/sub/aranha-parsers/lib/aranha/parsers/source_address/hash_http_get.rb +13 -0
- data/sub/aranha-parsers/lib/aranha/parsers/source_address/hash_http_post.rb +13 -0
- data/sub/aranha-parsers/lib/aranha/parsers/source_address/http_get.rb +59 -0
- data/sub/aranha-parsers/lib/aranha/parsers/source_address.rb +57 -0
- data/sub/aranha-parsers/lib/aranha/parsers/source_target_fixtures/source_target_file.rb +19 -0
- data/sub/aranha-parsers/lib/aranha/parsers/source_target_fixtures.rb +78 -0
- data/sub/aranha-parsers/lib/aranha/parsers/version.rb +7 -0
- data/sub/aranha-parsers/lib/aranha/parsers.rb +9 -0
- data/sub/aranha-parsers/spec/lib/aranha/parsers/rspec/shared_examples/source_target_fixtures_spec.rb +9 -0
- data/sub/aranha-parsers/spec/lib/aranha/parsers/rspec/shared_examples/source_target_fixtures_spec_files/fixture1.source.txt +1 -0
- data/sub/aranha-parsers/spec/lib/aranha/parsers/rspec/shared_examples/source_target_fixtures_spec_files/fixture1.target.yaml +3 -0
- data/sub/aranha-parsers/spec/lib/aranha/parsers/source_address/http_get_spec.rb +21 -0
- data/sub/aranha-parsers/spec/lib/aranha/parsers/source_address_spec.rb +74 -0
- data/sub/aranha-parsers/spec/lib/aranha/parsers/source_target_fixtures_spec.rb +27 -0
- data/sub/aranha-parsers/spec/lib/aranha/parsers/source_target_fixtures_spec_files/stub1.source.txt +1 -0
- data/sub/aranha-parsers/spec/lib/aranha/parsers/source_target_fixtures_spec_files/stub1.target.html +1 -0
- data/sub/aranha-parsers/spec/lib/aranha/parsers/source_target_fixtures_spec_files/stub2.source.html +1 -0
- data/sub/aranha-parsers/spec/lib/aranha/parsers/source_target_fixtures_spec_files/stub3.target.yaml +1 -0
- data/sub/aranha-parsers/spec/lib/rubocop_check_spec.rb +3 -0
- data/sub/aranha-parsers/spec/spec_helper.rb +4 -0
- data/sub/avm/avm.gemspec +2 -0
- data/sub/avm/lib/avm/executables.rb +1 -1
- data/sub/avm/lib/avm/file_formats/base.rb +2 -1
- data/sub/{avm-files/lib/avm/files/formatter.rb → avm/lib/avm/file_formats/search_formatter.rb} +17 -11
- data/sub/avm/lib/avm/file_formats/utf8_assert.rb +72 -0
- data/sub/avm/lib/avm/rspec/setup.rb +2 -1
- data/sub/avm/lib/avm/rspec/shared_examples/avm_file_formats_with_fixtures.rb +32 -0
- data/sub/avm/lib/avm/version.rb +1 -1
- data/sub/avm-eac_generic_base0/avm-eac_generic_base0.gemspec +1 -1
- data/sub/avm-eac_generic_base0/lib/avm/eac_generic_base0/file_formats/base.rb +2 -2
- data/sub/avm-eac_generic_base0/lib/avm/eac_generic_base0/version.rb +1 -1
- data/sub/avm-eac_generic_base0/spec/lib/avm/eac_generic_base0/file_formats/base_spec.rb +7 -0
- 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
- 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
- data/sub/avm-eac_latex_base0/avm-eac_latex_base0.gemspec +3 -3
- data/sub/avm-eac_latex_base0/lib/avm/eac_latex_base0/executables.rb +22 -0
- data/sub/avm-eac_latex_base0/lib/avm/eac_latex_base0/sources/build.rb +3 -1
- data/sub/avm-eac_latex_base0/lib/avm/eac_latex_base0/version.rb +1 -1
- data/sub/avm-eac_php_base0/avm-eac_php_base0.gemspec +2 -2
- data/sub/avm-eac_php_base0/lib/avm/eac_php_base0/executables.rb +22 -0
- data/sub/avm-eac_php_base0/lib/avm/eac_php_base0/file_formats/base.rb +2 -2
- data/sub/avm-eac_php_base0/lib/avm/eac_php_base0/version.rb +1 -1
- data/sub/avm-eac_php_base0/spec/lib/avm/eac_php_base0/file_formats/base_spec.rb +7 -0
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- data/sub/avm-eac_python_base0/avm-eac_python_base0.gemspec +2 -2
- data/sub/avm-eac_python_base0/lib/avm/eac_python_base0/executables.rb +22 -0
- data/sub/avm-eac_python_base0/lib/avm/eac_python_base0/file_formats/base.rb +2 -2
- data/sub/avm-eac_python_base0/lib/avm/eac_python_base0/version.rb +1 -1
- data/sub/avm-eac_python_base0/spec/lib/avm/eac_python_base0/file_formats/base_spec.rb +7 -0
- 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
- 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
- data/sub/avm-eac_ruby_base1/avm-eac_ruby_base1.gemspec +3 -3
- data/sub/avm-eac_ruby_base1/lib/avm/eac_ruby_base1/version.rb +1 -1
- data/sub/avm-eac_ruby_base1/spec/lib/avm/eac_ruby_base1/file_formats/base_spec.rb +7 -0
- 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
- 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
- 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
- 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
- data/sub/avm-eac_webapp_base0/avm-eac_webapp_base0.gemspec +3 -3
- data/sub/avm-eac_webapp_base0/lib/avm/eac_webapp_base0/executables.rb +26 -0
- data/sub/avm-eac_webapp_base0/lib/avm/eac_webapp_base0/file_formats/css/file_apply.rb +48 -0
- data/sub/avm-eac_webapp_base0/lib/avm/eac_webapp_base0/file_formats/css.rb +22 -0
- data/sub/avm-eac_webapp_base0/lib/avm/eac_webapp_base0/file_formats/javascript.rb +2 -2
- data/sub/avm-eac_webapp_base0/lib/avm/eac_webapp_base0/file_formats/provider.rb +2 -1
- data/sub/avm-eac_webapp_base0/lib/avm/eac_webapp_base0/file_formats/xml.rb +2 -2
- data/sub/avm-eac_webapp_base0/lib/avm/eac_webapp_base0/version.rb +1 -1
- data/sub/avm-eac_webapp_base0/spec/lib/avm/eac_webapp_base0/file_formats/css_spec.rb +7 -0
- data/sub/avm-eac_webapp_base0/spec/lib/avm/eac_webapp_base0/file_formats/css_spec_files/css1.source.css +11 -0
- data/sub/avm-eac_webapp_base0/spec/lib/avm/eac_webapp_base0/file_formats/css_spec_files/css1.target.css +11 -0
- data/sub/avm-eac_webapp_base0/spec/lib/avm/eac_webapp_base0/file_formats/html_spec.rb +7 -0
- 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
- 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
- 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
- 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
- data/sub/avm-eac_webapp_base0/spec/lib/avm/eac_webapp_base0/file_formats/javascript_spec.rb +7 -0
- 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
- 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
- data/sub/avm-eac_webapp_base0/spec/lib/avm/eac_webapp_base0/file_formats/json_spec.rb +7 -0
- 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
- 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
- data/sub/avm-eac_webapp_base0/spec/lib/avm/eac_webapp_base0/file_formats/xml_spec.rb +7 -0
- 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
- 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
- data/sub/avm-files/avm-files.gemspec +2 -2
- data/sub/avm-files/lib/avm/files/version.rb +1 -1
- data/sub/avm-tools/avm-tools.gemspec +4 -7
- data/sub/avm-tools/lib/avm/tools/runner/files/format.rb +5 -5
- data/sub/avm-tools/lib/avm/tools/runner/git/auto_commit.rb +4 -2
- data/sub/avm-tools/lib/avm/tools/version.rb +1 -1
- data/sub/eac_ruby_utils/lib/eac_ruby_utils/patches/object/to_bool.rb +12 -0
- data/sub/eac_ruby_utils/lib/eac_ruby_utils/version.rb +1 -1
- metadata +113 -51
- data/sub/avm-files/lib/avm/files/formatter/utf8_assert.rb +0 -74
- 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,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,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,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
|
data/sub/aranha-parsers/spec/lib/aranha/parsers/rspec/shared_examples/source_target_fixtures_spec.rb
ADDED
@@ -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 @@
|
|
1
|
+
Isto é um fixture.
|
@@ -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
|