trackerific 0.5.5 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. data/README.rdoc +62 -44
  2. data/Rakefile +1 -1
  3. data/VERSION +1 -1
  4. data/changelog +9 -0
  5. data/lib/trackerific/configuration.rb +2 -2
  6. data/lib/trackerific/details.rb +36 -10
  7. data/lib/trackerific/event.rb +9 -7
  8. data/lib/trackerific/service.rb +22 -6
  9. data/lib/trackerific/services/fedex.rb +11 -7
  10. data/lib/trackerific/services/mock_service.rb +23 -14
  11. data/lib/trackerific/services/ups.rb +12 -8
  12. data/lib/trackerific/services/usps.rb +114 -21
  13. data/spec/fixtures/usps_city_state_lookup_response.xml +8 -0
  14. data/spec/lib/helpers/options_helper_spec.rb +3 -3
  15. data/spec/lib/trackerific/configuration_spec.rb +35 -0
  16. data/spec/lib/trackerific/details_spec.rb +71 -11
  17. data/spec/lib/trackerific/event_spec.rb +34 -19
  18. data/spec/lib/trackerific/service_spec.rb +3 -3
  19. data/spec/lib/trackerific/services/fedex_spec.rb +16 -3
  20. data/spec/lib/trackerific/services/mock_service_spec.rb +19 -4
  21. data/spec/lib/trackerific/services/ups_spec.rb +17 -2
  22. data/spec/lib/trackerific/services/usps_spec.rb +60 -11
  23. data/spec/lib/trackerific_spec.rb +7 -5
  24. data/trackerific.gemspec +5 -27
  25. metadata +8 -30
  26. data/doc/OptionsHelper.html +0 -287
  27. data/doc/Trackerific/Configuration.html +0 -354
  28. data/doc/Trackerific/Details.html +0 -565
  29. data/doc/Trackerific/Error.html +0 -127
  30. data/doc/Trackerific/Event.html +0 -639
  31. data/doc/Trackerific/FedEx.html +0 -558
  32. data/doc/Trackerific/Service.html +0 -579
  33. data/doc/Trackerific/UPS.html +0 -532
  34. data/doc/Trackerific/USPS.html +0 -568
  35. data/doc/Trackerific.html +0 -833
  36. data/doc/_index.html +0 -226
  37. data/doc/class_list.html +0 -47
  38. data/doc/css/common.css +0 -1
  39. data/doc/css/full_list.css +0 -53
  40. data/doc/css/style.css +0 -320
  41. data/doc/file.README.html +0 -288
  42. data/doc/file_list.html +0 -49
  43. data/doc/frames.html +0 -13
  44. data/doc/index.html +0 -288
  45. data/doc/js/app.js +0 -205
  46. data/doc/js/full_list.js +0 -150
  47. data/doc/js/jquery.js +0 -16
  48. data/doc/method_list.html +0 -294
  49. data/doc/top-level-namespace.html +0 -103
@@ -5,7 +5,7 @@ describe OptionsHelper do
5
5
 
6
6
  describe :validate_options do
7
7
 
8
- context "with all required options" do
8
+ context "with all required parameters" do
9
9
  before do
10
10
  @required = [:hello, :world]
11
11
  @options = {:hello => true, :world => true}
@@ -14,7 +14,7 @@ describe OptionsHelper do
14
14
  it { should be true }
15
15
  end
16
16
 
17
- context "with missing required options" do
17
+ context "with missing required parameters" do
18
18
  before do
19
19
  @required = [:hello, :world]
20
20
  @options = {:hello => true}
@@ -22,7 +22,7 @@ describe OptionsHelper do
22
22
  specify { lambda { validate_options(@options, @required) }.should raise_error(ArgumentError) }
23
23
  end
24
24
 
25
- context "with no required options" do
25
+ context "with no required parameters" do
26
26
  before do
27
27
  @required = []
28
28
  @options = {}
@@ -6,4 +6,39 @@ describe "Trackerific.configuration" do
6
6
  subject { Trackerific.configuration }
7
7
  it { should be_a Trackerific::Configuration }
8
8
 
