sendregning 0.1.3 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1c1f7147849c41ef8793153b66a1f58da22c94f1
4
- data.tar.gz: d57d452f433f69185e4358b7b2b37919b51e60ba
3
+ metadata.gz: ac9aebbc32da82e3b79fe52e4383f3e86502bf66
4
+ data.tar.gz: c481e3697c7d335562b515f938e09bb264216ef1
5
5
  SHA512:
6
- metadata.gz: 60e9a23fa2e5494d5238938aa0e631e19729a74cedfbbbb2aa865ae8f12f98a8a6bac61ec1b9540db764c68aa122c2f29d8cd79ac69f87a11e852793c6caa26e
7
- data.tar.gz: b21f77225dd948ad1514af54317e737586a2c420e6a49682f196fc4015c1c72cc321984f7beb8e39f61bb1feb34acdd79f14e3634cfb08aa0bdb17999b34321c
6
+ metadata.gz: 1bb8c3a1194f57636a9f6c4d075c065db6c886d4bef8567e7d11fc4167c4e0e3381f1e39d552fa7f811143fad7a8f122e71efefacf85c591f4b7ad4925be80aa
7
+ data.tar.gz: 608b5eb4805de3d086083891abaed6b2aeb8b4014ad9e0e1671ad849e8615244e0675d6ee993281074ab253efa652c2db11f7f33b49daffd0b412a582079c355
@@ -1,13 +1,17 @@
1
1
  require 'rubygems'
2
2
  require 'builder'
3
- require 'net/http/post/multipart'
4
3
  require 'httparty'
4
+ require 'httmultiparty'
5
5
 
6
6
  dir = Pathname(__FILE__).dirname.expand_path
7
7
 
8
+ require dir + 'sendregning/xml_serializer'
8
9
  require dir + 'sendregning/client'
9
10
  require dir + 'sendregning/invoice'
11
+ require dir + 'sendregning/invoice_parser'
12
+ require dir + 'sendregning/invoice_serializer'
10
13
  require dir + 'sendregning/line'
14
+ require dir + 'sendregning/line_serializer'
11
15
  require dir + 'sendregning/version'
12
16
 
13
17
  module Sendregning
@@ -7,9 +7,9 @@ module Sendregning
7
7
  # Usage example:
8
8
  #
9
9
  # client = SendRegning::Client.new(my_username, my_password)
10
-
10
+
11
11
  class Client
12
- include HTTParty
12
+ include HTTMultiParty
13
13
 
14
14
  base_uri 'https://www.sendregning.no'
15
15
  format :xml
@@ -18,101 +18,62 @@ module Sendregning
18
18
  @auth = {:username => username, :password => password}
19
19
  @test = true if options[:test]
20
20
  end
21
-
22
- public
23
21
 
24
- # Performs a GET request
25
- def get(query={})
26
- self.class.get('/ws/butler.do', query_options(query))
27
- end
22
+ # Performs a GET request
23
+ def get(query={})
24
+ self.class.get('/ws/butler.do', query_options(query))
25
+ end
28
26
 
29
- # Performs a POST request
30
- def post(query=nil)
31
- self.class.post('/ws/butler.do', query_options(query))
32
- end
33
-
34
- # Performs a POST request with an XML payload
35
- def post_xml(xml, body={})
36
- # Prepare the request
37
- url = URI.parse("#{self.class.base_uri}/ws/butler.do")
38
- body[:xml] = UploadIO.new(StringIO.new(xml), 'text/xml', 'request.xml')
39
- body[:test] = true if @test
40
- request = Net::HTTP::Post::Multipart.new(url.path, body)
41
- request.basic_auth @auth[:username], @auth[:password]
42
-
43
- # Perform request
44
- http = Net::HTTP.new(url.host, url.port)
45
- http.use_ssl = true
46
- http.verify_mode = OpenSSL::SSL::VERIFY_NONE
47
- res = http.start{|http| http.request(request)}
27
+ # Performs a POST request
28
+ def post(query=nil)
29
+ self.class.post('/ws/butler.do', query_options(query))
30
+ end
48
31
 
