blinksale 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile CHANGED
@@ -2,13 +2,15 @@ source "http://rubygems.org"
2
2
  # Add dependencies required to use your gem here.
3
3
  # Example:
4
4
  # gem "activesupport", ">= 2.3.5"
5
- gem "rest-client"
6
- gem "nokogiri"
5
+ gem "rest-client", "~> 1.6.3"
6
+ gem "nokogiri", "~> 1.4.6"
7
7
 
8
8
  # Add dependencies to develop your gem here.
9
9
  # Include everything needed to run rake, tests, features, etc.
10
10
  group :development do
11
11
  gem "rspec", "~> 2.3.0"
12
+ gem "mocha", "~> 0.9.12"
12
13
  gem "bundler", "~> 1.0.0"
13
14
  gem "jeweler", "~> 1.6.2"
15
+ gem "simplecov", "~> 0.4.2"
14
16
  end
@@ -8,7 +8,8 @@ GEM
8
8
  git (>= 1.2.5)
9
9
  rake
10
10
  mime-types (1.16)
11
- nokogiri (1.4.4)
11
+ mocha (0.9.12)
12
+ nokogiri (1.4.6)
12
13
  rake (0.9.2)
13
14
  rest-client (1.6.3)
14
15
  mime-types (>= 1.16)
@@ -20,6 +21,9 @@ GEM
20
21
  rspec-expectations (2.3.0)
21
22
  diff-lcs (~> 1.1.2)
22
23
  rspec-mocks (2.3.0)
24
+ simplecov (0.4.2)
25
+ simplecov-html (~> 0.4.4)
26
+ simplecov-html (0.4.4)
23
27
 
24
28
  PLATFORMS
25
29
  ruby
@@ -27,6 +31,8 @@ PLATFORMS
27
31
  DEPENDENCIES
28
32
  bundler (~> 1.0.0)
29
33
  jeweler (~> 1.6.2)
30
- nokogiri
31
- rest-client
34
+ mocha (~> 0.9.12)
35
+ nokogiri (~> 1.4.6)
36
+ rest-client (~> 1.6.3)
32
37
  rspec (~> 2.3.0)
38
+ simplecov (~> 0.4.2)
data/Rakefile CHANGED
@@ -38,8 +38,8 @@ end
38
38
 
39
39
  task :default => :spec
40
40
 
41
- require 'rake/rdoctask'
42
- Rake::RDocTask.new do |rdoc|
41
+ require 'rdoc/task'
42
+ RDoc::Task.new do |rdoc|
43
43
  version = File.exist?('VERSION') ? File.read('VERSION') : ""
44
44
 
45
45
  rdoc.rdoc_dir = 'rdoc'
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.0
1
+ 0.2.0
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{blinksale}
8
- s.version = "0.1.0"
8
+ s.version = "0.2.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Tomasz Werbicki"]
12
- s.date = %q{2011-06-27}
12
+ s.date = %q{2011-06-28}
13
13
  s.description = %q{Basic Blinksale invoice fetcher.}
14
14
  s.email = %q{tomasz@werbicki.net}
15
15
  s.extra_rdoc_files = [
@@ -27,7 +27,14 @@ Gem::Specification.new do |s|
27
27
  "VERSION",
28
28
  "blinksale.gemspec",
29
29
  "lib/blinksale.rb",
30
- "lib/invoices.rb"
30
+ "lib/clients.rb",
31
+ "lib/invoices.rb",
32
+ "spec/blinksale_spec.rb",
33
+ "spec/fixtures/invoice_collection.xml",
34
+ "spec/fixtures/invoice_single.xml",
35
+ "spec/invoice_spec.rb",
36
+ "spec/invoices_spec.rb",
37
+ "spec/spec_helper.rb"
31
38
  ]