9
+ context "with valid options" do
10
+ it "should not raise any errors" do
11
+ lambda {
12
+ Trackerific.configure do |config|
13
+ config.usps :user_id => 'userid'
14
+ end
15
+ }.should_not raise_error
16
+ end
17
+ it "should save a valid option" do
18
+ Trackerific.configure do |config|
19
+ config.usps :user_id => 'userid'
20
+ end
21
+ Trackerific.configuration.usps[:user_id].should eq 'userid'
22
+ end
23
+ end
24
+
25
+ context "with invalid options" do
26
+ it "should raise ArgumentError" do
27
+ lambda {
28
+ Trackerific.configure do |config|
29
+ config.usps :invalid => 'option'
30
+ end
31
+ }.should raise_error ArgumentError
32
+ end
33
+ end
34
+
35
+ context "with invalid configuration group - not a Trackerific:Service" do
36
+ it "should raise NoMethodError" do
37
+ lambda {
38
+ Trackerific.configure do |config|
39
+ config.qwertyuiop :invalid => 'group'
40
+ end
41
+ }.should raise_error(NoMethodError)
42
+ end
43
+ end
9
44
  end
@@ -1,22 +1,82 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Trackerific::Details do
4
-
5
- before { @details = Trackerific::Details.new(String.new, String.new, Array.new) }
6
4
 
7
- describe :events do
8
- subject { @details.events }
9
- it { should be_a Array }
5
+ before do
6
+ @required_details = {
7
+ :package_id => String.new,
8
+ :summary => String.new,
9
+ :events => Array.new
10
+ }
11
+ @valid_options = {
12
+ :weight => Hash.new,
13
+ :via => String.new
14
+ }
15
+ end
16
+
17
+ context "with required options only" do
18
+ before { @details = Trackerific::Details.new(@required_details) }
19
+
20
+ describe :events do
21
+ subject { @details.events }
22
+ it { should be_a Array }
23
+ end
24
+
25
+ describe :package_id do
26
+ subject { @details.package_id }
27
+ it { should be_a String }
28
+ end
29
+
30
+ describe :summary do
31
+ subject { @details.summary }
32
+ it { should be_a String }
33
+ end
34
+
35
+ describe :weight do
36
+ subject { @details.weight }
37
+ it { should be_nil }
38
+ end
39
+
40
+ describe :via do
41
+ subject { @details.via }
42
+ it { should be_nil }
43
+ end
10
44
  end
11
45
 
12
- describe :package_id do
13
- subject { @details.package_id }
14
- it { should be_a String }
46
+ context "with all options" do
47
+ before { @details = Trackerific::Details.new(@required_details.merge(@valid_options)) }
48
+
49
+ describe :events do
50
+ subject { @details.events }
51
+ it { should be_a Array }
52
+ end
53
+
54
+ describe :package_id do
55
+ subject { @details.package_id }
56
+ it { should be_a String }
57
+ end
58
+
59
+ describe :summary do
60
+ subject { @details.summary }
61
+ it { should be_a String }
62
+ end
63
+
64
+ describe :weight do
65
+ subject { @details.weight }
66
+ it { should be_a Hash }
67
+ end
68
+
69
+ describe :via do
70
+ subject { @details.via }
71
+ it { should be_a String }
72
+ end
15
73
  end
16
74
 
17
- describe :summary do
18
- subject { @details.summary }
19
- it { should be_a String }
75
+ context "with no options" do
76
+ specify { lambda { Trackerific::Details.new }.should raise_error(ArgumentError) }
20
77
  end
21
78
 
79
+ context "with invalid options" do
80
+ specify { lambda { Trackerific::Details.new(:hello => "world")}.should raise_error(ArgumentError) }
81
+ end
22
82
  end
@@ -4,30 +4,45 @@ describe Trackerific::Event do
4
4
 
5
5
  before do
6
6
  @date = Time.now
7
- @description = "description"
8
- @location = "location"
9
- @event = Trackerific::Event.new(@date, @description, @location)
7
+ @description = 'description'
8
+ @location = 'location'
9
+ @required_parameters = {
10
+ :date => @date,
11
+ :description => @description,
12
+ :location => @location
13
+ }
10
14
  end
