elibri_api_client 1.1.0 → 1.1.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.
data/Gemfile CHANGED
@@ -1,8 +1,9 @@
1
1
  source "http://rubygems.org"
2
2
 
3
- gem "httparty", "~> 0.7.8"
3
+ gem "httparty", "= 0.8.1"
4
4
  gem "nokogiri", "~> 1.5.0"
5
- gem 'activesupport', '>= 3.1.0.rc1'
5
+ gem 'activesupport', '>= 3.1.0'
6
+ gem 'elibri_onix', '>= 0.1.3'
6
7
 
7
8
  group :development do
8
9
  gem "pry"
data/Gemfile.lock CHANGED
@@ -1,13 +1,18 @@
1
1
  GEM
2
2
  remote: http://rubygems.org/
3
3
  specs:
4
- activesupport (3.1.0.rc1)
4
+ activesupport (3.1.1)
5
5
  multi_json (~> 1.0)
6
6
  coderay (0.9.8)
7
- crack (0.1.8)
7
+ elibri_onix (0.1.3)
8
+ activesupport (>= 3.1.0)
9
+ i18n
10
+ roxml (= 3.1.6)
8
11
  git (1.2.5)
9
- httparty (0.7.8)
10
- crack (= 0.1.8)
12
+ httparty (0.8.1)
13
+ multi_json
14
+ multi_xml
15
+ i18n (0.6.0)
11
16
  jeweler (1.6.2)
12
17
  bundler (~> 1.0)
13
18
  git (>= 1.2.5)
@@ -17,6 +22,7 @@ GEM
17
22
  minitest (2.2.2)
18
23
  mocha (0.9.12)
19
24
  multi_json (1.0.3)
25
+ multi_xml (0.4.1)
20
26
  nokogiri (1.5.0)
21
27
  pry (0.9.6)
22
28
  coderay (>= 0.9.8)
@@ -25,6 +31,9 @@ GEM
25
31
  slop (~> 2.1.0)
26
32
  rake (0.9.0)
27
33
  rcov (0.9.9)
34
+ roxml (3.1.6)
35
+ activesupport (>= 2.3.0)
36
+ nokogiri (>= 1.3.3)
28
37
  ruby_parser (2.3.0)
29
38
  sexp_processor (~> 3.0)
30
39
  sexp_processor (3.0.6)
@@ -34,9 +43,10 @@ PLATFORMS
34
43
  ruby
35
44
 
36
45
  DEPENDENCIES
37
- activesupport (>= 3.1.0.rc1)
46
+ activesupport (>= 3.1.0)
38
47
  bundler (~> 1.0.0)
39
- httparty (~> 0.7.8)
48
+ elibri_onix (>= 0.1.3)
49
+ httparty (= 0.8.1)
40
50
  jeweler (~> 1.6.2)
41
51
  minitest
42
52
  mocha
data/README.rdoc CHANGED
@@ -4,7 +4,7 @@
4
4
  gem 'elibri_api_client'
5
5
 
6
6
  === 1. Tworzymy instancje klienta
7
- elibri = Elibri::ApiClient.new(:login => '1b20fa9d72234423979c', :password => '2847cbf4f15a4057e2ab')
7
+ elibri = Elibri::ApiClient.new(:login => '1b20fa9d72234423979c', :password => '2847cbf4f15a4057e2ab', :api_version => 'v1', :onix_dialect => '3.0.1')
8
8
 
9
9
  === 2. Przegladanie dostepnych danych
10
10
 
@@ -24,16 +24,15 @@
24
24
 
25
25
  # Wypelnij wszystkie kolejki oczekujace, wszystkimi dostepnymi danymi.
26
26
  # Przydatne przy wykonywaniu pelnej synchronizacji pomiedzy nasza aplikacja a Elibri.
27
- # Inna mozliwosc to iteracja elibri.publishers i sekwencyjne pobieranie danych kolejnych
28
- # produktow (moze byc wolniejsze od kolejek zmian).
29
- # elibri.refill_all_queues!
27
+ elibri.refill_all_queues!
30
28
 
31
29
  elibri.pending_queues.each do |pending_queue|
32
- pending_queue.each_product do |product_xml|
33
- # Otrzymujemy przeparsowany XML za pomoca Nokogiri
34
- # product_xml.class => Nokogiri::XML::Element
35
-
36
- puts product_xml.css('RecordReference').text
30
+ # Wykonuj blok, dopoki sa dane w kolejce
31
+ pending_queue.each_pop(:count => 10) do |pop|
32
+ puts pop.onix.release
33
+ pop.onix.products.each do |product|
34
+ puts "#{product.record_reference} #{product.isbn13} #{product.publisher.name} #{product.full_title}"
35
+ end
37
36
  end
38
37
  end
39
38
 
@@ -42,12 +41,14 @@
42
41
  meta = elibri.pending_queues.find {|queue| queue.name == 'meta'}
43
42
 
44
43
  pop = meta.pop(:count => 5, :testing => true)
45
- pop.each_product {|product_xml| puts product_xml.css('RecordReference').text }
44
+ pop.onix.products.each {|product| puts product.full_title }
45
+ puts pop.xml
46
46
 
47
47
  last_pop = meta.last_pop
48
48
 
49
49
 
50
50
  ==== 3c. Znadz ostatnio pobrane kolejki
51
+
51
52
  last_pop = elibri.last_pop_from_queue('meta')
52
53
 