32
39
  s.homepage = %q{http://github.com/neaf/blinksale}
33
40
  s.licenses = ["MIT"]
@@ -40,24 +47,30 @@ Gem::Specification.new do |s|
40
47
  s.specification_version = 3
41
48
 
42
49
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
43
- s.add_runtime_dependency(%q<rest-client>, [">= 0"])
44
- s.add_runtime_dependency(%q<nokogiri>, [">= 0"])
50
+ s.add_runtime_dependency(%q<rest-client>, ["~> 1.6.3"])
51
+ s.add_runtime_dependency(%q<nokogiri>, ["~> 1.4.6"])
45
52
  s.add_development_dependency(%q<rspec>, ["~> 2.3.0"])
53
+ s.add_development_dependency(%q<mocha>, ["~> 0.9.12"])
46
54
  s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
47
55
  s.add_development_dependency(%q<jeweler>, ["~> 1.6.2"])
56
+ s.add_development_dependency(%q<simplecov>, ["~> 0.4.2"])
48
57
  else
49
- s.add_dependency(%q<rest-client>, [">= 0"])
50
- s.add_dependency(%q<nokogiri>, [">= 0"])
58
+ s.add_dependency(%q<rest-client>, ["~> 1.6.3"])
59
+ s.add_dependency(%q<nokogiri>, ["~> 1.4.6"])
51
60
  s.add_dependency(%q<rspec>, ["~> 2.3.0"])
61
+ s.add_dependency(%q<mocha>, ["~> 0.9.12"])
52
62
  s.add_dependency(%q<bundler>, ["~> 1.0.0"])
53
63
  s.add_dependency(%q<jeweler>, ["~> 1.6.2"])
64
+ s.add_dependency(%q<simplecov>, ["~> 0.4.2"])
54
65
  end
55
66
  else
56
- s.add_dependency(%q<rest-client>, [">= 0"])
57
- s.add_dependency(%q<nokogiri>, [">= 0"])
67
+ s.add_dependency(%q<rest-client>, ["~> 1.6.3"])
68
+ s.add_dependency(%q<nokogiri>, ["~> 1.4.6"])
58
69
  s.add_dependency(%q<rspec>, ["~> 2.3.0"])
70
+ s.add_dependency(%q<mocha>, ["~> 0.9.12"])
59
71
  s.add_dependency(%q<bundler>, ["~> 1.0.0"])
60
72
  s.add_dependency(%q<jeweler>, ["~> 1.6.2"])
73
+ s.add_dependency(%q<simplecov>, ["~> 0.4.2"])
61
74
  end
62
75
  end
63
76
 
@@ -1,25 +1,27 @@
1
1
  require 'rest-client'
2
2
  require 'invoices'
3
+ require 'clients'
3
4
 
4
5
  module Blinksale
5
- class Client
6
+ class Service
6
7
  attr_reader :subdomain, :username, :password, :rest_resource
8
+ attr_reader :invoices, :clients
7
9
 
8
10
  def initialize(subdomain, username, password)
9
11
  @subdomain = subdomain
10
12
  @username = username
11
13
  @password = password
14
+
12
15
  @rest_resource = RestClient::Resource.new(base_url,
13
- username,
14
- password)
16
+ :user => username,
17
+ :password => password)
18
+
19
+ @invoices = Blinksale::Invoices.new(self)
20
+ @clients = Blinksale::Clients.new(self)
15
21
  end
16
22
 
17
23
  def base_url
18
24
  "https://#{ subdomain }.blinksale.com"
19
25
  end
20
-
21
- def invoices
22
- @invoices ||= Blinksale::Invoices.new(self)
23
- end
24
26
  end
25
27
  end