11
15
 
12
- describe :date do
13
- subject { @event.date }
14
- it { should be @date }
16
+ context "with all required options" do
17
+ before { @event = Trackerific::Event.new(@required_parameters) }
18
+
19
+ describe :date do
20
+ subject { @event.date }
21
+ it { should be @date }
22
+ end
23
+
24
+ describe :description do
25
+ subject { @event.description }
26
+ it { should be @description }
27
+ end
28
+
29
+ describe :location do
30
+ subject { @event.location }
31
+ it { should be @location }
32
+ end
33
+
34
+ describe :to_s do
35
+ before { @regex = /(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) (0[1-9]|[1-2][0-9]|3[01]) \d{2}:\d{2} (am|pm).*/ }
36
+ subject { @event.to_s }
37
+ it("should be in format mmm dd hh:mm am/pm.*") { should =~ @regex }
38
+ end
15
39
  end
16
40
 
17
- describe :description do
18
- subject { @event.description }
19
- it { should be @description }
41
+ context "missing some options" do
42
+ specify { lambda { Trackerific::Event.new(:date => Time.now, :description => '') }.should raise_error(ArgumentError) }
20
43
  end
21
44
 
22
- describe :location do
23
- subject { @event.location }
24
- it { should be @location }
45
+ context "with invalid options" do
46
+ specify { lambda { Trackerific::Event.new(:hello => "world") }.should raise_error(ArgumentError) }
25
47
  end
26
-
27
- describe :to_s do
28
- before { @regex = /(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) (0[1-9]|[1-2][0-9]|3[01]) \d{2}:\d{2} (am|pm).*/ }
29
- subject { @event.to_s }
30
- it("should be in format mmm dd hh:mm am/pm.*") { should =~ @regex }
31
- end
32
-
33
48
  end
@@ -2,7 +2,7 @@ require 'spec_helper'
2
2
 
3
3
  class TestServiceClass < Trackerific::Service
4
4
  class << self
5
- def required_options
5
+ def required_parameters
6
6
  [:required, :also_required]
7
7
  end
8
8
  end
@@ -10,8 +10,8 @@ end
10
10
 
11
11
  describe Trackerific::Service do
12
12
 
13
- describe :required_options do
14
- specify { Trackerific::Service.required_options.should be_kind_of Array }
13
+ describe :required_parameters do
14
+ specify { Trackerific::Service.required_parameters.should be_kind_of Array }
15
15
  end
16
16
 
17
17
  describe :service_name do
@@ -3,15 +3,28 @@ require 'fakeweb'
3
3
 
4
4
  FEDEX_TRACK_URL = "https://gateway.fedex.com/GatewayDC"
5
5
 
6
- describe "Trackerific::FedEx" do
6
+ describe Trackerific::FedEx do
7
7
  include Fixtures
8
8
 
9
- describe :required_options do
10
- subject { Trackerific::FedEx.required_options }
9
+ specify("it should descend from Trackerific::Service") {
10
+ Trackerific::FedEx.superclass.should be Trackerific::Service
11
+ }
12
+
13
+ describe :required_parameters do
14
+ subject { Trackerific::FedEx.required_parameters }
11
15
  it { should include(:account) }
12
16
  it { should include(:meter) }
13
17
  end
14
18
 
19
+ describe :valid_options do
20
+ it "should include required_parameters" do
21
+ valid = Trackerific::FedEx.valid_options
22
+ Trackerific::FedEx.required_parameters.each do |opt|
23
+ valid.should include opt
24
+ end
25
+ end
26
+ end
27
+
15
28
  describe :package_id_matchers do
16
29
  subject { Trackerific::FedEx.package_id_matchers }
17
30
  it("should be an Array of Regexp") { should each { |m| m.should be_a Regexp } }
@@ -1,14 +1,29 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Trackerific::MockService do
4
- describe :required_options do
5
- subject { Trackerific::MockService.required_options }
4
+
5
+ specify("it should descend from Trackerific::Service") {
6
+ Trackerific::MockService.superclass.should be Trackerific::Service
7
+ }
8
+
9
+ describe :required_parameters do
10
+ subject { Trackerific::MockService.required_parameters }
6
11
  it { should be_empty }