53
54
 
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{elibri_api_client}
8
- s.version = "1.1.0"
8
+ s.version = "1.1.1"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Marcin Urba\305\204ski"]
12
- s.date = %q{2011-09-30}
12
+ s.date = %q{2011-10-09}
13
13
  s.description = %q{API client for elibri.com.pl publishing system}
14
14
  s.email = %q{marcin@urbanski.vdl.pl}
15
15
  s.extra_rdoc_files = [
@@ -48,9 +48,10 @@ Gem::Specification.new do |s|
48
48
  s.specification_version = 3
49
49
 
50
50
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
51
- s.add_runtime_dependency(%q<httparty>, ["~> 0.7.8"])
51
+ s.add_runtime_dependency(%q<httparty>, ["= 0.8.1"])
52
52
  s.add_runtime_dependency(%q<nokogiri>, ["~> 1.5.0"])
53
- s.add_runtime_dependency(%q<activesupport>, [">= 3.1.0.rc1"])
53
+ s.add_runtime_dependency(%q<activesupport>, [">= 3.1.0"])
54
+ s.add_runtime_dependency(%q<elibri_onix>, [">= 0.1.3"])
54
55
  s.add_development_dependency(%q<pry>, [">= 0"])
55
56
  s.add_development_dependency(%q<mocha>, [">= 0"])
56
57
  s.add_development_dependency(%q<minitest>, [">= 0"])
@@ -58,9 +59,10 @@ Gem::Specification.new do |s|
58
59
  s.add_development_dependency(%q<jeweler>, ["~> 1.6.2"])
59
60
  s.add_development_dependency(%q<rcov>, [">= 0"])
60
61
  else
61
- s.add_dependency(%q<httparty>, ["~> 0.7.8"])
62
+ s.add_dependency(%q<httparty>, ["= 0.8.1"])
62
63
  s.add_dependency(%q<nokogiri>, ["~> 1.5.0"])
63
- s.add_dependency(%q<activesupport>, [">= 3.1.0.rc1"])
64
+ s.add_dependency(%q<activesupport>, [">= 3.1.0"])
65
+ s.add_dependency(%q<elibri_onix>, [">= 0.1.3"])
64
66
  s.add_dependency(%q<pry>, [">= 0"])
65
67
  s.add_dependency(%q<mocha>, [">= 0"])
66
68
  s.add_dependency(%q<minitest>, [">= 0"])
@@ -69,9 +71,10 @@ Gem::Specification.new do |s|
69
71
  s.add_dependency(%q<rcov>, [">= 0"])
70
72
  end
71
73
  else
72
- s.add_dependency(%q<httparty>, ["~> 0.7.8"])
74
+ s.add_dependency(%q<httparty>, ["= 0.8.1"])
73
75
  s.add_dependency(%q<nokogiri>, ["~> 1.5.0"])
74
- s.add_dependency(%q<activesupport>, [">= 3.1.0.rc1"])
76
+ s.add_dependency(%q<activesupport>, [">= 3.1.0"])
77
+ s.add_dependency(%q<elibri_onix>, [">= 0.1.3"])
75
78
  s.add_dependency(%q<pry>, [">= 0"])
76
79
  s.add_dependency(%q<mocha>, [">= 0"])
77
80
  s.add_dependency(%q<minitest>, [">= 0"])
@@ -2,9 +2,11 @@
2
2
  require 'time'
3
3
  require 'httparty'
4
4
  require 'nokogiri'
5
+ require 'elibri_onix'
5
6
  require 'forwardable'
6
7
  require 'active_support/core_ext/object/blank'
7
8
  require 'active_support/core_ext/hash/keys'
9
+ require 'active_support/core_ext/string/strip'
8
10
  require 'elibri_api_client/core_extensions'
9
11
  require 'elibri_api_client/version'
10
12
  require 'elibri_api_client/api_adapters'
@@ -27,15 +29,17 @@ module Elibri
27
29
  # Opcjonalnie mozna podac adres servera API:
28
30
  # cli = Elibri::ApiClient.new(:host_uri => 'http://localhost:3010', :login => '1b20fa9d72234423979c', :password => '2847cbf4f15a4057e2ab')
29
31
  def initialize(options = {})
30
- options.assert_valid_keys(:login, :password, :host_uri, :api_version)
32
+ options.assert_valid_keys(:login, :password, :host_uri, :api_version, :onix_dialect)
31
33
  @login = options[:login]
32
34
  @password = options[:password]
33
35
  @host_uri = options[:host_uri] || DEFAULT_API_HOST_URI
36
+ @onix_dialect = options[:onix_dialect]
37
+ raise 'Please specify :onix_dialect' unless @onix_dialect.present?
34
38
 
35
39
  # W przyszlosci moga byc nowe wersje API, wiec zostawiamy sobie furtke w postaci adapterow:
36
40
  api_version_str = options[:api_version] || 'v1'
37
41
  adapter_class = Elibri::ApiClient::ApiAdapters.const_get(api_version_str.upcase) # Elibri::ApiClient::ApiAdapters::V1
38
- @api_adapter = adapter_class.new(@host_uri, @login, @password)
42
+ @api_adapter = adapter_class.new(@host_uri, @login, @password, @onix_dialect)
39
43
  end
40
44
 
41
45
 
@@ -14,8 +14,9 @@ module Elibri
14
14
  # debug_output $stderr
15
15
  #++
16
16
 
17
- def initialize(host_uri, login, password) #:nodoc:
17
+ def initialize(host_uri, login, password, onix_dialect) #:nodoc:
18
18
  @host_uri = host_uri
19
+ @onix_dialect = onix_dialect
19
20
  @auth = {:username => login, :password => password}
20
21
  end
21
22
 
@@ -73,20 +74,30 @@ module Elibri
73
74
  end
74
75
 
75
76
 
76
- # Options moze przyjac {:testing => 1, :count => 100}
77
- def pop_from_queue(queue_name, options = {})
78
- options[:testing] = 1 if options[:testing]
79
- options = ' ' if options.empty?
80
- response = post "/queues/#{queue_name}/pop", :body => options
81
- pop_xml = response.parsed_response.css('pop').first
82
- Elibri::ApiClient::ApiAdapters::V1::QueuePop.build_from_xml(pop_xml)
77
+ # params moze przyjac {:testing => 1, :count => 100}
78
+ def pop_from_queue(queue_name, params = {})
79
+ params[:testing] = 1 if params[:testing]
80
+ params = ' ' if params.empty?
81
+ response = post "/queues/#{queue_name}/pop", :body => params, :headers => {"X-eLibri-API-ONIX-dialect" => @onix_dialect}
82
+
83
+ return nil unless response.headers["x-elibri-api-pop-products-count"].to_i > 0
84
+ Elibri::ApiClient::ApiAdapters::V1::QueuePop.new(
85
+ :queue_name => response.headers["x-elibri-api-pop-queue-name"],
86
+ :popped_products_count => response.headers["x-elibri-api-pop-products-count"],
87
+ :created_at => response.headers["x-elibri-api-pop-created-at"],
88
+ :xml => response.body
89
+ )
83
90
  end
84
91
 
85
92
 
86
93
  def last_pop_from_queue(queue_name)
87
- response = get "/queues/#{queue_name}/last_pop"
88
- pop_xml = response.parsed_response.css('pop').first
89
- Elibri::ApiClient::ApiAdapters::V1::QueuePop.build_from_xml(pop_xml)
94
+ response = get "/queues/#{queue_name}/last_pop", :headers => {"X-eLibri-API-ONIX-dialect" => @onix_dialect}
95
+ Elibri::ApiClient::ApiAdapters::V1::QueuePop.new(
96
+ :queue_name => response.headers["x-elibri-api-pop-queue-name"],
97
+ :popped_products_count => response.headers["x-elibri-api-pop-products-count"],
98
+ :created_at => response.headers["x-elibri-api-pop-created-at"],
99
+ :xml => response.body
100
+ )
90
101
  rescue Exceptions::NoRecentlyPoppedData # Ignoruj bledy o braku ostatnich POPow.
91
102
  return nil
92
103
  end
@@ -109,7 +120,7 @@ module Elibri
109
120
  # Zwroc ONIX dla konkretnego produktu.
110
121
  def onix_xml_for_product(product) #:nodoc:
111
122
  raise 'Need a Elibri::ApiClient::ApiAdapters::V1::Product instance' unless product.kind_of? Elibri::ApiClient::ApiAdapters::V1::Product
112
- resp = get "/products/#{product.record_reference}"
123
+ resp = get "/products/#{product.record_reference}", :headers => {"X-eLibri-API-ONIX-dialect" => @onix_dialect}
113
124
  resp.parsed_response.css('Product').first
114
125
  end
115
126
 
@@ -15,6 +15,7 @@ module Elibri #:nodoc:
15
15
  class ServerError < RuntimeError; end
16
16
  class QueueDoesNotExists < RuntimeError; end
17
17
  class NoRecentlyPoppedData < RuntimeError; end
18
+ class InvalidOnixDialect < RuntimeError; end
18
19
  end
19
20
 
20
21
  # Klasy wyjatkow rzucanych, gdy elibri zwroci okreslony blad. Np. gdy dostaniemy:
@@ -28,6 +29,7 @@ module Elibri #:nodoc:
28
29
  '500' => Exceptions::ServerError,
29
30
  '1001' => Exceptions::QueueDoesNotExists,
30
31
  '1002' => Exceptions::NoRecentlyPoppedData,
32
+ '1003' => Exceptions::InvalidOnixDialect,
31
33
  }.freeze
32
34
 
33
35
 
@@ -62,10 +64,10 @@ module Elibri #:nodoc:
62
64
  end
63
65
 
64
66
 
65
- # Iteruj po kolejnych rekordach ONIX w nazwanej kolejce.
66
- def each_product(&block) #:yields: product_xml
67
- while (_pop = pop).popped_products_count > 0
68
- _pop.each_product(&block)
67
+ # Iteruj po kolejnych POP`ach w nazwanej kolejce.
68
+ def each_pop(options = {}, &block) #:yields: QueuePop
69
+ while _pop = pop(options)
70
+ yield _pop
69
71
  end
70
72
  end
71
73
 
@@ -90,33 +92,19 @@ module Elibri #:nodoc:
90
92
  attr_reader :popped_products_count
91
93
  # Kiedy POP zostal wykonany?
92
94
  attr_reader :created_at
93
- # ONIX pobranych produktow
94
- attr_reader :products_xmls
95
+ # Pelna tresc ONIX - lacznie z naglowkiem
96
+ attr_reader :xml
97
+ # ONIX przeparsowany za pomoca gemu elibri_onix
98
+ attr_reader :onix
95
99
 
96
100
 
97
101
  def initialize(attributes = {}) #:nodoc:
98
- attributes.assert_valid_keys(:queue_name, :popped_products_count, :created_at, :products_xmls)
102
+ attributes.assert_valid_keys(:queue_name, :popped_products_count, :created_at, :xml)
99
103
  @queue_name = attributes[:queue_name]
100
104
  @popped_products_count = attributes[:popped_products_count].to_i
101
- @products_xmls = attributes[:products_xmls]
102
- @created_at = Time.parse(attributes[:created_at])
103
- end
104
-
105
-
106
- def each_product(&block)
107
- @products_xmls.each(&block)
108
- end
109
-
110
-
111
- # Zbuduj instancje na podstawie XML`a.
112
- def self.build_from_xml(pop_xml) #:nodoc:
113
- pop_xml = Nokogiri::XML(pop_xml).css('pop').first if pop_xml.is_a? String
114
- QueuePop.new(
115
- :queue_name => pop_xml['queue_name'],
116
- :popped_products_count => pop_xml['popped_products_count'].to_i,
117
- :created_at => pop_xml['created_at'],
118
- :products_xmls => pop_xml.css('Product')
119
- )
105
+ @xml = attributes[:xml]
106
+ @created_at = Time.parse(attributes[:created_at]) rescue nil
107
+ @onix = Elibri::ONIX::Release_3_0::ONIXMessage.from_xml(@xml) if @xml.present?
120
108
  end
121
109
 
122
110
  end
@@ -4,7 +4,7 @@ module Elibri
4
4
  module Version
5
5
  MAJOR = 1
6
6
  MINOR = 1
7
- PATCH = 0
7
+ PATCH = 1
8
8
 
9
9
  STRING = [MAJOR, MINOR, PATCH].compact.join('.')
10
10
  end
@@ -7,7 +7,7 @@ module Elibri
7
7
  module ApiAdapters
8
8
  # Testowy adapter.
9
9
  class V999
10
- def initialize(host_uri, login, password)
10
+ def initialize(host_uri, login, password, onix_dialect)
11
11
  end
12
12
  end
13
13
  end
@@ -23,22 +23,29 @@ describe Elibri::ApiClient do
23
23
 
24
24
 
25
25
  it "should take some defaults in constructor" do
26
- client = Elibri::ApiClient.new(:login => 'elibri_login', :password => 'pass')
26
+ client = Elibri::ApiClient.new(:login => 'elibri_login', :password => 'pass', :onix_dialect => '3.0.1')
27
27
  assert_equal Elibri::ApiClient::DEFAULT_API_HOST_URI, client.host_uri
28
28
 
29
- client = Elibri::ApiClient.new(:login => 'elibri_login', :password => 'pass', :host_uri => 'http://localhost:3000')
29
+ client = Elibri::ApiClient.new(:login => 'elibri_login', :password => 'pass', :host_uri => 'http://localhost:3000', :onix_dialect => '3.0.1')
30
30
  assert_equal 'http://localhost:3000', client.host_uri
31
31
  end
32
32
 
33
33
 
34
+ it "should force user to specify ONIX dialect" do
35
+ assert_raises RuntimeError do
36
+ Elibri::ApiClient.new(:login => 'elibri_login', :password => 'pass')
37
+ end
38
+ end
39
+
40
+
34
41
  it "should enable user to pick a version of API" do
35
- client = Elibri::ApiClient.new(:login => 'elibri_login', :password => 'pass', :api_version => 'v999')
42
+ client = Elibri::ApiClient.new(:login => 'elibri_login', :password => 'pass', :api_version => 'v999', :onix_dialect => '3.0.1')
36
43
  assert_kind_of Elibri::ApiClient::ApiAdapters::V999, client.instance_variable_get('@api_adapter')
37
44
  end
38
45
 
39
46
 
40
47
  it "should delegate several methods to apropriate API adapter" do
41
- client = Elibri::ApiClient.new(:login => 'elibri_login', :password => 'pass')
48
+ client = Elibri::ApiClient.new(:login => 'elibri_login', :password => 'pass', :onix_dialect => '3.0.1')
42
49
 
43
50
  delegated_methods = %w{refill_all_queues! pending_data? pending_queues publishers}
44
51
  delegated_methods.each {|method_name| client.instance_variable_get('@api_adapter').expects(method_name) }
@@ -5,15 +5,22 @@ require 'helper'
5
5
  describe Elibri::ApiClient::ApiAdapters::V1::QueuePop do
6
6
 
7
7
  before do
8
- @products_xmls = Nokogiri::XML(<<-XML).css('Product')
9
- <root>
8
+ @xml = <<-XML.strip_heredoc
9
+ <?xml version="1.0" encoding="UTF-8"?>
10
+ <ONIXMessage release="3.0" xmlns:elibri="http://elibri.com.pl/ns/extensions" xmlns="http://www.editeur.org/onix/3.0/reference">
11
+ <elibri:Dialect>3.0.1</elibri:Dialect>
12
+ <Header>
13
+ <Sender>
14
+ <SenderName>Elibri.com.pl</SenderName>
15
+ <ContactName>Tomasz Meka</ContactName>
16
+ <EmailAddress>kontakt@elibri.com.pl</EmailAddress>
17
+ </Sender>
18
+ <SentDateTime>20111009</SentDateTime>
19
+ </Header>
10
20
  <Product>
11
- <RecordReference>123</RecordReference>
21
+ <RecordReference>fdb8fa072be774d97a97</RecordReference>
12
22
  </Product>
13
- <Product>
14
- <RecordReference>456</RecordReference>
15
- </Product>
16
- </root>
23
+ </ONIXMessage>
17
24
  XML
18
25
  end
19
26
 
@@ -24,42 +31,15 @@ describe Elibri::ApiClient::ApiAdapters::V1::QueuePop do
24
31
  :queue_name => 'meta',
25
32
  :popped_products_count => 120,
26
33
  :created_at => time.to_s,
27
- :products_xmls => @products_xmls
34
+ :xml => @xml
28
35
  )
29
36
 
30
37
  assert_equal 'meta', queue_pop.queue_name
31
38
  assert_equal 120, queue_pop.popped_products_count
32
39
  assert_equal time.to_i, queue_pop.created_at.to_i
33
- assert_equal @products_xmls, queue_pop.products_xmls
34
- end
35
-
36
-
37
- it "should be able to build itself from provided XML" do
38
- xml = <<-XML
39
- <pop queue_name="meta" popped_products_count="1500" created_at="2011-02-05 21:02:22 UTC">
40
- #{@products_xmls.to_s}
41
- </pop>
42
- XML
43
-
44
- queue_pop = Elibri::ApiClient::ApiAdapters::V1::QueuePop.build_from_xml(xml)
45
- assert_equal 'meta', queue_pop.queue_name
46
- assert_equal 1500, queue_pop.popped_products_count
47
- assert_equal Time.parse("2011-02-05 21:02:22 UTC"), queue_pop.created_at
48
- assert_equal 2, queue_pop.products_xmls.size
49
- end
50
-
51
-
52
- it "should provide iterator for traversing products list" do
53
- xml = <<-XML
54
- <pop queue_name="meta" popped_products_count="1500" created_at="2011-02-05 21:02:22 UTC">
55
- #{@products_xmls.to_s}
56
- </pop>
57
- XML
58
-
59
- queue_pop = Elibri::ApiClient::ApiAdapters::V1::QueuePop.build_from_xml(xml)
60
- record_references = []
61
- queue_pop.each_product {|product_xml| record_references << product_xml.css('RecordReference').text }
62
- assert_equal ['123', '456'], record_references
40
+ assert_equal @xml, queue_pop.xml
41
+ assert_kind_of Elibri::ONIX::Release_3_0::ONIXMessage, queue_pop.onix
42
+ assert_equal 'fdb8fa072be774d97a97', queue_pop.onix.products.first.record_reference
63
43
  end
64
44
 
65
45
 
@@ -46,16 +46,15 @@ describe Elibri::ApiClient::ApiAdapters::V1::Queue do
46
46
  end
47
47
 
48
48
 
49
- it "should provide iterator for traversing products list" do
49
+ it "should provide iterator for traversing through each pop" do
50
50
  queue = Elibri::ApiClient::ApiAdapters::V1::Queue.new(@api_adapter, :name => 'meta')
51
- pop_with_products = mock('QueuePop', :popped_products_count => 10)
52
- pop_with_products.expects(:each_product)
51
+ pop_with_products = stub('QueuePop', :popped_products_count => 5)
52
+ pop_with_products2 = stub('QueuePop', :popped_products_count => 3)
53
+ queue.expects(:pop).with(:count => 5).returns(pop_with_products).then.returns(pop_with_products2).then.returns(nil).times(3)
53
54
 
54
- pop_without_products = mock('QueuePop', :popped_products_count => 0)
55
- pop_without_products.expects(:each_product).never
56
- queue.expects(:pop).returns(pop_with_products).then.returns(pop_without_products).twice
57
-
58
- queue.each_product {|product_xml| product_xml.css('RecordReference') }
55
+ pops = []
56
+ queue.each_pop(:count => 5) {|pop| pops << pop }
57
+ assert_equal [pop_with_products, pop_with_products2], pops
59
58
  end
60
59
 
61
60
 
@@ -5,30 +5,31 @@ describe Elibri::ApiClient::ApiAdapters::V1 do
5
5
 
6
6
  FAKE_API_HOST = 'http://localhost:5000'
7
7
 
8
- def get_request_expected(request_uri)
8
+ def get_request_expected(request_uri, options = {})
9
9
  Elibri::ApiClient::ApiAdapters::V1.expects(:get).with(
10
10
  request_uri,
11
- {:digest_auth => {:username => 'login', :password => 'password'}}
11
+ {:digest_auth => {:username => 'login', :password => 'password'}}.merge(options)
12
12
  )
13
13
  end
14
14
 
15
15
 
16
16
  def post_request_expected(request_uri, options = {})
17
- options = ' ' if options.empty?
17
+ options[:body] = ' ' unless options[:body]
18
+
18
19
  Elibri::ApiClient::ApiAdapters::V1.expects(:post).with(
19
20
  request_uri,
20
- {:body => options, :digest_auth => {:username => 'login', :password => 'password'}}
21
+ {:digest_auth => {:username => 'login', :password => 'password'}}.merge(options)
21
22
  )
22
23
  end
23
24
 
24
25
 
25
26
  before do
26
- @adapter = Elibri::ApiClient::ApiAdapters::V1.new(FAKE_API_HOST, 'login', 'password')
27
+ @adapter = Elibri::ApiClient::ApiAdapters::V1.new(FAKE_API_HOST, 'login', 'password', '3.0.1')
27
28
  end
28
29
 
29
30
 
30
31
  it "should define several exception classes" do
31
- exception_classes = %w{Unauthorized NotFound Forbidden ServerError QueueDoesNotExists NoRecentlyPoppedData}
32
+ exception_classes = %w{Unauthorized NotFound Forbidden ServerError QueueDoesNotExists NoRecentlyPoppedData InvalidOnixDialect}
32
33
  exception_classes.each do |exception_class|
33
34
  assert(Elibri::ApiClient::ApiAdapters::V1::Exceptions.const_get(exception_class) < RuntimeError)
34
35
  end
@@ -121,6 +122,7 @@ describe Elibri::ApiClient::ApiAdapters::V1 do
121
122
  '500' => Elibri::ApiClient::ApiAdapters::V1::Exceptions::ServerError,
122
123
  '1001' => Elibri::ApiClient::ApiAdapters::V1::Exceptions::QueueDoesNotExists,
123
124
  '1002' => Elibri::ApiClient::ApiAdapters::V1::Exceptions::NoRecentlyPoppedData,
125
+ '1003' => Elibri::ApiClient::ApiAdapters::V1::Exceptions::InvalidOnixDialect,
124
126
  }
125
127
  end
126
128
 
@@ -220,7 +222,7 @@ describe Elibri::ApiClient::ApiAdapters::V1 do
220
222
  @product = Elibri::ApiClient::ApiAdapters::V1::Product.new(@adapter, stub('publisher'), :record_reference => '076eb83a5f01cb03a217')
221
223
  xml = %Q{<Product><RecordReference>076eb83a5f01cb03a217</RecordReference></Product>}
222
224
  response_stub = stub('response_stub', :code => 200, :parsed_response => Nokogiri::XML(xml))
223
- get_request_expected("#{FAKE_API_HOST}/api/v1/products/076eb83a5f01cb03a217").at_least_once.returns(response_stub)
225
+ get_request_expected("#{FAKE_API_HOST}/api/v1/products/076eb83a5f01cb03a217", :headers => {'X-eLibri-API-ONIX-dialect' => '3.0.1'}).at_least_once.returns(response_stub)
224
226
  end
225
227
 
226
228
 
@@ -237,47 +239,87 @@ describe Elibri::ApiClient::ApiAdapters::V1 do
237
239
  describe "when asked to pop data from specified queue name" do
238
240
 
239
241
  before do
240
- xml = <<-XML
241
- <pop created_at="2011-09-06 13:58:21 UTC" queue_name="meta" popped_products_count="2">
242
- <ONIXMessage release="3.0">
243
- <Header>
244
- <Sender>
245
- <SenderName>Elibri.com.pl</SenderName>
246
- <ContactName>Tomasz Meka</ContactName>
247
- <EmailAddress>kontakt@elibri.com.pl</EmailAddress>
248
- </Sender>
249
- <SentDateTime>20110906</SentDateTime>
250
- </Header>
251
-
252
- <Product>
253
- </Product>
254
- <Product>
255
- </Product>
256
- </ONIXMessage>
257
- </pop>
242
+ @xml = <<-XML
243
+ <?xml version="1.0" encoding="UTF-8"?>
244
+ <ONIXMessage release="3.0" xmlns:elibri="http://elibri.com.pl/ns/extensions" xmlns="http://www.editeur.org/onix/3.0/reference">
245
+ <elibri:Dialect>3.0.1</elibri:Dialect>
246
+ <Header>
247
+ <Sender>
248
+ <SenderName>Elibri.com.pl</SenderName>
249
+ <ContactName>Tomasz Meka</ContactName>
250
+ <EmailAddress>kontakt@elibri.com.pl</EmailAddress>
251
+ </Sender>
252
+ <SentDateTime>20111009</SentDateTime>
253
+ </Header>
254
+ <Product>
255
+ <RecordReference>fdb8fa072be774d97a97</RecordReference>
256
+ </Product>
257
+ <Product>
258
+ <RecordReference>6de1bed2f70a8cdae200</RecordReference>
259
+ </Product>
260
+ </ONIXMessage>
258
261
  XML
259
-
260
- @response_stub = stub('response_stub', :code => 200, :parsed_response => Nokogiri::XML(xml))
261
262
  end
262
263
 
263
264
 
264
265
  it "should send params when they are specified and return QueuePop instance" do
265
- post_request_expected("#{FAKE_API_HOST}/api/v1/queues/meta/pop", :testing => 1, :count => 5).at_least_once.returns(@response_stub)
266
+ @response_stub = stub('response_stub',
267
+ :code => 200,
268
+ :body => @xml,
269
+ :parsed_response => Nokogiri::XML(@xml),
270
+ :headers => {"x-elibri-api-pop-products-count" => 2, "x-elibri-api-pop-queue-name" => "meta", "x-elibri-api-pop-created-at" => "2011-09-06 13:58:21 UTC"}
271
+ )
272
+
273
+ post_request_expected(
274
+ "#{FAKE_API_HOST}/api/v1/queues/meta/pop",
275
+ :body => {:testing => 1, :count => 5},
276
+ :headers => {'X-eLibri-API-ONIX-dialect' => '3.0.1'}
277
+ ).at_least_once.returns(@response_stub)
266
278
 
267
279
  pop = @adapter.pop_from_queue('meta', :testing => true, :count => 5)
268
280
  assert_kind_of Elibri::ApiClient::ApiAdapters::V1::QueuePop, pop
269
281
  assert_equal 2, pop.popped_products_count
282
+ assert_equal 'fdb8fa072be774d97a97', pop.onix.products.first.record_reference
270
283
  end
271
284
 
272
285
 
273
286
  it "should send empty request body when no params are specified" do
274
- post_request_expected("#{FAKE_API_HOST}/api/v1/queues/meta/pop").at_least_once.returns(@response_stub)
287
+ @response_stub = stub('response_stub',
288
+ :code => 200,
289
+ :body => @xml,
290
+ :parsed_response => Nokogiri::XML(@xml),
291
+ :headers => {"x-elibri-api-pop-products-count" => 2, "x-elibri-api-pop-queue-name" => "meta", "x-elibri-api-pop-created-at" => "2011-09-06 13:58:21 UTC"}
292
+ )
293
+
294
+ post_request_expected(
295
+ "#{FAKE_API_HOST}/api/v1/queues/meta/pop",
296
+ :body => ' ',
297
+ :headers => {'X-eLibri-API-ONIX-dialect' => '3.0.1'}
298
+ ).at_least_once.returns(@response_stub)
275
299
 
276
300
  pop = @adapter.pop_from_queue('meta')
277
301
  assert_kind_of Elibri::ApiClient::ApiAdapters::V1::QueuePop, pop
278
302
  assert_equal 2, pop.popped_products_count
279
303
  end
280
304
 
305
+
306
+ it "should return nil when there is no data to pop" do
307
+ @response_stub = stub('response_stub',
308
+ :code => 200,
309
+ :body => nil,
310
+ :parsed_response => nil,
311
+ :headers => {"x-elibri-api-pop-products-count" => 0}
312
+ )
313
+
314
+ post_request_expected(
315
+ "#{FAKE_API_HOST}/api/v1/queues/meta/pop",
316
+ :body => ' ',
317
+ :headers => {'X-eLibri-API-ONIX-dialect' => '3.0.1'}
318
+ ).at_least_once.returns(@response_stub)
319
+
320
+ assert_nil @adapter.pop_from_queue('meta')
321
+ end
322
+
281
323
  end
282
324
 
283
325
 
@@ -287,7 +329,7 @@ describe Elibri::ApiClient::ApiAdapters::V1 do
287
329
  before do
288
330
  xml = %q{<error id='1002'> <message>There is no recently popped data</message> </error>}
289
331
  response_stub = stub('response_stub', :code => 412, :parsed_response => Nokogiri::XML(xml))
290
- get_request_expected("#{FAKE_API_HOST}/api/v1/queues/meta/last_pop").once.returns(response_stub)
332
+ get_request_expected("#{FAKE_API_HOST}/api/v1/queues/meta/last_pop", :headers => {'X-eLibri-API-ONIX-dialect' => '3.0.1'}).once.returns(response_stub)
291
333
  end
292
334
 
293
335
  it "should return nil, ignoring NoRecentlyPoppedData exception" do
@@ -299,36 +341,42 @@ describe Elibri::ApiClient::ApiAdapters::V1 do
299
341
  describe "and there was a pop" do
300
342
 
301
343
  before do
302
- xml = <<-XML
303
- <pop created_at="2011-09-06 13:58:21 UTC" queue_name="meta" popped_products_count="2">
304
- <ONIXMessage release="3.0">
305
- <Header>
306
- <Sender>
307
- <SenderName>Elibri.com.pl</SenderName>
308
- <ContactName>Tomasz Meka</ContactName>
309
- <EmailAddress>kontakt@elibri.com.pl</EmailAddress>
310
- </Sender>
311
- <SentDateTime>20110906</SentDateTime>
312
- </Header>
313
-
314
- <Product>
315
- </Product>
316
- <Product>
317
- </Product>
318
- </ONIXMessage>
319
- </pop>
344
+ @xml = <<-XML
345
+ <?xml version="1.0" encoding="UTF-8"?>
346
+ <ONIXMessage release="3.0" xmlns:elibri="http://elibri.com.pl/ns/extensions" xmlns="http://www.editeur.org/onix/3.0/reference">
347
+ <elibri:Dialect>3.0.1</elibri:Dialect>
348
+ <Header>
349
+ <Sender>
350
+ <SenderName>Elibri.com.pl</SenderName>
351
+ <ContactName>Tomasz Meka</ContactName>
352
+ <EmailAddress>kontakt@elibri.com.pl</EmailAddress>
353
+ </Sender>
354
+ <SentDateTime>20111009</SentDateTime>
355
+ </Header>
356
+ <Product>
357
+ <RecordReference>fdb8fa072be774d97a97</RecordReference>
358
+ </Product>
359
+ <Product>
360
+ <RecordReference>6de1bed2f70a8cdae200</RecordReference>
361
+ </Product>
362
+ </ONIXMessage>
320
363
  XML
321
-
322
- @response_stub = stub('response_stub', :code => 200, :parsed_response => Nokogiri::XML(xml))
323
364
  end
324
365
 
325
366
 
326
367
  it "should return QueuePop instance" do
327
- get_request_expected("#{FAKE_API_HOST}/api/v1/queues/meta/last_pop").at_least_once.returns(@response_stub)
368
+ response_stub = stub('response_stub',
369
+ :code => 200,
370
+ :body => @xml,
371
+ :parsed_response => Nokogiri::XML(@xml),
372
+ :headers => {"x-elibri-api-pop-products-count" => 2, "x-elibri-api-pop-queue-name" => "meta", "x-elibri-api-pop-created-at" => "2011-09-06 13:58:21 UTC"}
373
+ )
374
+ get_request_expected("#{FAKE_API_HOST}/api/v1/queues/meta/last_pop", :headers => {'X-eLibri-API-ONIX-dialect' => '3.0.1'}).at_least_once.returns(response_stub)
328
375
 
329
376
  pop = @adapter.last_pop_from_queue('meta')
330
377
  assert_kind_of Elibri::ApiClient::ApiAdapters::V1::QueuePop, pop
331
378
  assert_equal 2, pop.popped_products_count
379
+ assert_equal 'fdb8fa072be774d97a97', pop.onix.products.first.record_reference
332
380
  end
333
381
  end
334
382
 
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: elibri_api_client
3
3
  version: !ruby/object:Gem::Version
4
- hash: 19
4
+ hash: 17
5
5
  prerelease:
6
6
  segments:
7
7
  - 1
8
8
  - 1
9
- - 0
10
- version: 1.1.0
9
+ - 1
10
+ version: 1.1.1
11
11
  platform: ruby
12
12
  authors:
13
13
  - "Marcin Urba\xC5\x84ski"
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-09-30 00:00:00 +02:00
18
+ date: 2011-10-09 00:00:00 +02:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -23,14 +23,14 @@ dependencies:
23
23
  requirement: &id001 !ruby/object:Gem::Requirement
24
24
  none: false
25
25
  requirements:
26
- - - ~>
26
+ - - "="
27
27
  - !ruby/object:Gem::Version
28
- hash: 19
28
+ hash: 61
29
29
  segments:
30
30
  - 0
31
- - 7
32
31
  - 8
33
- version: 0.7.8
32
+ - 1
33
+ version: 0.8.1
34
34
  name: httparty
35
35
  version_requirements: *id001
36
36
  prerelease: false
@@ -57,29 +57,29 @@ dependencies:
57
57
  requirements:
58
58
  - - ">="
59
59
  - !ruby/object:Gem::Version
60
- hash: 15424103
60
+ hash: 3
61
61
  segments:
62
62
  - 3
63
63
  - 1
64
64
  - 0
65
- - rc
66
- - 1
67
- version: 3.1.0.rc1
65
+ version: 3.1.0
68
66
  name: activesupport
69
67
  version_requirements: *id003
70
68
  prerelease: false
71
69
  - !ruby/object:Gem::Dependency
72
- type: :development
70
+ type: :runtime
73
71
  requirement: &id004 !ruby/object:Gem::Requirement
74
72
  none: false
75
73
  requirements:
76
74
  - - ">="
77
75
  - !ruby/object:Gem::Version
78
- hash: 3
76
+ hash: 29
79
77
  segments:
80
78
  - 0
81
- version: "0"
82
- name: pry
79
+ - 1
80
+ - 3
81
+ version: 0.1.3
82
+ name: elibri_onix
83
83
  version_requirements: *id004
84
84
  prerelease: false
85
85
  - !ruby/object:Gem::Dependency
@@ -93,7 +93,7 @@ dependencies:
93
93
  segments:
94
94
  - 0
95
95
  version: "0"
96
- name: mocha
96
+ name: pry
97
97
  version_requirements: *id005
98
98
  prerelease: false
99
99
  - !ruby/object:Gem::Dependency
@@ -107,12 +107,26 @@ dependencies:
107
107
  segments:
108
108
  - 0
109
109
  version: "0"
110
- name: minitest
110
+ name: mocha
111
111
  version_requirements: *id006
112
112
  prerelease: false
113
113
  - !ruby/object:Gem::Dependency
114
114
  type: :development
115
115
  requirement: &id007 !ruby/object:Gem::Requirement
116
+ none: false
117
+ requirements:
118
+ - - ">="
119
+ - !ruby/object:Gem::Version
120
+ hash: 3
121
+ segments:
122
+ - 0
123
+ version: "0"
124
+ name: minitest
125
+ version_requirements: *id007
126
+ prerelease: false
127
+ - !ruby/object:Gem::Dependency
128
+ type: :development
129
+ requirement: &id008 !ruby/object:Gem::Requirement
116
130
  none: false
117
131
  requirements:
118
132
  - - ~>
@@ -124,11 +138,11 @@ dependencies:
124
138
  - 0
125
139
  version: 1.0.0
126
140
  name: bundler
127
- version_requirements: *id007
141
+ version_requirements: *id008
128
142
  prerelease: false
129
143
  - !ruby/object:Gem::Dependency
130
144
  type: :development
131
- requirement: &id008 !ruby/object:Gem::Requirement
145
+ requirement: &id009 !ruby/object:Gem::Requirement
132
146
  none: false
133
147
  requirements:
134
148
  - - ~>
@@ -140,11 +154,11 @@ dependencies:
140
154
  - 2
141
155
  version: 1.6.2
142
156
  name: jeweler
143
- version_requirements: *id008
157
+ version_requirements: *id009
144
158
  prerelease: false
145
159
  - !ruby/object:Gem::Dependency
146
160
  type: :development
147
- requirement: &id009 !ruby/object:Gem::Requirement
161
+ requirement: &id010 !ruby/object:Gem::Requirement
148
162
  none: false
149
163
  requirements:
150
164
  - - ">="
@@ -154,7 +168,7 @@ dependencies:
154
168
  - 0
155
169
  version: "0"
156
170
  name: rcov
157
- version_requirements: *id009
171
+ version_requirements: *id010
158
172
  prerelease: false
159
173
  description: API client for elibri.com.pl publishing system
160
174
  email: marcin@urbanski.vdl.pl