49
- # Parse the response
50
- response = Response.new(res, self.class.parser.call(res.body, :xml))
51
- end
52
-
53
- # Returns a list of recipients
54
- def recipients
55
- response = get(:action => 'select', :type => 'recipient')
56
- response['recipients']['recipient']
57
- end
58
-
59
- # Instances a new invoice
60
- def new_invoice(attributes={})
61
- Sendregning::Invoice.new(attributes.merge({:client => self}))
62
- end
63
-
64
- # Sends an invoice
65
- def send_invoice(invoice)
66
- response = post_xml(invoice.to_xml, {:action => 'send', :type => 'invoice'})
67
- parse_invoice(response['invoices']['invoice'], invoice)
68
- end
69
-
70
- # Finds an invoice by invoice number
71
- def find_invoice(invoice_id)
72
- builder = Builder::XmlMarkup.new(:indent=>2)
73
- builder.instruct! :xml, :version=>"1.0", :encoding=>"UTF-8"
74
- request_xml = builder.select do |select|
75
- select.invoiceNumbers do |numbers|
76
- numbers.invoiceNumber invoice_id
77
- end
78
- end
79
- response = post_xml(request_xml, {:action => 'select', :type => 'invoice'})
80
- parse_invoice(response['invoices']['invoice']) rescue nil
81
- end
82
-
32
+ def post_xml(xml, query={})
33
+ query[:xml] = xml_file(xml)
34
+ self.class.post('/ws/butler.do', query_options(query).merge(detect_mime_type: true))
35
+ end
83
36
 
84
- protected
37
+ # Returns a list of recipients
38
+ def recipients
39
+ response = get(:action => 'select', :type => 'recipient')
40
+ response['recipients']['recipient']
41
+ end
85
42
 
86
- def flatten_xml_hash(hash)
87
- new_hash = {}
88
- hash.each do |key, value|
89
- new_hash[key] = "#{value}"
90
- end
91
- new_hash
92
- end
43
+ # Instances a new invoice
44
+ def new_invoice(attributes={})
45
+ Sendregning::Invoice.new(attributes.merge({:client => self}))
46
+ end
93
47
 
94
- def parse_invoice(response, invoice=Sendregning::Invoice.new)
95
- attributes = response.dup
96
- if attributes['optional']
97
- attributes = attributes.merge(attributes['optional'])
98
- attributes.delete('optional')
99
- end
100
- if attributes['shipment']
101
- attributes = attributes.merge(attributes['shipment'])
102
- attributes.delete('shipment')
103
- end
104
- lines = attributes['lines']['line']; attributes.delete('lines')
48
+ # Sends an invoice
49
+ def send_invoice(invoice)
50
+ response = post_xml(invoice.to_xml, {:action => 'send', :type => 'invoice'})
51
+ InvoiceParser.parse(response, invoice)
52
+ end
105
53
 
106
- invoice.update(flatten_xml_hash(attributes))
107
- invoice.lines = lines.map{|l| Sendregning::Line.new(flatten_xml_hash(l))}
108
- invoice
54
+ # Finds an invoice by invoice number
55
+ def find_invoice(invoice_id)
56
+ builder = Builder::XmlMarkup.new(:indent=>2)
57
+ builder.instruct! :xml, :version=>"1.0", :encoding=>"UTF-8"
58
+ request_xml = builder.select do |select|
59
+ select.invoiceNumbers do |numbers|
60
+ numbers.invoiceNumber invoice_id
61
+ end
109
62
  end
63
+ response = post_xml(request_xml, {:action => 'select', :type => 'invoice'})
64
+ InvoiceParser.parse(response) rescue nil
65
+ end
110
66
 
111
- # Prepares options for a request
112
- def query_options(query={})
113
- query[:test] = 'true' if @test
114
- {:basic_auth => @auth, :query => query}
115
- end
67
+ protected
116
68
 
69
+ # Prepares options for a request
70
+ def query_options(query={})
71
+ query[:test] = 'true' if @test
72
+ {:basic_auth => @auth, :query => query}
73
+ end
74
+
75
+ def xml_file(xml)
76
+ UploadIO.new(StringIO.new(xml), 'text/xml', 'request.xml')
77
+ end
117
78
  end
118
79
  end
@@ -1,7 +1,6 @@
1
1
  module Sendregning
2
2
 
3
3
  class Invoice
4
-
5
4
  OPTIONAL_ATTRIBUTES = [
6
5
  # Request
7
6
  :invoiceType, :creditedId, :orderNo, :invoiceDate, :orderNo,
@@ -16,7 +15,7 @@ module Sendregning
16
15
  SHIPMENT_ATTRIBUTES = [
17
16
  :shipment, :emailaddresses, :copyaddresses
18
17
  ]
19
-
18
+
20
19
  SHIPMENT_MODES = {
21
20
  :paper => 'PAPER',
22
21
  :email => 'EMAIL',
@@ -32,7 +31,7 @@ module Sendregning
32
31
  self.update(attributes)
33
32
  @lines = []
34
33
  end
35
-
34
+
36
35
  def update(attributes={})
37
36
  @client = attributes[:client] if attributes[:client]
38
37
  @name = attributes[:name] if attributes[:name]
@@ -47,101 +46,59 @@ module Sendregning
47
46
  @lines << line
48
47
  line
49
48
  end
50
-
49
+
51
50
  # Sends an invoice
52
51
  def send!
53
52
  self.client.send_invoice(self)
54
53
  end
55
-
54
+
56
55
  def paid?
57
56
  state == 'paid'
58
57
  end
59
58
 
59
+ def shipment_mode
60
+ mode = (@shipment[:shipment] || :paper).to_sym
61
+ raise 'Invalid shipment mode!' unless SHIPMENT_MODES.keys.include?(mode)
62
+ SHIPMENT_MODES[mode]
63
+ end
64
+
60
65
  # Renders invoice to XML
61
66
  def to_xml(options={})
62
- if options[:builder]
63
- xml = options[:builder]
64
- else
65
- xml = Builder::XmlMarkup.new(:indent=>2)
66
- xml.instruct! :xml, :version=>"1.0", :encoding=>"UTF-8"
67
- end
68
- xml.invoices do |invoices|
69
- invoices.invoice do |invoice|
70
- invoice.name @name
71
- invoice.zip @zip
72
- invoice.city @city
73
-
74
- # Lines
75
- if @lines.length > 0
76
- invoice.lines do |line_builder|
77
- @lines.each{|l| l.to_xml(:builder => line_builder)}
78
- end
79
- end
80
-
81
- # Optional attributes
82
- if @optional.length > 0
83
- invoice.optional do |optional|
84
- @optional.each do |key, value|
85
- key = key.to_sym
86
- if value.kind_of?(Date) || value.kind_of?(Time)
87
- value = value.strftime("%d.%m.%y")
88
- end
89
- optional.tag! key, value
90
- end
91
- end
92
- end
93
-
94
- # Shipment attributes
95
- if @shipment.length > 0
96
- invoice.shipment do |shipment|
97
- shipment_mode = (@shipment[:shipment] || :paper).to_sym
98
- raise 'Invalid shipment mode!' unless SHIPMENT_MODES.keys.include?(shipment_mode)
99
- shipment_mode = SHIPMENT_MODES[shipment_mode]
100
-
101
- shipment.text! shipment_mode
102
- @shipment.each do |key, values|
103
- key = key.to_sym
104
- unless key == :shipment
105
- values = [values] unless values.kind_of?(Enumerable)
106
- shipment.tag! key do |emails|
107
- values.each{|v| emails.email v}
108
- end
109
- end
110
- end
111
- end
112
- end
113
- end
114
- end
67
+ InvoiceSerializer.build(self, options)
115
68
  end
116
69
 
117
70
  protected
118
-
119
- def optional=(attributes)
120
- @optional ||= {}
121
- attributes.each do |key, value|
122
- @optional[key.to_sym] = value if OPTIONAL_ATTRIBUTES.include?(key.to_sym)
123
- end
124
- @optional
71
+
72
+ def optional=(attributes)
73
+ @optional ||= {}
74
+ attributes.each do |key, value|
75
+ @optional[key.to_sym] = value if OPTIONAL_ATTRIBUTES.include?(key.to_sym)
125
76
  end
126
-
127
- def shipment=(attributes)
128
- @shipment ||= {}
129
- attributes.each do |key, value|
130
- @shipment[key.to_sym] = value if SHIPMENT_ATTRIBUTES.include?(key.to_sym)
131
- end
132
- @shipment
77
+ @optional
78
+ end
79
+
80
+ def shipment=(attributes)
81
+ @shipment ||= {}
82
+ attributes.each do |key, value|
83
+ @shipment[key.to_sym] = value if SHIPMENT_ATTRIBUTES.include?(key.to_sym)
133
84
  end
134
-
135
- def method_missing(method, *args)
136
- if OPTIONAL_ATTRIBUTES.include?(method)
137
- @optional[method]
138
- elsif SHIPPING_ATTRIBUTES.include?(method)
139
- @shipping[method]
140
- else
141
- super
142
- end
85
+ @shipment
86
+ end
87
+
88
+ def method_missing(method, *args)
89
+ if OPTIONAL_ATTRIBUTES.include?(method)
90
+ @optional[method]
91
+ elsif SHIPMENT_ATTRIBUTES.include?(method)
92
+ @shipping[method]
93
+ else
94
+ super
143
95
  end
144
-
145
- end
96
+ end
146
97
 
98
+ def xml_builder
99
+ xml = Builder::XmlMarkup.new(:indent=>2)
100
+ xml.instruct! :xml, :version=>"1.0", :encoding=>"UTF-8"
101
+ xml
102
+ end
103
+ end
147
104
  end
@@ -0,0 +1,43 @@
1
+ module Sendregning
2
+ class InvoiceParser
3
+ class << self
4
+ def parse(response, invoice=Sendregning::Invoice.new)
5
+ self.new(response, invoice).parse
6
+ end
7
+ end
8
+
9
+ def initialize(response, invoice)
10
+ @response = response
11
+ @invoice = invoice
12
+ end
13
+
14
+ def parse
15
+ attributes = @response['invoices']['invoice']
16
+
17
+ # Flatten optional and shipment attributes
18
+ %w{optional shipment}.each do |section|
19
+ if attributes.has_key?(section)
20
+ attributes = attributes.merge(attributes[section])
21
+ attributes.delete(section)
22
+ end
23
+ end
24
+
25
+ lines = attributes['lines']['line']
26
+ attributes.delete('lines')
27
+
28
+ @invoice.update(stringify_hash(attributes))
29
+ @invoice.lines = lines.map {|l| Sendregning::Line.new(stringify_hash(l)) }
30
+ @invoice
31
+ end
32
+
33
+ protected
34
+
35
+ def stringify_hash(hash)
36
+ new_hash = {}
37
+ hash.each do |key, value|
38
+ new_hash[key] = "#{value}"
39
+ end
40
+ new_hash
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,57 @@
1
+ module Sendregning
2
+ class InvoiceSerializer < Sendregning::XmlSerializer
3
+ def build
4
+ builder.invoices do |invoices|
5
+ invoices.invoice do |invoice|
6
+ invoice.name item.name
7
+ invoice.zip item.zip
8
+ invoice.city item.city
9
+
10
+ lines(invoice)
11
+ optional_attributes(invoice)
12
+ shipment_attributes(invoice)
13
+ end
14
+ end
15
+ end
16
+
17
+ protected
18
+
19
+ def lines(invoice)
20
+ if item.lines.any?
21
+ invoice.lines do |line_builder|
22
+ item.lines.each { |l| l.to_xml(builder: line_builder) }
23
+ end
24
+ end
25
+ end
26
+
27
+ def optional_attributes(invoice)
28
+ if item.optional.any?
29
+ invoice.optional do |optional|
30
+ item.optional.each do |key, value|
31
+ key = key.to_sym
32
+ if value.kind_of?(Date) || value.kind_of?(Time)
33
+ value = value.strftime("%d.%m.%y")
34
+ end
35
+ optional.tag! key, value
36
+ end
37
+ end
38
+ end
39
+ end
40
+
41
+ def shipment_attributes(invoice)
42
+ if item.shipment.any?
43
+ invoice.shipment do |shipment|
44
+ shipment.text! item.shipment_mode
45
+ item.shipment.each do |key, values|
46
+ key = key.to_sym
47
+ unless key == :shipment
48
+ shipment.tag! key do |emails|
49
+ Array(values).each { |v| emails.email v }
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
@@ -1,59 +1,42 @@
1
1
  module Sendregning
2
-
3
2
  class Line
4
-
5
3
  # Quantity, as decimal. Example: '7,5'
6
4
  attr_accessor :qty
7
-
5
+
8
6
  # Product code. String, max length: 9
9
7
  attr_accessor :prodCode
10
-
8
+
11
9
  # Description. String, max length: 75
12
10
  attr_accessor :desc
13
-
11
+
14
12
  # Price per unit in decimal. Example: '250,00'
15
13
  attr_accessor :unitPrice
16
-
14
+
17
15
  # Discount in percentage as decimal. Optional, defaults to 0
18
16
  attr_accessor :discount
19
17
 
20
18
  # Tax rate. Valid rates are: '0', '8', '13' and '25'. Default: '25'
21
19
  attr_accessor :tax
22
-
20
+
23
21
  attr_accessor :itemNo, :lineTaxAmount, :lineTotal
24
22
 
25
23
  def initialize(new_attributes={})
26
24
  self.attributes = new_attributes
27
25
  end
28
-
26
+
29
27
  # Renders line to XML
30
28
  def to_xml(options={})
31
- if options[:builder]
32
- xml = options[:builder]
33
- else
34
- xml = Builder::XmlMarkup.new(:indent=>2)
35
- xml.instruct! :xml, :version=>"1.0", :encoding=>"UTF-8"
36
- end
37
- xml.line do |line|
38
- line.qty self.qty if @qty
39
- line.prodCode self.prodCode if @prodCode
40
- line.desc self.desc if @desc
41
- line.unitPrice self.unitPrice if @unitPrice
42
- line.discount self.discount if @discount
43
- line.tax self.tax if @tax
44
- end
29
+ LineSerializer.build(self, options)
45
30
  end
46
31
 
47
32
  protected
48
33
 
49
- def attributes=(attributes={})
50
- attributes.each do |key, value|
51
- set_method = "#{key.to_s}=".to_sym
52
- self.send(set_method, value) if self.respond_to?(set_method)
53
- end
54
- attributes
34
+ def attributes=(attributes={})
35
+ attributes.each do |key, value|
36
+ set_method = "#{key.to_s}=".to_sym
37
+ self.send(set_method, value) if self.respond_to?(set_method)
55
38
  end
56
-
39
+ attributes
40
+ end
57
41
  end
58
-
59
42
  end
@@ -0,0 +1,14 @@
1
+ module Sendregning
2
+ class LineSerializer < Sendregning::XmlSerializer
3
+ def build
4
+ builder.line do |line|
5
+ line.qty item.qty if item.qty
6
+ line.prodCode item.prodCode if item.prodCode
7
+ line.desc item.desc if item.desc
8
+ line.unitPrice item.unitPrice if item.unitPrice
9
+ line.discount item.discount if item.discount
10
+ line.tax item.tax if item.tax
11
+ end
12
+ end
13
+ end
14
+ end
@@ -1,5 +1,5 @@
1
1
  module Sendregning
2
2
  unless Sendregning.const_defined?('VERSION')
3
- VERSION = "0.1.3"
3
+ VERSION = "0.2.0"
4
4
  end
5
5
  end
@@ -0,0 +1,37 @@
1
+ module Sendregning
2
+ class XmlSerializer
3
+ class << self
4
+ def build(item, options={})
5
+ builder = options[:builder] || xml_builder
6
+ self.new(item, builder).build
7
+ end
8
+
9
+ protected
10
+
11
+ def xml_builder
12
+ xml = Builder::XmlMarkup.new(indent: 2)
13
+ xml.instruct! :xml, version: "1.0", encoding: "UTF-8"
14
+ xml
15
+ end
16
+ end
17
+
18
+ def initialize(item, builder)
19
+ @item = item
20
+ @builder = builder
21
+ end
22
+
23
+ def build
24
+ raise "XmlSerializer is an abstract class, subclass and overwrite the build method"
25
+ end
26
+
27
+ protected
28
+
29
+ def builder
30
+ @builder
31
+ end
32
+
33
+ def item
34
+ @item
35
+ end
36
+ end
37
+ end
@@ -13,14 +13,14 @@ Gem::Specification.new do |s|
13
13
  s.email = 'inge@manualdesign.no'
14
14
  s.homepage = 'http://github.com/elektronaut/sendregning'
15
15
  s.license = 'MIT'
16
- s.required_ruby_version = Gem::Requirement.new(">= 1.8.7")
16
+ s.required_ruby_version = Gem::Requirement.new(">= 1.9.3")
17
17
 
18
18
  s.files = `git ls-files`.split("\n")
19
19
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
20
20
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
21
21
  s.require_paths = ["lib"]
22
22
 
23
- s.add_runtime_dependency 'httparty', '0.6.1'
24
- s.add_runtime_dependency 'builder', '~> 2.1'
25
- s.add_runtime_dependency 'multipart-post', '~> 1.0'
23
+ s.add_runtime_dependency 'httparty', '~> 0.13.0'
24
+ s.add_runtime_dependency 'builder', '~> 3.1'
25
+ s.add_runtime_dependency 'httmultiparty', '~> 0.3'
26
26
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sendregning
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Inge Jørgensen
@@ -14,44 +14,44 @@ dependencies:
14
14
  name: httparty
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - '='
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 0.6.1
19
+ version: 0.13.0
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - '='
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 0.6.1
26
+ version: 0.13.0
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: builder
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '2.1'
33
+ version: '3.1'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '2.1'
40
+ version: '3.1'
41
41
  - !ruby/object:Gem::Dependency
42
- name: multipart-post
42
+ name: httmultiparty
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '1.0'
47
+ version: '0.3'
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '1.0'
54
+ version: '0.3'
55
55
  description: Ruby client for the SendRegning Web Service
56
56
  email: inge@manualdesign.no
57
57
  executables: []
@@ -64,8 +64,12 @@ files:
64
64
  - lib/sendregning.rb
65
65
  - lib/sendregning/client.rb
66
66
  - lib/sendregning/invoice.rb
67
+ - lib/sendregning/invoice_parser.rb
68
+ - lib/sendregning/invoice_serializer.rb
67
69
  - lib/sendregning/line.rb
70
+ - lib/sendregning/line_serializer.rb
68
71
  - lib/sendregning/version.rb
72
+ - lib/sendregning/xml_serializer.rb
69
73
  - sendregning.gemspec
70
74
  homepage: http://github.com/elektronaut/sendregning
71
75
  licenses:
@@ -79,7 +83,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
79
83
  requirements:
80
84
  - - ">="
81
85
  - !ruby/object:Gem::Version
82
- version: 1.8.7
86
+ version: 1.9.3
83
87
  required_rubygems_version: !ruby/object:Gem::Requirement
84
88
  requirements:
85
89
  - - ">="