7
12
  end
8
13
 
9
14
  describe :package_id_matchers do
10
- subject { Trackerific::MockService.package_id_matchers }
11
- it("should be an Array of Regexp") { should each { |m| m.should be_a Regexp } }
15
+
16
+ context "when in development or test mode" do
17
+ subject { Trackerific::MockService.package_id_matchers }
18
+ it("should be an Array of Regexp") { should each { |m| m.should be_a Regexp } }
19
+ end
20
+
21
+ context "when in production mode" do
22
+ before { Rails.env = "production" }
23
+ subject { Trackerific::MockService.package_id_matchers }
24
+ it { should be_empty }
25
+ after { Rails.env = "test"}
26
+ end
12
27
  end
13
28
 
14
29
  describe :track_package do
@@ -6,13 +6,26 @@ UPS_TRACK_URL = 'https://wwwcie.ups.com/ups.app/xml/Track'
6
6
  describe "Trackerific::UPS" do
7
7
  include Fixtures
8
8
 
9
- describe :required_options do
10
- subject { Trackerific::UPS.required_options }
9
+ specify("it should descend from Trackerific::Service") {
10
+ Trackerific::UPS.superclass.should be Trackerific::Service
11
+ }
12
+
13
+ describe :required_parameters do
14
+ subject { Trackerific::UPS.required_parameters }
11
15
  it { should include(:key) }
12
16
  it { should include(:user_id) }
13
17
  it { should include(:password) }
14
18
  end
15
19
 
20
+ describe :valid_options do
21
+ it "should include required_parameters" do
22
+ valid = Trackerific::UPS.valid_options
23
+ Trackerific::UPS.required_parameters.each do |opt|
24
+ valid.should include opt
25
+ end
26
+ end
27
+ end
28
+
16
29
  describe :package_id_matchers do
17
30
  subject { Trackerific::UPS.package_id_matchers }
18
31
  it("should be an Array of Regexp") { should each { |m| m.should be_a Regexp } }
@@ -59,6 +72,8 @@ describe "Trackerific::UPS" do
59
72
 
60
73
  end
61
74
 
75
+ pending "when server returns corrupted xml"
76
+
62
77
  end
63
78
 
64
79
  end
@@ -1,19 +1,47 @@
1
1
  require 'spec_helper'
2
2
  require 'fakeweb'
3
3
 
4
- USPS_TRACK_URL = %r|http://testing\.shippingapis\.com/.*|
4
+ USPS_URL = %r|http://testing\.shippingapis\.com/.*|
5
5
 
6
6
  describe Trackerific::USPS do
7
7
  include Fixtures
8
8
 
9
- describe :required_options do
10
- subject { Trackerific::USPS.required_options }
11
- it { should include(:user_id) }
12
- end
9
+ specify("it should descend from Trackerific::Service") {
10
+ Trackerific::USPS.superclass.should be Trackerific::Service
11
+ }
13
12
 
14
- describe :package_id_matchers do
15
- subject { Trackerific::UPS.package_id_matchers }
16
- it("should be an Array of Regexp") { should each { |m| m.should be_a Regexp } }
13
+ describe :city_state_lookup do
14
+
15
+ before(:all) do
16
+ @usps = Trackerific::USPS.new :user_id => '123USERID4567'
17
+ end
18
+
19
+ context "with a successful response from the server" do
20
+
21
+ before(:all) do
22
+ FakeWeb.register_uri(:get, USPS_URL, :body => load_fixture(:usps_city_state_lookup_response))
23
+ end
24
+
25
+ before(:each) do
26
+ @lookup = @usps.city_state_lookup("90210")
27
+ end
28
+
29
+ subject { @lookup }
30
+ it { should include(:city) }
31
+ it { should include(:state) }
32
+ it { should include(:zip) }
33
+
34
+ end
35
+
36
+ context "with an error response from the server" do
37
+
38
+ before(:all) do
39
+ FakeWeb.register_uri(:get, USPS_URL, :body => load_fixture(:usps_error_response))
40
+ end
41
+
42
+ specify { lambda { @usps.city_state_lookup("90210") }.should raise_error(Trackerific::Error) }
43
+
44
+ end
17
45
  end