@@ -0,0 +1,57 @@
1
+ require "nokogiri"
2
+
3
+ module Blinksale
4
+ class Client
5
+ attr_accessor :name, :address1, :address2, :city, :state, :zip_code, :country, :phone
6
+
7
+ def self.from_node(node)
8
+ self.new.tap do |i|
9
+ i.id = node.attributes["uri"].content[/\d+$/].to_i
10
+ i.name = node.xpath('xmlns:name').first.content
11
+ i.address1 = node.xpath("xmlns:address1").first.content.to_f
12
+ i.address2 = node.xpath("xmlns:address2").first.content.to_f
13
+ i.city = node.xpath("xmlns:city").first.content.to_f
14
+ i.state = node.xpath("xmlns:state").first.content.to_f
15
+ i.zip_code = node.xpath("xmlns:zip").first.content.to_f
16
+ i.country = node.xpath("xmlns:country").first.content.to_f
17
+ i.phone = node.xpath("xmlns:phone").first.content.to_f
18
+ end
19
+ end
20
+ end
21
+
22
+ class Clients
23
+ attr_reader :service
24
+
25
+ def initialize(service)
26
+ @service = service
27
+ end
28
+
29
+ def all(params = {})
30
+ headers = {
31
+ :content_type => "application/vnd.blinksale+xml",
32
+ :accept => "application/vnd.blinksale+xml"
33
+ }
34
+ xml = service.rest_resource["clients"].get(
35
+ :params => params,
36
+ :headers => headers
37
+ )
38
+ doc = Nokogiri::XML(xml)
39
+ doc.xpath('//xmlns:client').map do |node|
40
+ Client.from_node(node)
41
+ end
42
+ end
43
+
44
+ def get(id, params = {})
45
+ headers = {
46
+ :content_type => "application/vnd.blinksale+xml",
47
+ :accept => "application/vnd.blinksale+xml"
48
+ }
49
+ xml = service.rest_resource["clients/#{ id }"].get(
50
+ :params => params,
51
+ :headers => headers
52
+ )
53
+ doc = Nokogiri::XML(xml)
54
+ Invoice.from_node(doc.xpath('//xmlns:client').first)
55
+ end
56
+ end
57
+ end
@@ -18,10 +18,10 @@ module Blinksale
18
18
  end
19
19
 
20
20
  class Invoices
21
- attr_reader :client
21
+ attr_reader :service
22
22
 
23
- def initialize(client)
24
- @client = client
23
+ def initialize(service)
24
+ @service = service
25
25
  end
26
26
 
27
27
  def all(params = {})
@@ -29,7 +29,7 @@ module Blinksale
29
29
  :content_type => "application/vnd.blinksale+xml",
30
30
  :accept => "application/vnd.blinksale+xml"
31
31
  }
32
- xml = client.rest_resource["invoices"].get(
32
+ xml = service.rest_resource["invoices"].get(
33
33
  :params => params,
34
34
  :headers => headers
35
35
  )
@@ -44,7 +44,7 @@ module Blinksale
44
44
  :content_type => "application/vnd.blinksale+xml",
45
45
  :accept => "application/vnd.blinksale+xml"
46
46
  }
47
- xml = client.rest_resource["invoices/#{ id }"].get(
47
+ xml = service.rest_resource["invoices/#{ id }"].get(
48
48
  :params => params,
49
49
  :headers => headers
50
50
  )
@@ -0,0 +1,49 @@
1
+ require File.expand_path(File.dirname(__FILE__) + "/spec_helper")
2
+
3
+ describe Blinksale::Service do
4
+ let(:service) do
5
+ Blinksale::Service.new("test-host", "test-username", "test-password")
6
+ end
7
+
8
+ describe "#base_url" do
9
+ it "returns full url for given subdomain" do
10
+ service.base_url.should eql("https://test-host.blinksale.com")
11
+ end
12
+ end
13
+
14
+ describe "#rest_resource" do
15
+ it "returns instantiated RestClient resource" do
16
+ service.rest_resource.should be_an_instance_of(RestClient::Resource)
17
+ end
18
+
19
+ describe "resource" do
20
+ let(:resource) { service.rest_resource }
21
+
22
+ it "has proper credentials set" do
23
+ resource.url.should eql(service.base_url)
24
+ resource.options[:user].should eql("test-username")
25
+ resource.options[:password].should eql("test-password")
26
+ end
27
+ end
28
+ end
29
+
30
+ describe "#invoices" do
31
+ it "returns Invoices instance" do
32
+ service.invoices.should be_an_instance_of(Blinksale::Invoices)
33
+ end
34
+
35
+ describe "Invoices instance" do
36
+ let(:invoices) { service.invoices }
37
+
38
+ it "has proper service set" do
39
+ invoices.service.should eql(service)
40
+ end
41
+ end
42
+ end
43
+
44
+ describe "#clients" do
45
+ it "returns Clients instance" do
46
+ service.clients.should be_an_instance_of(Blinksale::Clients)
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,23 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <invoices xmlns="http://www.blinksale.com/api">
3
+ <invoice status="open" uri="http://example.blinksale.com/invoices/1" total="20.00" total_due="10.00">
4
+ <client name="Acme">http://example.blinksale.com/clients/1</client>
5
+
6
+ <number>100001</number>
7
+ <date>2006-09-19</date>
8
+ <terms due_date="2006-10-04">15</terms>
9
+ <currency>USD</currency>
10
+
11
+ <tags>brian, consulting</tags>
12
+ </invoice>
13
+ <invoice status="open" uri="http://example.blinksale.com/invoices/1" total="20.00" total_due="10.00">
14
+ <client name="Acme">http://example.blinksale.com/clients/2</client>
15
+
16
+ <number>100002</number>
17
+ <date>2006-09-19</date>
18
+ <terms due_date="2006-10-04">15</terms>
19
+ <currency>USD</currency>
20
+
21
+ <tags>brian, consulting</tags>
22
+ </invoice>
23
+ </invoices>
@@ -0,0 +1,58 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <invoice xmlns="http://www.blinksale.com/api" uri="http://example.blinksale.com/invoices/1"
3
+ status="pastdue" subtotal="20.00" total="20.00" paid="10.00" total_due="10.00"
4
+ surplus="0.00" updated_at="2006-09-20T17:27:48Z" created_at="2006-06-27T22:43:13Z">
5
+ <client name="Acme">http://example.blinksale.com/clients/2</client>
6
+ <number>100001</number>
7
+
8
+ <po_number>123456</po_number>
9
+ <date>2006-06-27</date>
10
+ <terms due_date="2006-07-12">15</terms>
11
+ <currency>USD</currency>
12
+
13
+ <tax amount="0.00">8.75%</tax>
14
+ <freight>0.00</freight>
15
+ <late_fee amount="0.00">0%</late_fee>
16
+ <tags>bob, scott</tags>
17
+
18
+ <lines total="882.00">
19
+ <line>
20
+ <name>French Hens</name>
21
+ <quantity>3.0</quantity>
22
+ <units>Product</units>
23
+
24
+ <unit_price>19.00</unit_price>
25
+ <taxed>false</taxed>
26
+ </line>
27
+ <line>
28
+ <name>Piper-Piping</name>
29
+
30
+ <quantity>11.0</quantity>
31
+ <units>Service</units>
32
+ <unit_price>75.00</unit_price>
33
+ <taxed>false</taxed>
34
+
35
+ </line>
36
+ </lines>
37
+ <deliveries uri="http://example.blinksale.com/invoices/1/deliveries">
38
+ <delivery uri="http://example.blinksale.com/invoices/1/deliveries/3" created_at="2006-09-22T23:51:42Z">
39
+ <body>Here's the invoice for the latest work - thanks!</body>
40
+
41
+ <recipient name="John Doe" email="john@acme.com">http://example.blinksale.com/clients/2/people/2</recipient>
42
+ <recipient name="Bob Smith" email="bob@example.com">http://example.blinksale.com/users/1</recipient>
43
+ </delivery>
44
+ </deliveries>
45
+ <payments uri="http://example.blinksale.com/invoices/1/payments" total="10.00">
46
+
47
+ <payment uri="http://example.blinksale.com/invoices/1/payments/5" created_at="2006-09-25T18:01:33Z">
48
+ <amount>10.00</amount>
49
+ <date>2006-09-25</date>
50
+ <payment_method>Check</method>
51
+
52
+ <number>10001</number>
53
+ </payment>
54
+ </payments>
55
+ <notes>Please reference this invoice number in your check memo.</notes>
56
+ <include_payment_link>true</include_payment_link>
57
+
58
+ </invoice>
@@ -0,0 +1,31 @@
1
+ require File.expand_path(File.dirname(__FILE__) + "/spec_helper")
2
+
3
+ single_xml = File.read(File.expand_path(File.dirname(__FILE__) + "/fixtures/invoice_single.xml"))
4
+
5
+ describe Blinksale::Invoice do
6
+ describe ".from_node" do
7
+ let(:node) do
8
+ Nokogiri::XML(single_xml).xpath("//xmlns:invoice").first
9
+ end
10
+
11
+ it "returns Invoice instance" do
12
+ Blinksale::Invoice.from_node(node).should be_an_instance_of(Blinksale::Invoice)
13
+ end
14
+
15
+ describe "invoice" do
16
+ let(:invoice) do
17
+ Blinksale::Invoice.from_node(node)
18
+ end
19
+
20
+ it "has proper attributes set" do
21
+ invoice.id.should eql(1)
22
+ invoice.number.should eql("100001")
23
+ invoice.total_amount.should eql(20.0)
24
+ invoice.due_amount.should eql(10.0)
25
+ invoice.issued_on.should eql(Date.new(2006, 6, 27))
26
+ invoice.due_on.should eql(Date.new(2006, 7, 12))
27
+ invoice.currency.should eql("USD")
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,54 @@
1
+ require File.expand_path(File.dirname(__FILE__) + "/spec_helper")
2
+
3
+ single_xml = File.read(File.expand_path(File.dirname(__FILE__) + "/fixtures/invoice_single.xml"))
4
+ collection_xml = File.read(File.expand_path(File.dirname(__FILE__) + "/fixtures/invoice_collection.xml"))
5
+
6
+ describe Blinksale::Invoices do
7
+ let(:service) do
8
+ Blinksale::Service.new("test-host", "test-username", "test-password")
9
+ end
10
+
11
+ let(:invoices) { service.invoices }
12
+
13
+ it "has proper service set" do
14
+ invoices.service.should eql(service)
15
+ end
16
+
17
+ describe "#all" do
18
+ before(:each) do
19
+ RestClient::Resource.any_instance.stubs(:get).returns(collection_xml)
20
+ end
21
+
22
+ it "returns invoices collection" do
23
+ invoices.all.first.should be_an_instance_of(Blinksale::Invoice)
24
+ end
25
+
26
+ describe "invoices" do
27
+ let(:invoice) { invoices.all.first }
28
+
29
+ it "have proper attributes set" do
30
+ invoice.number = "100001"
31
+ invoice.issued_on = Date.new(2006, 9, 19)
32
+ end
33
+ end
34
+ end
35
+
36
+ describe "#get" do
37
+ before(:each) do
38
+ RestClient::Resource.any_instance.stubs(:get).returns(single_xml)
39
+ end
40
+
41
+ it "returns invoice instance" do
42
+ invoices.get(1).should be_an_instance_of(Blinksale::Invoice)
43
+ end
44
+
45
+ describe "invoice" do
46
+ let(:invoice) { invoices.get(1) }
47
+
48
+ it "have proper attributes set" do
49
+ invoice.number = "100001"
50
+ invoice.issued_on = Date.new(2006, 9, 19)
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,12 @@
1
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
3
+ require 'rspec'
4
+ require 'blinksale'
5
+
6
+ # Requires supporting files with custom matchers and macros, etc,
7
+ # in ./support/ and its subdirectories.
8
+ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
9
+
10
+ RSpec.configure do |config|
11
+ config.mock_with :mocha
12
+ end
metadata CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
6
  - 0
7
- - 1
7
+ - 2
8
8
  - 0
9
- version: 0.1.0
9
+ version: 0.2.0
10
10
  platform: ruby
11
11
  authors:
12
12
  - Tomasz Werbicki
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2011-06-27 00:00:00 +02:00
17
+ date: 2011-06-28 00:00:00 +02:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -22,11 +22,13 @@ dependencies:
22
22
  requirement: &id001 !ruby/object:Gem::Requirement
23
23
  none: false
24
24
  requirements:
25
- - - ">="
25
+ - - ~>
26
26
  - !ruby/object:Gem::Version
27
27
  segments:
28
- - 0
29
- version: "0"
28
+ - 1
29
+ - 6
30
+ - 3
31
+ version: 1.6.3
30
32
  type: :runtime
31
33
  prerelease: false
32
34
  version_requirements: *id001
@@ -35,11 +37,13 @@ dependencies:
35
37
  requirement: &id002 !ruby/object:Gem::Requirement
36
38
  none: false
37
39
  requirements:
38
- - - ">="
40
+ - - ~>
39
41
  - !ruby/object:Gem::Version
40
42
  segments:
41
- - 0
42
- version: "0"
43
+ - 1
44
+ - 4
45
+ - 6
46
+ version: 1.4.6
43
47
  type: :runtime
44
48
  prerelease: false
45
49
  version_requirements: *id002
@@ -59,8 +63,23 @@ dependencies:
59
63
  prerelease: false
60
64
  version_requirements: *id003
61
65
  - !ruby/object:Gem::Dependency
62
- name: bundler
66
+ name: mocha
63
67
  requirement: &id004 !ruby/object:Gem::Requirement
68
+ none: false
69
+ requirements:
70
+ - - ~>
71
+ - !ruby/object:Gem::Version
72
+ segments:
73
+ - 0
74
+ - 9
75
+ - 12
76
+ version: 0.9.12
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: *id004
80
+ - !ruby/object:Gem::Dependency
81
+ name: bundler
82
+ requirement: &id005 !ruby/object:Gem::Requirement
64
83
  none: false
65
84
  requirements:
66
85
  - - ~>
@@ -72,10 +91,10 @@ dependencies:
72
91
  version: 1.0.0
73
92
  type: :development
74
93
  prerelease: false
75
- version_requirements: *id004
94
+ version_requirements: *id005
76
95
  - !ruby/object:Gem::Dependency
77
96
  name: jeweler
78
- requirement: &id005 !ruby/object:Gem::Requirement
97
+ requirement: &id006 !ruby/object:Gem::Requirement
79
98
  none: false
80
99
  requirements:
81
100
  - - ~>
@@ -87,7 +106,22 @@ dependencies:
87
106
  version: 1.6.2
88
107
  type: :development
89
108
  prerelease: false
90
- version_requirements: *id005
109
+ version_requirements: *id006
110
+ - !ruby/object:Gem::Dependency
111
+ name: simplecov
112
+ requirement: &id007 !ruby/object:Gem::Requirement
113
+ none: false
114
+ requirements:
115
+ - - ~>
116
+ - !ruby/object:Gem::Version
117
+ segments:
118
+ - 0
119
+ - 4
120
+ - 2
121
+ version: 0.4.2
122
+ type: :development
123
+ prerelease: false
124
+ version_requirements: *id007
91
125
  description: Basic Blinksale invoice fetcher.
92
126
  email: tomasz@werbicki.net
93
127
  executables: []
@@ -108,7 +142,14 @@ files:
108
142
  - VERSION
109
143
  - blinksale.gemspec
110
144
  - lib/blinksale.rb
145
+ - lib/clients.rb
111
146
  - lib/invoices.rb
147
+ - spec/blinksale_spec.rb
148
+ - spec/fixtures/invoice_collection.xml
149
+ - spec/fixtures/invoice_single.xml
150
+ - spec/invoice_spec.rb
151
+ - spec/invoices_spec.rb
152
+ - spec/spec_helper.rb
112
153
  has_rdoc: true
113
154
  homepage: http://github.com/neaf/blinksale
114
155
  licenses:
@@ -123,7 +164,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
123
164
  requirements:
124
165
  - - ">="
125
166
  - !ruby/object:Gem::Version
126
- hash: 2365357788582503070
167
+ hash: -1490968728677671447
127
168
  segments:
128
169
  - 0
129
170
  version: "0"