boa_vista 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
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: