russianpost 0.3.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +2 -2
- data/lib/russianpost/barcode.rb +32 -0
- data/lib/russianpost/barcode_validator.rb +46 -0
- data/lib/russianpost/client.rb +9 -4
- data/lib/russianpost/parcel.rb +2 -9
- data/lib/russianpost/version.rb +1 -1
- data/test/russianpost/barcode_test.rb +23 -0
- data/test/russianpost/parcel_test.rb +1 -1
- metadata +6 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: f25804582583d50312fcdabb61739ab523bb1a60
|
|
4
|
+
data.tar.gz: d884f42475e9c64231dc79608027d8378c71a3ec
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 423ce97c42a91b2f8f964d80457e98b1bd8287ea6af8c8f6aadcb962ca1e9cce25ac995dd270b0253dfc69f00995fe044369145222d4a265002e89c121f9912d
|
|
7
|
+
data.tar.gz: b8c07fa4a085b8fe7b0bb1e89ad38ba3a1ebe67045f9bae77298f68468791ca37940d7829892c7029c4dd22ed97092da342932a7b50a549cba15b45704587cfd
|
data/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Russian Post API Client
|
|
2
2
|
|
|
3
|
-
[](https://travis-ci.org/artemshitov/russianpost)
|
|
3
|
+
[](https://travis-ci.org/artemshitov/russianpost) [](https://codeclimate.com/github/artemshitov/russianpost)
|
|
4
4
|
|
|
5
5
|
Thin wrapper around Russian Post package tracking SOAP API. Works on a per-package basis (contrary to the bulk ticket-based API). Use it at your own risk, since the API may appear unstable and require authorization in future.
|
|
6
6
|
|
|
@@ -12,7 +12,7 @@ To install gem stand-alone:
|
|
|
12
12
|
|
|
13
13
|
To use gem in a Rails app, add the following to your `Gemfile`:
|
|
14
14
|
|
|
15
|
-
gem "russianpost", "~> 0.3.
|
|
15
|
+
gem "russianpost", "~> 0.3.1"
|
|
16
16
|
|
|
17
17
|
This gem uses [Savon](http://savonrb.com/), which in turn uses [HTTPI](https://github.com/savonrb/httpi) internally. HTTPI chooses the best HTTP library of those you have installed. For the fastest results, make sure you add [Curb](https://github.com/taf2/curb) to your `Gemfile`:
|
|
18
18
|
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
require "russianpost/barcode_validator"
|
|
2
|
+
|
|
3
|
+
module RussianPost
|
|
4
|
+
class Barcode
|
|
5
|
+
extend Forwardable
|
|
6
|
+
|
|
7
|
+
def_delegator :barcode, :=~
|
|
8
|
+
|
|
9
|
+
attr_reader :barcode
|
|
10
|
+
|
|
11
|
+
def initialize(barcode)
|
|
12
|
+
@barcode = barcode.strip.upcase
|
|
13
|
+
raise InvalidBarcode unless valid?
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def to_s
|
|
17
|
+
barcode
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def digits
|
|
21
|
+
barcode[/\d+/].split("").map { |d| d.to_i }
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
private
|
|
25
|
+
|
|
26
|
+
def valid?
|
|
27
|
+
BarcodeValidator.validate(self)
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
class InvalidBarcode < ArgumentError; end
|
|
32
|
+
end
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
module RussianPost
|
|
2
|
+
class BarcodeValidator
|
|
3
|
+
attr_reader :barcode, :digits
|
|
4
|
+
|
|
5
|
+
INTERNATIONAL_FORMAT = /\A([A-Z]{2}\d{9}[A-Z]{2})\Z/
|
|
6
|
+
DOMESTIC_FORMAT = /\A(\d{14})\Z/
|
|
7
|
+
WEIGHT_FACTORS = [8, 6, 4, 2, 3, 5, 9, 7, 0]
|
|
8
|
+
|
|
9
|
+
def self.validate(barcode)
|
|
10
|
+
new(barcode).valid?
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def initialize(barcode)
|
|
14
|
+
@barcode = barcode
|
|
15
|
+
@digits = barcode.digits
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def valid?
|
|
19
|
+
valid_international? || valid_domestic?
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
private
|
|
24
|
+
|
|
25
|
+
def valid_international?
|
|
26
|
+
barcode =~ INTERNATIONAL_FORMAT && digits.last == checkdigit
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def valid_domestic?
|
|
30
|
+
barcode =~ DOMESTIC_FORMAT
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def checkdigit
|
|
34
|
+
if (1..9).include? checksum
|
|
35
|
+
checksum
|
|
36
|
+
else
|
|
37
|
+
checksum == 10 ? 0 : 5
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def checksum
|
|
42
|
+
product = digits.zip(WEIGHT_FACTORS)
|
|
43
|
+
(11 - product.map{|i| i.reduce(:*)}.reduce(:+)) % 11
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
data/lib/russianpost/client.rb
CHANGED
|
@@ -3,11 +3,16 @@ require "savon"
|
|
|
3
3
|
module RussianPost
|
|
4
4
|
class Client
|
|
5
5
|
attr_reader :savon, :endpoint, :namespace
|
|
6
|
+
|
|
7
|
+
ENDPOINT = "http://voh.russianpost.ru:8080/niips-operationhistory-web/OperationHistory"
|
|
8
|
+
NAMESPACE = "http://russianpost.org/operationhistory/data"
|
|
6
9
|
|
|
7
|
-
def initialize
|
|
8
|
-
@
|
|
9
|
-
|
|
10
|
-
|
|
10
|
+
def initialize(opts = {})
|
|
11
|
+
@savon = Savon.client(
|
|
12
|
+
endpoint: ENDPOINT,
|
|
13
|
+
namespace: NAMESPACE,
|
|
14
|
+
open_timeout: opts[:timeout] || 10, # in seconds
|
|
15
|
+
log: false)
|
|
11
16
|
end
|
|
12
17
|
|
|
13
18
|
def call(opts = {barcode: nil})
|
data/lib/russianpost/parcel.rb
CHANGED
|
@@ -1,15 +1,14 @@
|
|
|
1
1
|
require "russianpost/client"
|
|
2
2
|
require "russianpost/operations_factory"
|
|
3
|
+
require "russianpost/barcode"
|
|
3
4
|
|
|
4
5
|
module RussianPost
|
|
5
6
|
class Parcel
|
|
6
7
|
attr_reader :barcode, :client
|
|
7
8
|
|
|
8
9
|
def initialize(barcode, opts = {})
|
|
9
|
-
@barcode = barcode
|
|
10
|
+
@barcode = Barcode.new(barcode)
|
|
10
11
|
@client = (opts[:client] || Client).new
|
|
11
|
-
|
|
12
|
-
raise InvalidBarcode unless barcode_is_valid?
|
|
13
12
|
end
|
|
14
13
|
|
|
15
14
|
def operations
|
|
@@ -21,11 +20,5 @@ module RussianPost
|
|
|
21
20
|
def fetch_operations
|
|
22
21
|
OperationsFactory.build(client.call(barcode: barcode))
|
|
23
22
|
end
|
|
24
|
-
|
|
25
|
-
def barcode_is_valid?
|
|
26
|
-
barcode =~ /\A([A-Z]{2}\d{9}[A-Z]{2})|(\d{14})\z/
|
|
27
|
-
end
|
|
28
23
|
end
|
|
29
|
-
|
|
30
|
-
class InvalidBarcode < ArgumentError; end
|
|
31
24
|
end
|
data/lib/russianpost/version.rb
CHANGED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
require "test_helper"
|
|
2
|
+
require "russianpost/barcode"
|
|
3
|
+
|
|
4
|
+
class BarcodeTest < MiniTest::Unit::TestCase
|
|
5
|
+
def test_implicitly_converts_to_string
|
|
6
|
+
barcode = RussianPost::Barcode.new("RD025500807SE")
|
|
7
|
+
assert_equal "bar RD025500807SE", "bar #{barcode}"
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def test_raises_on_invalid_barcode
|
|
11
|
+
["123", "RR123456789EE"].each do |barcode|
|
|
12
|
+
assert_raises RussianPost::InvalidBarcode do
|
|
13
|
+
RussianPost::Barcode.new(barcode)
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def test_doesnt_raise_on_valid_barcode
|
|
19
|
+
["RD025500807SE", "12345678901234"].each do |barcode|
|
|
20
|
+
RussianPost::Barcode.new(barcode)
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -12,7 +12,7 @@ class ParcelTest < MiniTest::Unit::TestCase
|
|
|
12
12
|
|
|
13
13
|
def test_returns_empty_array_on_nonexistent_parcel
|
|
14
14
|
VCR.use_cassette("nonexistent_parcel") do
|
|
15
|
-
parcel = RussianPost::Parcel.new("
|
|
15
|
+
parcel = RussianPost::Parcel.new("RR123456785EE")
|
|
16
16
|
assert_kind_of Array, parcel.operations
|
|
17
17
|
assert parcel.operations.empty?
|
|
18
18
|
end
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: russianpost
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.3.
|
|
4
|
+
version: 0.3.1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Artem Shitov
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2013-04-
|
|
11
|
+
date: 2013-04-28 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: bundler
|
|
@@ -96,6 +96,8 @@ files:
|
|
|
96
96
|
- README.md
|
|
97
97
|
- Rakefile
|
|
98
98
|
- lib/russianpost.rb
|
|
99
|
+
- lib/russianpost/barcode.rb
|
|
100
|
+
- lib/russianpost/barcode_validator.rb
|
|
99
101
|
- lib/russianpost/client.rb
|
|
100
102
|
- lib/russianpost/operation.rb
|
|
101
103
|
- lib/russianpost/operations_factory.rb
|
|
@@ -104,6 +106,7 @@ files:
|
|
|
104
106
|
- russianpost.gemspec
|
|
105
107
|
- test/fixtures/vcr_cassettes/nonexistent_parcel.yml
|
|
106
108
|
- test/fixtures/vcr_cassettes/valid_barcode.yml
|
|
109
|
+
- test/russianpost/barcode_test.rb
|
|
107
110
|
- test/russianpost/client_test.rb
|
|
108
111
|
- test/russianpost/parcel_test.rb
|
|
109
112
|
- test/test_helper.rb
|
|
@@ -134,6 +137,7 @@ summary: Russian Post package tracking API client
|
|
|
134
137
|
test_files:
|
|
135
138
|
- test/fixtures/vcr_cassettes/nonexistent_parcel.yml
|
|
136
139
|
- test/fixtures/vcr_cassettes/valid_barcode.yml
|
|
140
|
+
- test/russianpost/barcode_test.rb
|
|
137
141
|
- test/russianpost/client_test.rb
|
|
138
142
|
- test/russianpost/parcel_test.rb
|
|
139
143
|
- test/test_helper.rb
|