18
46
 
19
47
  describe :track_package do
@@ -26,7 +54,7 @@ describe Trackerific::USPS do
26
54
  context "with a successful response from the server" do
27
55
 
28
56
  before(:all) do
29
- FakeWeb.register_uri(:get, USPS_TRACK_URL, :body => load_fixture(:usps_success_response))
57
+ FakeWeb.register_uri(:get, USPS_URL, :body => load_fixture(:usps_success_response))
30
58
  end
31
59
 
32
60
  before(:each) do
@@ -48,15 +76,36 @@ describe Trackerific::USPS do
48
76
 
49
77
  end
50
78
 
79
+ pending "when use_city_state_lookup == true"
80
+
51
81
  context "with an error response from the server" do
52
82
 
53
83
  before(:all) do
54
- FakeWeb.register_uri(:get, USPS_TRACK_URL, :body => load_fixture(:usps_error_response))
84
+ FakeWeb.register_uri(:get, USPS_URL, :body => load_fixture(:usps_error_response))
55
85
  end
56
86
 
57
87
  specify { lambda { @usps.track_package(@package_id) }.should raise_error(Trackerific::Error) }
58
88
 
59
89
  end
60
90
  end
61
-
91
+
92
+ describe :required_parameters do
93
+ subject { Trackerific::USPS.required_parameters }
94
+ it { should include(:user_id) }
95
+ end
96
+
97
+ describe :valid_options do
98
+ it "should include required_parameters" do
99
+ valid = Trackerific::USPS.valid_options
100
+ Trackerific::USPS.required_parameters.each do |opt|
101
+ valid.should include opt
102
+ end
103
+ end
104
+ end
105
+
106
+ describe :package_id_matchers do
107
+ subject { Trackerific::UPS.package_id_matchers }
108
+ it("should be an Array of Regexp") { should each { |m| m.should be_a Regexp } }
109
+ end
110
+
62
111
  end
@@ -48,13 +48,15 @@ describe Trackerific do
48
48
 
49
49
  describe :track_package do
50
50
 
51
- before do
52
- @details = track_package "XXXXXXXXXX"
51
+ context "with a valid package id" do
52
+ before { @details = track_package "XXXXXXXXXX" }
53
+ subject { @details }
54
+ it { should be_kind_of Trackerific::Details }
53
55
  end
54
56
 
55
- subject { @details }
56
-
57
- it { should be_kind_of Trackerific::Details }
57
+ context "with an invalid package id" do
58
+ specify { lambda { track_package "XXXxxxxxxx" }.should raise_error(Trackerific::Error) }
59
+ end
58
60
  end
59
61
 
60
62
  end
data/trackerific.gemspec CHANGED
@@ -5,12 +5,12 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{trackerific}
8
- s.version = "0.5.5"
8
+ s.version = "0.6.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Travis Haynes"]
12
- s.date = %q{2011-06-24}
13
- s.description = %q{Trackerific provides USPS, FedEx and UPS package tracking to Rails.}
12
+ s.date = %q{2011-06-27}
13
+ s.description = %q{Package tracking made easy for Rails. Currently supported services include FedEx, UPS, and USPS.}
14
14
  s.email = %q{travis.j.haynes@gmail.com}
15
15
  s.extra_rdoc_files = [
16
16
  "LICENSE.txt",
@@ -24,30 +24,7 @@ Gem::Specification.new do |s|
24
24
  "README.rdoc",
25
25
  "Rakefile",
26
26
  "VERSION",
27
- "doc/OptionsHelper.html",
28
- "doc/Trackerific.html",
29
- "doc/Trackerific/Configuration.html",
30
- "doc/Trackerific/Details.html",
31
- "doc/Trackerific/Error.html",
32
- "doc/Trackerific/Event.html",
33
- "doc/Trackerific/FedEx.html",
34
- "doc/Trackerific/Service.html",
35
- "doc/Trackerific/UPS.html",
36
- "doc/Trackerific/USPS.html",
37
- "doc/_index.html",
38
- "doc/class_list.html",
39
- "doc/css/common.css",
40
- "doc/css/full_list.css",
41
- "doc/css/style.css",
42
- "doc/file.README.html",
43
- "doc/file_list.html",
44
- "doc/frames.html",
45
- "doc/index.html",
46
- "doc/js/app.js",
47
- "doc/js/full_list.js",
48
- "doc/js/jquery.js",
49
- "doc/method_list.html",
50
- "doc/top-level-namespace.html",
27
+ "changelog",
51
28
  "lib/helpers/options_helper.rb",
52
29
  "lib/trackerific.rb",
53
30
  "lib/trackerific/configuration.rb",
@@ -63,6 +40,7 @@ Gem::Specification.new do |s|
63
40
  "spec/fixtures/fedex_success_response.xml",
64
41
  "spec/fixtures/ups_error_response.xml",
65
42
  "spec/fixtures/ups_success_response.xml",
43
+ "spec/fixtures/usps_city_state_lookup_response.xml",
66
44
  "spec/fixtures/usps_error_response.xml",
67
45
  "spec/fixtures/usps_success_response.xml",
68
46
  "spec/lib/helpers/options_helper_spec.rb",
metadata CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
6
  - 0
7
- - 5
8
- - 5
9
- version: 0.5.5
7
+ - 6
8
+ - 0
9
+ version: 0.6.0
10
10
  platform: ruby
11
11
  authors:
12
12
  - Travis Haynes
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2011-06-24 00:00:00 -07:00
17
+ date: 2011-06-27 00:00:00 -07:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -152,7 +152,7 @@ dependencies:
152
152
  type: :development
153
153
  prerelease: false
154
154
  version_requirements: *id009
155
- description: Trackerific provides USPS, FedEx and UPS package tracking to Rails.
155
+ description: Package tracking made easy for Rails. Currently supported services include FedEx, UPS, and USPS.
156
156
  email: travis.j.haynes@gmail.com
157
157
  executables: []
158
158
 
@@ -169,30 +169,7 @@ files:
169
169
  - README.rdoc
170
170
  - Rakefile
171
171
  - VERSION
172
- - doc/OptionsHelper.html
173
- - doc/Trackerific.html
174
- - doc/Trackerific/Configuration.html
175
- - doc/Trackerific/Details.html
176
- - doc/Trackerific/Error.html
177
- - doc/Trackerific/Event.html
178
- - doc/Trackerific/FedEx.html
179
- - doc/Trackerific/Service.html
180
- - doc/Trackerific/UPS.html
181
- - doc/Trackerific/USPS.html
182
- - doc/_index.html
183
- - doc/class_list.html
184
- - doc/css/common.css
185
- - doc/css/full_list.css
186
- - doc/css/style.css
187
- - doc/file.README.html
188
- - doc/file_list.html
189
- - doc/frames.html
190
- - doc/index.html
191
- - doc/js/app.js
192
- - doc/js/full_list.js
193
- - doc/js/jquery.js
194
- - doc/method_list.html
195
- - doc/top-level-namespace.html
172
+ - changelog
196
173
  - lib/helpers/options_helper.rb
197
174
  - lib/trackerific.rb
198
175
  - lib/trackerific/configuration.rb
@@ -208,6 +185,7 @@ files:
208
185
  - spec/fixtures/fedex_success_response.xml
209
186
  - spec/fixtures/ups_error_response.xml
210
187
  - spec/fixtures/ups_success_response.xml
188
+ - spec/fixtures/usps_city_state_lookup_response.xml
211
189
  - spec/fixtures/usps_error_response.xml
212
190
  - spec/fixtures/usps_success_response.xml
213
191
  - spec/lib/helpers/options_helper_spec.rb
@@ -239,7 +217,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
239
217
  requirements:
240
218
  - - ">="
241
219
  - !ruby/object:Gem::Version
242
- hash: -2587276828587916767
220
+ hash: -4113113106742539098
243
221
  segments:
244
222
  - 0
245
223
  version: "0"