boa_vista 0.0.2 → 0.0.3

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.
Files changed (37) hide show
  1. checksums.yaml +13 -5
  2. data/README.md +82 -1
  3. data/lib/boa_vista/client.rb +44 -0
  4. data/lib/boa_vista/configuration.rb +1 -1
  5. data/lib/boa_vista/errors.rb +7 -0
  6. data/lib/boa_vista/fixtures.rb +1 -0
  7. data/lib/boa_vista/line.rb +2 -4
  8. data/lib/boa_vista/request/default.rb +1 -1
  9. data/lib/boa_vista/response/layout/layout_138.rb +11 -13
  10. data/lib/boa_vista/response/layout/layout_221.rb +9 -11
  11. data/lib/boa_vista/response/layout/layout_249.rb +13 -15
  12. data/lib/boa_vista/response/layout/layout_282.rb +8 -10
  13. data/lib/boa_vista/response/layout/layout_283.rb +14 -16
  14. data/lib/boa_vista/response/layout/layout_285.rb +6 -8
  15. data/lib/boa_vista/response/layout/layout_353.rb +25 -27
  16. data/lib/boa_vista/response/layout/layout_354.rb +13 -15
  17. data/lib/boa_vista/response/layout/layout_901.rb +6 -8
  18. data/lib/boa_vista/response/layout/layout_999.rb +4 -6
  19. data/lib/boa_vista/response/layout.rb +9 -0
  20. data/lib/boa_vista/response/parser.rb +28 -0
  21. data/lib/boa_vista/response.rb +1 -1
  22. data/lib/boa_vista/version.rb +1 -1
  23. data/lib/boa_vista.rb +13 -1
  24. data/spec/fixtures/layout_999.txt +1 -1
  25. data/spec/fixtures/layout_invalid_353.txt +1 -0
  26. data/spec/fixtures/response_with_html.txt +1 -0
  27. data/spec/fixtures/unknown_layout.txt +1 -0
  28. data/spec/lib/boa_vista/client_spec.rb +45 -0
  29. data/spec/lib/boa_vista/configuration_spec.rb +2 -0
  30. data/spec/lib/boa_vista/fixtures.rb +12 -0
  31. data/spec/lib/boa_vista/line_spec.rb +3 -0
  32. data/spec/lib/boa_vista/response/layout/layout_999_spec.rb +1 -1
  33. data/spec/lib/boa_vista/response/layout_spec.rb +19 -0
  34. data/spec/lib/boa_vista/response/parser_spec.rb +16 -0
  35. data/spec/lib/boa_vista/version_spec.rb +1 -1
  36. data/spec/spec_helper.rb +6 -0
  37. metadata +62 -19
checksums.yaml CHANGED
@@ -1,7 +1,15 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: b90db56e32d157b4ded1579dd4f456ee182a036c
4
- data.tar.gz: d8812931c93c0766ca1f0d3dee8ddf178191a792
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ ZDZhNTFlNGFhMThkYzVjOThlM2NkZjY0ZTdmZDQ1ZjcyNDljYTNiZA==
5
+ data.tar.gz: !binary |-
6
+ ZjkyYmI3N2YwOTgxYWRmYjZmODk0YTFmYTQ5ZGM4YzY4OWQ5MTg0OA==
5
7
  SHA512:
6
- metadata.gz: 118565a2398336d8448e5c8d97dad24459b37d79a6bbee49c6629276ede7615f87cb944db1a39ec8597cf4737c8d6f4ab70f3e64cb7e172c3e04c3d367eb296e
7
- data.tar.gz: b68e54922554ad1d7cb98165ab8f12f69eeb4170d74e98f027ff50b7235e1f5e3b552eb7ec2d4f0a0b02cb108135f506843fe116173ccb75646305d82ca8f76c
8
+ metadata.gz: !binary |-
9
+ NzRkYzZiMWE2Y2IyNzAzOTQ3ODNiMjEzNDY2YTMwZTEyZGY4OTFlMDkwODZj
10
+ NzJjZWYyY2E1NWE3YWVmYzVlZTUxN2NiNGE5YTY1MDAzOTUyZjNmMWEwZmE3
11
+ OThhMDEyNjdjODQ4ZmFiOGViNDgwZDZlYzljZmYyY2IwN2U5MDI=
12
+ data.tar.gz: !binary |-
13
+ YTIxYmExNGM3MzdhMGExMTZkN2M3ZDAwOTNiYmU0OGMyZjZlNTdlODYwNGY1
14
+ Njg3MWQ0ZWFiNGE3NDA0ODM4NDMzOTBiYTI2ZDMxMjJmZWU3NDBjZDhmNDIx
15
+ NzkxNjZlOTkzMDY0M2U0MjMwOWJlYTk1NjQxMDVmMmRhODRkOTM=
data/README.md CHANGED
@@ -1 +1,82 @@
1
- # boa_vista
1
+ boa_vista
2
+ =========
3
+ [![wercker status](https://app.wercker.com/status/08f2a5316ce97f6f16acd51e3c1d3aee/s "wercker status")](https://app.wercker.com/project/bykey/08f2a5316ce97f6f16acd51e3c1d3aee)
4
+ [![Code Climate](https://codeclimate.com/github/GabrielMalakias/boa_vista/badges/gpa.svg)](https://codeclimate.com/github/GabrielMalakias/boa_vista)
5
+ =======
6
+
7
+ Library to do requests and generate layouts for BoaVista SCPC.
8
+
9
+ Features
10
+ --------
11
+ * Generate Layout for requests
12
+ * Parse Layouts of responses
13
+ * Do requests in BoaVista
14
+
15
+
16
+ ### Installation
17
+ Add this in your Gemfile
18
+ ```ruby
19
+ gem 'boa_vista'
20
+ ```
21
+
22
+
23
+ ### Configuration
24
+ If you are using Rails add this code in config/initializers
25
+ ```ruby
26
+ require 'boa_vista'
27
+ BoaVista.configure do |config|
28
+ config.code = '<YOUR_CODE>'
29
+ config.password = '<YOUR_PASSWORD>'
30
+ config.url = '<BOAVISTA_URL>'
31
+ config.timeout = '<MAX_SEC_TO_COMPLETE_REQUEST>'
32
+ end
33
+ ```
34
+
35
+ ### Usage
36
+ Considering a variable(attributes) equal to this:
37
+ ```ruby
38
+ attributes = {
39
+ document_type: '1',
40
+ document_number: '00031030944410'
41
+ }.merge(BoaVista::Request::Default::CPF)
42
+ ```
43
+
44
+ ##### BoaVista::Client
45
+ To do a request in BoaVista do
46
+ ```ruby
47
+ line = BoaVista::Client.new(attributes).call
48
+ ```
49
+ Will return an instance of BoaVista::Line, you can use your methods to access attributes of specific layout
50
+ ```ruby
51
+ line.transaction
52
+ => ' CSR80'
53
+ ```
54
+ For more information see lib/response/layouts folder
55
+
56
+ ##### BoaVista::Response
57
+ Considering a variable below
58
+ ```ruby
59
+ line = 'TTTTTTTTVVRRRRRRRRRRBBBBBBBBBBBBBBBBBBBBCCCCCCCCQQQQQQQQQVYCNNNNNNNTTTTZZZPPP'
60
+ ```
61
+ To parse line you can use BoaVista::Response, a code to do this is
62
+ ```ruby
63
+ parsed_line = BoaVista::Response.new(line).read
64
+ ```
65
+ And will return an instance of line similar BoaVista::Client#call
66
+
67
+ ##### BoaVista::Request
68
+ To create an request you need pass your values
69
+ ```ruby
70
+ BoaVista::Request.new(attributes).create
71
+ ```
72
+
73
+ and will return a similar line of this
74
+
75
+ ```ruby
76
+ "CSR60 01 CODE PASSWORDSINTON 012C100031030944410X"
77
+ ```
78
+
79
+ #### Contributors
80
+ * [Gabriel Souza](https://github.com/gabrielmalakias)
81
+ * [Kleber Shimabuku](https://github.com/klebershimabuku)
82
+
@@ -0,0 +1,44 @@
1
+ require 'timeout'
2
+
3
+ module BoaVista
4
+
5
+ class Client
6
+ def initialize(attributes, request = BoaVista::Request, response = BoaVista::Response)
7
+ @attributes = attributes
8
+ @request = request
9
+ @response = response
10
+ end
11
+
12
+ def call
13
+ begin
14
+ response = nil
15
+ execute_with_timeout do
16
+ response = Net::HTTP.get_response(uri(create_request)).body
17
+ end
18
+ @response.new(parsed_response(response)).read
19
+ rescue Timeout::Error
20
+ fail Errors::Timeout.new('timed out')
21
+ end
22
+ end
23
+
24
+ private
25
+
26
+ def parsed_response(response)
27
+ BoaVista::Response::Parser.new(response).call
28
+ end
29
+
30
+ def execute_with_timeout
31
+ Timeout::timeout(BoaVista.configuration.timeout.to_i) do
32
+ yield if block_given?
33
+ end
34
+ end
35
+
36
+ def create_request
37
+ @request.new(@attributes).create
38
+ end
39
+
40
+ def uri(request)
41
+ URI("#{BoaVista.configuration.url}?consulta=#{CGI::escape(request)}")
42
+ end
43
+ end
44
+ end
@@ -1,5 +1,5 @@
1
1
  module BoaVista
2
2
  class Configuration
3
- attr_accessor :code, :password
3
+ attr_accessor :code, :password, :url, :timeout
4
4
  end
5
5
  end
@@ -0,0 +1,7 @@
1
+ module BoaVista
2
+ module Errors
3
+ class Timeout < StandardError; end
4
+ class InvalidLayout < StandardError; end
5
+ class FileNotExists < StandardError; end
6
+ end
7
+ end
@@ -0,0 +1 @@
1
+ require "#{BoaVista.root}/spec/lib/boa_vista/fixtures"
@@ -45,10 +45,8 @@ module BoaVista
45
45
  define_singleton_method(name) { @fields[name].value }
46
46
  end
47
47
 
48
- def self.detect_layout(value)
49
- layout = value.slice(BoaVista::Response::Layout.range_of(:record_type))
50
-
51
- Object.const_get "BoaVista::Response::Layout::Layout#{layout}"
48
+ def valid_record?
49
+ record == 'S'.freeze
52
50
  end
53
51
 
54
52
  private
@@ -28,6 +28,6 @@ module BoaVista
28
28
  reserved_requester: '',
29
29
  reserved_boa_vista: ''
30
30
  }.freeze
31
- end
31
+ end
32
32
  end
33
33
  end
@@ -1,20 +1,18 @@
1
1
  module BoaVista
2
2
  class Response
3
- module Layout
4
- module Layout138
5
- module_function
3
+ module Layout::Layout138
4
+ module_function
6
5
 
7
- def initialize(fields)
8
- @fields = fields
9
- end
6
+ def initialize(fields)
7
+ @fields = fields
8
+ end
10
9
 
11
- def attributes
12
- BoaVista::Response::Layout.attributes.merge(record: { range: 77..77 },
13
- document_number: { range: 78..91 },
14
- company_name: { range: 92..206 },
15
- city: { range: 207..246 },
16
- uf: { range: 247..248 })
17
- end
10
+ def attributes
11
+ BoaVista::Response::Layout.attributes.merge(record: { range: 77..77 },
12
+ document_number: { range: 78..91 },
13
+ company_name: { range: 92..206 },
14
+ city: { range: 207..246 },
15
+ uf: { range: 247..248 })
18
16
  end
19
17
  end
20
18
  end
@@ -1,17 +1,15 @@
1
1
  module BoaVista
2
2
  class Response
3
- module Layout
4
- module Layout221
5
- module_function
3
+ module Layout::Layout221
4
+ module_function
6
5
 
7
- def attributes
8
- BoaVista::Response::Layout.attributes.merge(record: { range: 77..77 },
9
- name: { range: 78..127 },
10
- document: { range: 128..138 },
11
- birthday_date: { range: 139..146 },
12
- mothers_name: { range: 149..198 },
13
- voter_registration: { range: 199..211 })
14
- end
6
+ def attributes
7
+ BoaVista::Response::Layout.attributes.merge(record: { range: 77..77 },
8
+ name: { range: 78..127 },
9
+ document: { range: 128..138 },
10
+ birthday_date: { range: 139..146 },
11
+ mothers_name: { range: 149..198 },
12
+ voter_registration: { range: 199..211 })
15
13
  end
16
14
  end
17
15
  end
@@ -1,21 +1,19 @@
1
1
  module BoaVista
2
2
  class Response
3
- module Layout
4
- module Layout249
5
- module_function
3
+ module Layout::Layout249
4
+ module_function
6
5
 
7
- def attributes
8
- BoaVista::Response::Layout.attributes.merge(query_online: { range: 77..77 },
9
- name: { range: 78..127 },
10
- document: { range: 128..138 },
11
- birthday_date: { range: 139..146 },
12
- mothers_name: { range: 149..198 },
13
- voter_registration: { range: 199..211 },
14
- condition: { range: 212..212 },
15
- query_date: { range: 213..220 },
16
- query_time: { range: 221..226 },
17
- protocol: { range: 227..246 })
18
- end
6
+ def attributes
7
+ BoaVista::Response::Layout.attributes.merge(query_online: { range: 77..77 },
8
+ name: { range: 78..127 },
9
+ document: { range: 128..138 },
10
+ birthday_date: { range: 139..146 },
11
+ mothers_name: { range: 149..198 },
12
+ voter_registration: { range: 199..211 },
13
+ condition: { range: 212..212 },
14
+ query_date: { range: 213..220 },
15
+ query_time: { range: 221..226 },
16
+ protocol: { range: 227..246 })
19
17
  end
20
18
  end
21
19
  end
@@ -1,16 +1,14 @@
1
1
  module BoaVista
2
2
  class Response
3
- module Layout
4
- module Layout282
5
- module_function
3
+ module Layout::Layout282
4
+ module_function
6
5
 
7
- def attributes
8
- BoaVista::Response::Layout.attributes.merge(record: { range: 77..77 },
9
- sequence_number: { range: 78..79 },
10
- company_name: { range: 80..129 },
11
- document_type: { range: 130..130 },
12
- document_number: { range: 131..144 })
13
- end
6
+ def attributes
7
+ BoaVista::Response::Layout.attributes.merge(record: { range: 77..77 },
8
+ sequence_number: { range: 78..79 },
9
+ company_name: { range: 80..129 },
10
+ document_type: { range: 130..130 },
11
+ document_number: { range: 131..144 })
14
12
  end
15
13
  end
16
14
  end
@@ -1,22 +1,20 @@
1
1
  module BoaVista
2
2
  class Response
3
- module Layout
4
- module Layout283
5
- module_function
3
+ module Layout::Layout283
4
+ module_function
6
5
 
7
- def attributes
8
- BoaVista::Response::Layout.attributes.merge(record: { range: 77..77 },
9
- sequence_number: { range: 78..82 },
10
- company_name: { range: 83..132 },
11
- document_type: { range: 133..133 },
12
- document_number: { range: 134..147 },
13
- entry_date: { range: 148..155 },
14
- currency_type: { range: 156..156 },
15
- value: { range: 157..171 },
16
- function: { range: 172..191 },
17
- signs: { range: 192..192 },
18
- percentage: { range: 193..197 })
19
- end
6
+ def attributes
7
+ BoaVista::Response::Layout.attributes.merge(record: { range: 77..77 },
8
+ sequence_number: { range: 78..82 },
9
+ company_name: { range: 83..132 },
10
+ document_type: { range: 133..133 },
11
+ document_number: { range: 134..147 },
12
+ entry_date: { range: 148..155 },
13
+ currency_type: { range: 156..156 },
14
+ value: { range: 157..171 },
15
+ function: { range: 172..191 },
16
+ signs: { range: 192..192 },
17
+ percentage: { range: 193..197 })
20
18
  end
21
19
  end
22
20
  end
@@ -1,14 +1,12 @@
1
1
  module BoaVista
2
2
  class Response
3
- module Layout
4
- module Layout285
5
- module_function
3
+ module Layout::Layout285
4
+ module_function
6
5
 
7
- def attributes
8
- BoaVista::Response::Layout.attributes.merge(record: { range: 77..77 },
9
- hive_activity_code: { range: 78..85 },
10
- hive_activity_description: { range: 86..140 })
11
- end
6
+ def attributes
7
+ BoaVista::Response::Layout.attributes.merge(record: { range: 77..77 },
8
+ hive_activity_code: { range: 78..85 },
9
+ hive_activity_description: { range: 86..140 })
12
10
  end
13
11
  end
14
12
  end
@@ -1,33 +1,31 @@
1
1
  module BoaVista
2
2
  class Response
3
- module Layout
4
- module Layout353
5
- module_function
3
+ module Layout::Layout353
4
+ module_function
6
5
 
7
- def attributes
8
- BoaVista::Response::Layout.attributes.merge(record: { range: 77..77 },
9
- document_number: { range: 78..91 },
10
- nire: { range: 92..102 },
11
- company_name: { range: 103..217 },
12
- condition: { range: 218..218 },
13
- foundation_date: { range: 219..226 },
14
- registration: { range: 227..240 },
15
- registration_status: { range: 241..241 },
16
- address: { range: 242..311 },
17
- district: { range: 312..331 },
18
- postal_code: { range: 332..339 },
19
- city: { range: 340..379 },
20
- uf: { range: 380..381 },
21
- phone_1: { range: 382..401 },
22
- phone_2: { range: 402..416 },
23
- fax: { range: 417..431 },
24
- ibge_code: { range: 432..439 },
25
- legal_nature_code: { range: 440..447 },
26
- legal_nature_description: { range: 448..502 },
27
- segment: { range: 503..581 },
28
- hive_activity_code: { range: 582..589 },
29
- hive_activity_description: { range: 590..644 })
30
- end
6
+ def attributes
7
+ BoaVista::Response::Layout.attributes.merge(record: { range: 77..77 },
8
+ document_number: { range: 78..91 },
9
+ nire: { range: 92..102 },
10
+ company_name: { range: 103..217 },
11
+ condition: { range: 218..218 },
12
+ foundation_date: { range: 219..226 },
13
+ registration: { range: 227..240 },
14
+ registration_status: { range: 241..241 },
15
+ address: { range: 242..311 },
16
+ district: { range: 312..331 },
17
+ postal_code: { range: 332..339 },
18
+ city: { range: 340..379 },
19
+ uf: { range: 380..381 },
20
+ phone_1: { range: 382..401 },
21
+ phone_2: { range: 402..416 },
22
+ fax: { range: 417..431 },
23
+ ibge_code: { range: 432..439 },
24
+ legal_nature_code: { range: 440..447 },
25
+ legal_nature_description: { range: 448..502 },
26
+ segment: { range: 503..581 },
27
+ hive_activity_code: { range: 582..589 },
28
+ hive_activity_description: { range: 590..644 })
31
29
  end
32
30
  end
33
31
  end
@@ -1,21 +1,19 @@
1
1
  module BoaVista
2
2
  class Response
3
- module Layout
4
- module Layout354
5
- module_function
3
+ module Layout::Layout354
4
+ module_function
6
5
 
7
- def attributes
8
- BoaVista::Response::Layout.attributes.merge(record: { range: 77..77 },
9
- document_number: { range: 78..91 },
10
- currency_social_capital: { range: 92..95 },
11
- value_social_capital: { range: 96..110 },
12
- home_organ: { range: 111..118 },
13
- register_date: { range: 119..126 },
14
- currency_current_capital: { range: 127..130 },
15
- value_current_capital: { range: 131..145 },
16
- current_organ: { range: 146..153 },
17
- change_date: { range: 154..161 })
18
- end
6
+ def attributes
7
+ BoaVista::Response::Layout.attributes.merge(record: { range: 77..77 },
8
+ document_number: { range: 78..91 },
9
+ currency_social_capital: { range: 92..95 },
10
+ value_social_capital: { range: 96..110 },
11
+ home_organ: { range: 111..118 },
12
+ register_date: { range: 119..126 },
13
+ currency_current_capital: { range: 127..130 },
14
+ value_current_capital: { range: 131..145 },
15
+ current_organ: { range: 146..153 },
16
+ change_date: { range: 154..161 })
19
17
  end
20
18
  end
21
19
  end
@@ -1,14 +1,12 @@
1
1
  module BoaVista
2
2
  class Response
3
- module Layout
4
- module Layout901
5
- module_function
3
+ module Layout::Layout901
4
+ module_function
6
5
 
7
- def attributes
8
- BoaVista::Response::Layout.attributes.merge(record: { range: 77..77 },
9
- message_type: { range: 78..78 },
10
- message: { range: 79..208 })
11
- end
6
+ def attributes
7
+ BoaVista::Response::Layout.attributes.merge(record: { range: 77..77 },
8
+ message_type: { range: 78..78 },
9
+ message: { range: 79..208 })
12
10
  end
13
11
  end
14
12
  end
@@ -1,12 +1,10 @@
1
1
  module BoaVista
2
2
  class Response
3
- module Layout
4
- module Layout999
5
- module_function
3
+ module Layout::Layout999
4
+ module_function
6
5
 
7
- def attributes
8
- BoaVista::Response::Layout.attributes.merge(record: { range: 77..77 })
9
- end
6
+ def attributes
7
+ BoaVista::Response::Layout.attributes.merge(record: { range: 77..171 })
10
8
  end
11
9
  end
12
10
  end
@@ -21,6 +21,15 @@ module BoaVista
21
21
  }
22
22
  end
23
23
 
24
+ def detect(value)
25
+ begin
26
+ layout = value.slice(BoaVista::Response::Layout.range_of(:record_type))
27
+ eval "BoaVista::Response::Layout::Layout#{layout}"
28
+ rescue NameError
29
+ fail Errors::InvalidLayout.new("Layout of response invalid, layout_code: #{layout}")
30
+ end
31
+ end
32
+
24
33
  def range_of(attribute)
25
34
  attributes[attribute][:range]
26
35
  end
@@ -0,0 +1,28 @@
1
+ module BoaVista
2
+ class Response
3
+ class Parser
4
+ INVALID_STRING = "\\n"
5
+ BLANK_SPACE = ''
6
+
7
+ def initialize(response, base_tag = '//pre')
8
+ @base_tag = '//pre'
9
+ @response = response
10
+ end
11
+
12
+ def call
13
+ return @response if !@response.include?(INVALID_STRING)
14
+ sanitize(navigate_to_node)
15
+ end
16
+
17
+ private
18
+
19
+ def navigate_to_node
20
+ ::Nokogiri::HTML(@response).xpath(@base_tag).text
21
+ end
22
+
23
+ def sanitize(response)
24
+ response.gsub(INVALID_STRING, BLANK_SPACE)
25
+ end
26
+ end
27
+ end
28
+ end
@@ -11,7 +11,7 @@ module BoaVista
11
11
  private
12
12
 
13
13
  def layout
14
- BoaVista::Line.detect_layout(@line)
14
+ BoaVista::Response::Layout.detect(@line)
15
15
  end
16
16
 
17
17
  def read_line_with(layout)
@@ -1,3 +1,3 @@
1
1
  module BoaVista
2
- VERSION = '0.0.2'.freeze
2
+ VERSION = '0.0.3'
3
3
  end
data/lib/boa_vista.rb CHANGED
@@ -1,4 +1,9 @@
1
+ require 'net/http'
2
+ require 'cgi'
3
+ require 'nokogiri'
4
+
1
5
  require 'boa_vista/configuration'
6
+ require 'boa_vista/client'
2
7
 
3
8
  require 'boa_vista/field'
4
9
  require 'boa_vista/field/reader'
@@ -6,14 +11,17 @@ require 'boa_vista/field/writer'
6
11
 
7
12
  require 'boa_vista/line'
8
13
 
14
+ require 'boa_vista/errors'
15
+
9
16
  require 'boa_vista/request'
10
17
  require 'boa_vista/request/layout'
11
18
  require 'boa_vista/request/layout/cpf'
12
19
  require 'boa_vista/request/layout/cnpj'
13
20
  require 'boa_vista/request/factory'
14
21
 
15
- require 'boa_vista/response/layout'
16
22
  require 'boa_vista/response'
23
+ require 'boa_vista/response/layout'
24
+ require 'boa_vista/response/parser'
17
25
 
18
26
  require 'boa_vista/response/layout/layout_138'
19
27
  require 'boa_vista/response/layout/layout_282'
@@ -42,6 +50,10 @@ module BoaVista
42
50
  def self.configure
43
51
  yield(configuration)
44
52
  end
53
+
54
+ def self.root
55
+ File.expand_path '../..', __FILE__
56
+ end
45
57
  end
46
58
 
47
59
  require 'boa_vista/request/default'
@@ -1 +1 @@
1
- TTTTTTTTVVRRRRRRRRRRBBBBBBBBBBBBBBBBBBBBCCCCCCCCQQQQQQQQQVYCNNNNNNNTTTTZZZPPPS
1
+ TTTTTTTTVVRRRRRRRRRRBBBBBBBBBBBBBBBBBBBBCCCCCCCCQQQQQQQQQVYCNNNNNNNTTTTZZZ999SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
@@ -0,0 +1 @@
1
+ TTTTTTTTVVRRRRRRRRRRBBBBBBBBBBBBBBBBBBBBCCCCCCCCQQQQQQQQQVYCNNNNNNNTTTTZZZ353NDDDDDDDDDDDDDDNNNNNNNNNNNCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCTFFFFFFFFRRRRRRRRRRRRRRSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBBBBPPPPPPPPCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCUUPPPPPPPPPPPPPPPPPPPPHHHHHHHHHHHHHHHFFFFFFFFFFFFFFFGGGGGGGGNNNNNNNNDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSRRRRRRRRDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
@@ -0,0 +1 @@
1
+ \n\n\t\n\t\t\n\t\t\n \n \n \t \n \n \n \t \n\t\n \n \n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<PRE>\nCSR61 01 00000045 2900000000101098999* IDENTIFICADOR COM RESTRICAO DE ACESSO \n</PRE>\n\n
@@ -0,0 +1 @@
1
+ TTTTTTTTVVRRRRRRRRRRBBBBBBBBBBBBBBBBBBBBCCCCCCCCQQQQQQQQQVYCNNNNNNNTTTTZZZ888
@@ -0,0 +1,45 @@
1
+ RSpec.describe BoaVista::Client do
2
+ context 'when requests cpf' do
3
+ before do
4
+ stub_request(:get, url_stub).to_return(body: line)
5
+ end
6
+
7
+ let(:instance) { described_class.new(values) }
8
+ let(:line) { File.read('./spec/fixtures/layout_353.txt') }
9
+ let(:url_stub) { "http://localhost:3000/?consulta=CSR60%20%20%2001%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20CODE%20%20%20%20PASSWORDSINTON%20%20012C100031030944410X" }
10
+ let(:values) do
11
+ {
12
+ document_type: '1',
13
+ document_number: '00031030944410'
14
+ }.merge(BoaVista::Request::Default::CPF)
15
+ end
16
+
17
+ subject { instance.call }
18
+
19
+ its(:transaction) { is_expected.to eq('T' * 8) }
20
+
21
+ context 'when record is valid' do
22
+ its(:valid_record?) { is_expected.to be_truthy }
23
+ end
24
+
25
+ context 'when record is invalid' do
26
+ let(:line) { File.read('./spec/fixtures/layout_invalid_353.txt') }
27
+
28
+ its(:valid_record?) { is_expected.to be_falsey }
29
+ end
30
+
31
+ context 'when response has an html and has an invalid response' do
32
+ let(:line) { File.read('./spec/fixtures/response_with_html.txt') }
33
+
34
+ its(:record_type) { is_expected.to eq 999.to_s }
35
+ end
36
+
37
+ context 'when timeout error' do
38
+ it 'raise BoaVista::Errors::Timeout' do
39
+ allow(Net::HTTP).to receive(:get_response).with(anything) { raise(Timeout::Error) }
40
+ expect { subject }.to raise_error(BoaVista::Errors::Timeout)
41
+ end
42
+ end
43
+ end
44
+
45
+ end
@@ -2,5 +2,7 @@ RSpec.describe BoaVista::Configuration do
2
2
  it 'configures with code and password' do
3
3
  expect(BoaVista.configuration.code).to eq('CODE')
4
4
  expect(BoaVista.configuration.password).to eq('PASSWORD')
5
+ expect(BoaVista.configuration.url).to eq('http://localhost:3000')
6
+ expect(BoaVista.configuration.timeout).to eq(10)
5
7
  end
6
8
  end
@@ -0,0 +1,12 @@
1
+ module BoaVista
2
+ class Fixtures
3
+ def self.read(name)
4
+ begin
5
+ file_path = "#{BoaVista.root}/spec/fixtures/#{name}"
6
+ File.open(file_path).readlines
7
+ rescue Errno::ENOENT
8
+ fail Errors::FileNotExists.new("Specified fixture not exists: #{file_path}")
9
+ end
10
+ end
11
+ end
12
+ end
@@ -54,5 +54,8 @@ RSpec.describe BoaVista::Line do
54
54
  it { is_expected.to eq('CSR60 01 CODE PASSWORDSINTON 012C1 X') }
55
55
  end
56
56
  end
57
+
58
+ context 'when record is valid' do
59
+ end
57
60
  end
58
61
  end
@@ -7,6 +7,6 @@ RSpec.describe BoaVista::Response::Layout::Layout999 do
7
7
  subject { instance.read }
8
8
 
9
9
  its(:transaction) { is_expected.to eq('T' * 8) }
10
- its(:record) { is_expected.to eq('S') }
10
+ its(:record) { is_expected.to eq('S' * 95) }
11
11
  end
12
12
  end
@@ -1,2 +1,21 @@
1
1
  RSpec.describe BoaVista::Response::Layout do
2
+ describe '.detect' do
3
+ subject { described_class.detect(response) }
4
+
5
+ context 'when layout is Layout999' do
6
+ let(:response) { File.read('./spec/fixtures/layout_999.txt') }
7
+
8
+ subject { described_class.detect(response) }
9
+
10
+ it { is_expected.to eq BoaVista::Response::Layout::Layout999 }
11
+ end
12
+
13
+ context 'when layout is unknown' do
14
+ let(:response) { File.read('./spec/fixtures/unknown_layout.txt') }
15
+
16
+ it 'raise InvalidLayout error' do
17
+ expect{described_class.detect(response)}.to raise_error(BoaVista::Errors::InvalidLayout)
18
+ end
19
+ end
20
+ end
2
21
  end
@@ -0,0 +1,16 @@
1
+ RSpec.describe BoaVista::Response::Parser do
2
+ let(:response) { File.read('./spec/fixtures/response_with_html.txt') }
3
+ let(:instance) { described_class.new(response) }
4
+
5
+ context 'when response have html tags' do
6
+ subject { instance.call }
7
+
8
+ it { is_expected.to eq 'CSR61 01 00000045 2900000000101098999* IDENTIFICADOR COM RESTRICAO DE ACESSO ' }
9
+ end
10
+
11
+ context 'when response haven\'t html tags' do
12
+ subject { instance.call }
13
+
14
+ it { is_expected.to eq 'CSR61 01 00000045 2900000000101098999* IDENTIFICADOR COM RESTRICAO DE ACESSO ' }
15
+ end
16
+ end
@@ -1,3 +1,3 @@
1
1
  RSpec.describe BoaVista::VERSION do
2
- specify { expect(BoaVista::VERSION).to eq '0.0.2' }
2
+ specify { expect(BoaVista::VERSION).to eq '0.0.3' }
3
3
  end
data/spec/spec_helper.rb CHANGED
@@ -3,14 +3,20 @@ Bundler.setup
3
3
 
4
4
  require 'rspec'
5
5
  require 'rspec/its'
6
+ require 'webmock'
6
7
 
7
8
  require 'boa_vista'
9
+ require 'codeclimate-test-reporter'
8
10
 
11
+ CodeClimate::TestReporter.start
9
12
  RSpec.configure do |c|
10
13
  c.disable_monkey_patching!
11
14
 
15
+ include WebMock::API
12
16
  BoaVista.configure do |config|
13
17
  config.code = 'CODE'
14
18
  config.password = 'PASSWORD'
19
+ config.url = 'http://localhost:3000'
20
+ config.timeout = 10
15
21
  end
16
22
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: boa_vista
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gabriel Souza
@@ -9,62 +9,90 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2016-02-26 00:00:00.000000000 Z
12
+ date: 2016-03-10 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
- name: rspec
15
+ name: nokogiri
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - ! '>='
19
+ - !ruby/object:Gem::Version
20
+ version: '0'
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ! '>='
26
+ - !ruby/object:Gem::Version
27
+ version: '0'
28
+ - !ruby/object:Gem::Dependency
29
+ name: codeclimate-test-reporter
16
30
  requirement: !ruby/object:Gem::Requirement
17
31
  requirements:
18
- - - "~>"
32
+ - - ! '>='
19
33
  - !ruby/object:Gem::Version
20
- version: 3.0.0
34
+ version: '0'
21
35
  type: :development
22
36
  prerelease: false
23
37
  version_requirements: !ruby/object:Gem::Requirement
24
38
  requirements:
25
- - - "~>"
39
+ - - ! '>='
26
40
  - !ruby/object:Gem::Version
27
- version: 3.0.0
41
+ version: '0'
28
42
  - !ruby/object:Gem::Dependency
29
- name: rspec-its
43
+ name: webmock
30
44
  requirement: !ruby/object:Gem::Requirement
31
45
  requirements:
32
- - - ">="
46
+ - - ! '>='
33
47
  - !ruby/object:Gem::Version
34
48
  version: '0'
35
49
  type: :development
36
50
  prerelease: false
37
51
  version_requirements: !ruby/object:Gem::Requirement
38
52
  requirements:
39
- - - ">="
53
+ - - ! '>='
40
54
  - !ruby/object:Gem::Version
41
55
  version: '0'
42
56
  - !ruby/object:Gem::Dependency
43
- name: shoulda-matchers
57
+ name: rspec
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ! '>='
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
63
+ type: :development
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ - !ruby/object:Gem::Dependency
71
+ name: rspec-its
44
72
  requirement: !ruby/object:Gem::Requirement
45
73
  requirements:
46
- - - ">="
74
+ - - ! '>='
47
75
  - !ruby/object:Gem::Version
48
76
  version: '0'
49
77
  type: :development
50
78
  prerelease: false
51
79
  version_requirements: !ruby/object:Gem::Requirement
52
80
  requirements:
53
- - - ">="
81
+ - - ! '>='
54
82
  - !ruby/object:Gem::Version
55
83
  version: '0'
56
84
  - !ruby/object:Gem::Dependency
57
85
  name: rake
58
86
  requirement: !ruby/object:Gem::Requirement
59
87
  requirements:
60
- - - ">="
88
+ - - ! '>='
61
89
  - !ruby/object:Gem::Version
62
90
  version: '0'
63
91
  type: :development
64
92
  prerelease: false
65
93
  version_requirements: !ruby/object:Gem::Requirement
66
94
  requirements:
67
- - - ">="
95
+ - - ! '>='
68
96
  - !ruby/object:Gem::Version
69
97
  version: '0'
70
98
  description: Client for Boa Vista
@@ -77,10 +105,13 @@ extra_rdoc_files: []
77
105
  files:
78
106
  - README.md
79
107
  - lib/boa_vista.rb
108
+ - lib/boa_vista/client.rb
80
109
  - lib/boa_vista/configuration.rb
110
+ - lib/boa_vista/errors.rb
81
111
  - lib/boa_vista/field.rb
82
112
  - lib/boa_vista/field/reader.rb
83
113
  - lib/boa_vista/field/writer.rb
114
+ - lib/boa_vista/fixtures.rb
84
115
  - lib/boa_vista/line.rb
85
116
  - lib/boa_vista/request.rb
86
117
  - lib/boa_vista/request/default.rb
@@ -100,6 +131,7 @@ files:
100
131
  - lib/boa_vista/response/layout/layout_354.rb
101
132
  - lib/boa_vista/response/layout/layout_901.rb
102
133
  - lib/boa_vista/response/layout/layout_999.rb
134
+ - lib/boa_vista/response/parser.rb
103
135
  - lib/boa_vista/version.rb
104
136
  - spec/fixtures/base.txt
105
137
  - spec/fixtures/layout_138.txt
@@ -113,9 +145,14 @@ files:
113
145
  - spec/fixtures/layout_901.txt
114
146
  - spec/fixtures/layout_999.txt
115
147
  - spec/fixtures/layout_cpf.txt
148
+ - spec/fixtures/layout_invalid_353.txt
149
+ - spec/fixtures/response_with_html.txt
150
+ - spec/fixtures/unknown_layout.txt
151
+ - spec/lib/boa_vista/client_spec.rb
116
152
  - spec/lib/boa_vista/configuration_spec.rb
117
153
  - spec/lib/boa_vista/field/writer_spec.rb
118
154
  - spec/lib/boa_vista/field_spec.rb
155
+ - spec/lib/boa_vista/fixtures.rb
119
156
  - spec/lib/boa_vista/line_spec.rb
120
157
  - spec/lib/boa_vista/request/default_spec.rb
121
158
  - spec/lib/boa_vista/request/factory_spec.rb
@@ -134,6 +171,7 @@ files:
134
171
  - spec/lib/boa_vista/response/layout/layout_901_spec.rb
135
172
  - spec/lib/boa_vista/response/layout/layout_999_spec.rb
136
173
  - spec/lib/boa_vista/response/layout_spec.rb
174
+ - spec/lib/boa_vista/response/parser_spec.rb
137
175
  - spec/lib/boa_vista/response_spec.rb
138
176
  - spec/lib/boa_vista/version_spec.rb
139
177
  - spec/spec_helper.rb
@@ -146,17 +184,17 @@ require_paths:
146
184
  - lib
147
185
  required_ruby_version: !ruby/object:Gem::Requirement
148
186
  requirements:
149
- - - ">="
187
+ - - ! '>='
150
188
  - !ruby/object:Gem::Version
151
189
  version: '0'
152
190
  required_rubygems_version: !ruby/object:Gem::Requirement
153
191
  requirements:
154
- - - ">="
192
+ - - ! '>='
155
193
  - !ruby/object:Gem::Version
156
194
  version: '0'
157
195
  requirements: []
158
196
  rubyforge_project:
159
- rubygems_version: 2.4.6
197
+ rubygems_version: 2.4.8
160
198
  signing_key:
161
199
  specification_version: 4
162
200
  summary: Client for Boa Vista
@@ -173,9 +211,14 @@ test_files:
173
211
  - spec/fixtures/layout_901.txt
174
212
  - spec/fixtures/layout_999.txt
175
213
  - spec/fixtures/layout_cpf.txt
214
+ - spec/fixtures/layout_invalid_353.txt
215
+ - spec/fixtures/response_with_html.txt
216
+ - spec/fixtures/unknown_layout.txt
217
+ - spec/lib/boa_vista/client_spec.rb
176
218
  - spec/lib/boa_vista/configuration_spec.rb
177
219
  - spec/lib/boa_vista/field/writer_spec.rb
178
220
  - spec/lib/boa_vista/field_spec.rb
221
+ - spec/lib/boa_vista/fixtures.rb
179
222
  - spec/lib/boa_vista/line_spec.rb
180
223
  - spec/lib/boa_vista/request/default_spec.rb
181
224
  - spec/lib/boa_vista/request/factory_spec.rb
@@ -194,7 +237,7 @@ test_files:
194
237
  - spec/lib/boa_vista/response/layout/layout_901_spec.rb
195
238
  - spec/lib/boa_vista/response/layout/layout_999_spec.rb
196
239
  - spec/lib/boa_vista/response/layout_spec.rb
240
+ - spec/lib/boa_vista/response/parser_spec.rb
197
241
  - spec/lib/boa_vista/response_spec.rb
198
242
  - spec/lib/boa_vista/version_spec.rb
199
243
  - spec/spec_helper.rb
200
- has_rdoc: