easypost 3.1.4 → 3.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG +6 -0
- data/README.md +1 -0
- data/VERSION +1 -1
- data/lib/easypost.rb +2 -2
- data/lib/easypost/address.rb +47 -49
- data/lib/easypost/batch.rb +34 -38
- data/lib/easypost/carrier_account.rb +4 -6
- data/lib/easypost/customs_info.rb +3 -7
- data/lib/easypost/customs_item.rb +3 -7
- data/lib/easypost/error.rb +25 -27
- data/lib/easypost/event.rb +3 -6
- data/lib/easypost/insurance.rb +1 -3
- data/lib/easypost/item.rb +4 -8
- data/lib/easypost/object.rb +109 -111
- data/lib/easypost/order.rb +20 -22
- data/lib/easypost/parcel.rb +1 -3
- data/lib/easypost/pickup.rb +19 -23
- data/lib/easypost/pickup_rate.rb +1 -3
- data/lib/easypost/postage_label.rb +1 -3
- data/lib/easypost/print_job.rb +1 -5
- data/lib/easypost/printer.rb +18 -22
- data/lib/easypost/rate.rb +1 -3
- data/lib/easypost/refund.rb +1 -3
- data/lib/easypost/report.rb +22 -24
- data/lib/easypost/resource.rb +58 -60
- data/lib/easypost/scan_form.rb +4 -6
- data/lib/easypost/shipment.rb +83 -87
- data/lib/easypost/tracker.rb +10 -12
- data/lib/easypost/user.rb +33 -35
- data/lib/easypost/util.rb +100 -102
- data/lib/easypost/webhook.rb +22 -24
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b9e4ea3a1f185f475aac49ab7985092a8ba095e928a812ad77c68eb7b450afdc
|
4
|
+
data.tar.gz: b1291c1f7325559896f109257231fba6f0e781e7f9778c619ec115a86abf9731
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f3c88ce92a498fa4a0bb45e4d0ca06aeee55158af398632ddce04c0513b0e3dae99f27d1d752f3fb6e69daf3cc536d3872c4c18ba141e20eab9e60fdc58872ae
|
7
|
+
data.tar.gz: ec5ec3ad97341782372ba9c7b3e836b451a8c23dd5b9bf27e51dfcfeb561eb1140751c9529b13bbe8b384151ac5023628dff6803fe70a57a4b34070b1d83d64a
|
data/CHANGELOG
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
=== 3.1.5 2020-12-16
|
2
|
+
|
3
|
+
* Fix attribute lookup when manually constructing objects (#105; thanks @drewtempelmeyer)
|
4
|
+
* Flatten class names and clean up some other style issues
|
5
|
+
* Fix `EasyPost::Address.create_and_verify`, broken since 3.1.0 (#108; thanks @rajbirverma)
|
6
|
+
|
1
7
|
=== 3.1.4 2020-09-29
|
2
8
|
|
3
9
|
* Don't modify params passed into Address#create (#78; thanks @TheRusskiy)
|
data/README.md
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
# EasyPost Ruby Client Library
|
2
2
|
|
3
3
|
[](https://travis-ci.com/EasyPost/easypost-ruby)
|
4
|
+
[](https://badge.fury.io/rb/easypost)
|
4
5
|
|
5
6
|
|
6
7
|
EasyPost is a simple shipping API. You can sign up for an account at https://easypost.com
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
3.1.
|
1
|
+
3.1.5
|
data/lib/easypost.rb
CHANGED
@@ -118,7 +118,7 @@ module EasyPost
|
|
118
118
|
|
119
119
|
request = Net::HTTP.const_get(method.capitalize).new(path)
|
120
120
|
if body
|
121
|
-
request.body = JSON.dump(Util.objects_to_ids(body))
|
121
|
+
request.body = JSON.dump(EasyPost::Util.objects_to_ids(body))
|
122
122
|
end
|
123
123
|
|
124
124
|
request["Content-Type"] = "application/json"
|
@@ -131,7 +131,7 @@ module EasyPost
|
|
131
131
|
|
132
132
|
if (400..599).include? response.code.to_i
|
133
133
|
error = JSON.parse(response.body)["error"]
|
134
|
-
raise Error.new(error["message"], response.code.to_i, error["code"], error["errors"], response.body)
|
134
|
+
raise EasyPost::Error.new(error["message"], response.code.to_i, error["code"], error["errors"], response.body)
|
135
135
|
end
|
136
136
|
|
137
137
|
if response["Content-Type"].include? "application/json"
|
data/lib/easypost/address.rb
CHANGED
@@ -1,60 +1,58 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
attr_accessor :message # Backwards compatibility
|
4
|
-
|
5
|
-
def self.create(params={}, api_key=nil)
|
6
|
-
url = self.url
|
7
|
-
|
8
|
-
address = params.reject { |k,_| k == :verify || k == :verify_strict }
|
9
|
-
|
10
|
-
if params[:verify] || params[:verify_strict]
|
11
|
-
verify = params[:verify] || []
|
12
|
-
verify_strict = params[:verify_strict] || []
|
13
|
-
|
14
|
-
url += "?"
|
15
|
-
verify.each do |verification|
|
16
|
-
url += "verify[]=#{verification}&"
|
17
|
-
end
|
18
|
-
verify_strict.each do |verification|
|
19
|
-
url += "verify_strict[]=#{verification}&"
|
20
|
-
end
|
21
|
-
end
|
1
|
+
class EasyPost::Address < EasyPost::Resource
|
2
|
+
attr_accessor :message # Backwards compatibility
|
22
3
|
|
23
|
-
|
24
|
-
|
25
|
-
|
4
|
+
def self.create(params={}, api_key=nil)
|
5
|
+
url = self.url
|
6
|
+
|
7
|
+
address = params.reject { |k,_| k == :verify || k == :verify_strict }
|
8
|
+
|
9
|
+
if params[:verify] || params[:verify_strict]
|
10
|
+
verify = params[:verify] || []
|
11
|
+
verify_strict = params[:verify_strict] || []
|
26
12
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
if response.has_key?(:address)
|
34
|
-
if response.has_key?(:message)
|
35
|
-
response[:address][:message] = response[:message]
|
36
|
-
end
|
37
|
-
verified_address = EasyPost::Util::convert_to_easypost_object(response[:address], api_key)
|
38
|
-
return verified_address
|
39
|
-
else
|
40
|
-
raise Error.new("Unable to verify address.")
|
13
|
+
url += "?"
|
14
|
+
verify.each do |verification|
|
15
|
+
url += "verify[]=#{verification}&"
|
16
|
+
end
|
17
|
+
verify_strict.each do |verification|
|
18
|
+
url += "verify_strict[]=#{verification}&"
|
41
19
|
end
|
42
20
|
end
|
43
21
|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
rescue
|
48
|
-
raise Error.new("Unable to verify address.")
|
49
|
-
end
|
22
|
+
response = EasyPost.make_request(:post, url, api_key, {address: address})
|
23
|
+
return EasyPost::Util.convert_to_easypost_object(response, api_key)
|
24
|
+
end
|
50
25
|
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
26
|
+
def self.create_and_verify(params={}, carrier=nil, api_key=nil)
|
27
|
+
wrapped_params = {}
|
28
|
+
wrapped_params[self.class_name().to_sym] = params
|
29
|
+
wrapped_params[:carrier] = carrier
|
30
|
+
response = EasyPost.make_request(:post, url + '/create_and_verify', api_key, wrapped_params)
|
31
|
+
|
32
|
+
if response.has_key?("address")
|
33
|
+
if response.has_key?("message")
|
34
|
+
response["address"]["message"] = response["message"]
|
55
35
|
end
|
36
|
+
verified_address = EasyPost::Util::convert_to_easypost_object(response["address"], api_key)
|
37
|
+
return verified_address
|
38
|
+
else
|
39
|
+
raise EasyPost::Error.new("Unable to verify address.")
|
40
|
+
end
|
41
|
+
end
|
56
42
|
|
57
|
-
|
43
|
+
def verify(params={}, carrier=nil)
|
44
|
+
begin
|
45
|
+
response = EasyPost.make_request(:get, url + '/verify?carrier=' + String(carrier), @api_key, params)
|
46
|
+
rescue
|
47
|
+
raise EasyPost::Error.new("Unable to verify address.")
|
58
48
|
end
|
49
|
+
|
50
|
+
if response.has_key?("address")
|
51
|
+
return EasyPost::Util::convert_to_easypost_object(response["address"], api_key)
|
52
|
+
else
|
53
|
+
raise EasyPost::Error.new("Unable to verify address.")
|
54
|
+
end
|
55
|
+
|
56
|
+
return self
|
59
57
|
end
|
60
58
|
end
|
data/lib/easypost/batch.rb
CHANGED
@@ -1,53 +1,49 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
class EasyPost::Batch < EasyPost::Resource
|
2
|
+
def self.create_and_buy(params={}, api_key=nil)
|
3
|
+
wrapped_params = {}
|
4
|
+
wrapped_params[self.class_name().to_sym] = params
|
5
|
+
response = EasyPost.make_request(:post, url + '/create_and_buy', api_key, wrapped_params)
|
3
6
|
|
4
|
-
|
5
|
-
|
6
|
-
wrapped_params[self.class_name().to_sym] = params
|
7
|
-
response = EasyPost.make_request(:post, url + '/create_and_buy', api_key, wrapped_params)
|
8
|
-
|
9
|
-
return Util.convert_to_easypost_object(response, api_key)
|
10
|
-
end
|
11
|
-
|
12
|
-
def buy(params={})
|
13
|
-
response = EasyPost.make_request(:post, url + '/buy', @api_key, params)
|
14
|
-
self.refresh_from(response, @api_key, true)
|
7
|
+
return EasyPost::Util.convert_to_easypost_object(response, api_key)
|
8
|
+
end
|
15
9
|
|
16
|
-
|
17
|
-
|
10
|
+
def buy(params={})
|
11
|
+
response = EasyPost.make_request(:post, url + '/buy', @api_key, params)
|
12
|
+
self.refresh_from(response, @api_key, true)
|
18
13
|
|
19
|
-
|
20
|
-
|
21
|
-
self.refresh_from(response, @api_key, true)
|
14
|
+
return self
|
15
|
+
end
|
22
16
|
|
23
|
-
|
24
|
-
|
17
|
+
def label(params={})
|
18
|
+
response = EasyPost.make_request(:post, url + '/label', @api_key, params)
|
19
|
+
self.refresh_from(response, @api_key, true)
|
25
20
|
|
26
|
-
|
27
|
-
|
28
|
-
self.refresh_from(response, @api_key, true)
|
21
|
+
return self
|
22
|
+
end
|
29
23
|
|
30
|
-
|
31
|
-
|
24
|
+
def remove_shipments(params={})
|
25
|
+
response = EasyPost.make_request(:post, url + '/remove_shipments', @api_key, params)
|
26
|
+
self.refresh_from(response, @api_key, true)
|
32
27
|
|
33
|
-
|
34
|
-
|
35
|
-
self.refresh_from(response, @api_key, true)
|
28
|
+
return self
|
29
|
+
end
|
36
30
|
|
37
|
-
|
38
|
-
|
31
|
+
def add_shipments(params={})
|
32
|
+
response = EasyPost.make_request(:post, url + '/add_shipments', @api_key, params)
|
33
|
+
self.refresh_from(response, @api_key, true)
|
39
34
|
|
40
|
-
|
41
|
-
|
35
|
+
return self
|
36
|
+
end
|
42
37
|
|
43
|
-
|
44
|
-
|
38
|
+
def stamp_and_barcode_by_reference(params={})
|
39
|
+
response = EasyPost.make_request(:get, url + '/stamp_and_barcode_by_reference', @api_key, params)
|
45
40
|
|
46
|
-
|
47
|
-
|
41
|
+
return response
|
42
|
+
end
|
48
43
|
|
49
|
-
|
50
|
-
|
44
|
+
def create_scan_form(params={})
|
45
|
+
response = EasyPost.make_request(:post, url + '/scan_form', @api_key, params)
|
51
46
|
|
47
|
+
return response
|
52
48
|
end
|
53
49
|
end
|
@@ -1,8 +1,6 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
return Util.convert_to_easypost_object(response, api_key)
|
6
|
-
end
|
1
|
+
class EasyPost::CarrierAccount < EasyPost::Resource
|
2
|
+
def self.types
|
3
|
+
response = EasyPost.make_request(:get, "/carrier_types", @api_key)
|
4
|
+
return EasyPost::Util.convert_to_easypost_object(response, api_key)
|
7
5
|
end
|
8
6
|
end
|
@@ -1,9 +1,5 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
def self.all(filters={}, api_key=nil)
|
5
|
-
raise NotImplementedError.new('CustomsInfo.all not implemented.')
|
6
|
-
end
|
7
|
-
|
1
|
+
class EasyPost::CustomsInfo < EasyPost::Resource
|
2
|
+
def self.all(filters={}, api_key=nil)
|
3
|
+
raise NotImplementedError.new('CustomsInfo.all not implemented.')
|
8
4
|
end
|
9
5
|
end
|
@@ -1,9 +1,5 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
def self.all(filters={}, api_key=nil)
|
5
|
-
raise NotImplementedError.new('CustomsItem.all not implemented.')
|
6
|
-
end
|
7
|
-
|
1
|
+
class EasyPost::CustomsItem < EasyPost::Resource
|
2
|
+
def self.all(filters={}, api_key=nil)
|
3
|
+
raise NotImplementedError.new('CustomsItem.all not implemented.')
|
8
4
|
end
|
9
5
|
end
|
data/lib/easypost/error.rb
CHANGED
@@ -1,33 +1,31 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
attr_reader :errors
|
1
|
+
class EasyPost::Error < StandardError
|
2
|
+
attr_reader :message
|
3
|
+
attr_reader :status
|
4
|
+
attr_reader :http_status # deprecated
|
5
|
+
attr_reader :http_body
|
6
|
+
attr_reader :code
|
7
|
+
attr_reader :errors
|
9
8
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
9
|
+
def initialize(message = nil, status = nil, code = nil, errors = nil, http_body = nil)
|
10
|
+
@message = message
|
11
|
+
@status = status
|
12
|
+
@http_status = status # deprecated
|
13
|
+
@code = code
|
14
|
+
@errors = errors
|
15
|
+
@http_body = http_body
|
17
16
|
|
18
|
-
|
19
|
-
|
17
|
+
super(message)
|
18
|
+
end
|
20
19
|
|
21
|
-
|
22
|
-
|
23
|
-
|
20
|
+
def to_s
|
21
|
+
"#{code} (#{status}): #{message} #{errors}".strip
|
22
|
+
end
|
24
23
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
end
|
24
|
+
def ==(other)
|
25
|
+
other.is_a?(EasyPost::Error) &&
|
26
|
+
message == other.message &&
|
27
|
+
status == other.status &&
|
28
|
+
code == other.code &&
|
29
|
+
errors == other.errors
|
32
30
|
end
|
33
31
|
end
|
data/lib/easypost/event.rb
CHANGED
@@ -1,10 +1,7 @@
|
|
1
1
|
require 'json'
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
def self.receive(values)
|
7
|
-
return EasyPost::Util::convert_to_easypost_object(JSON.parse(values), nil)
|
8
|
-
end
|
3
|
+
class EasyPost::Event < EasyPost::Resource
|
4
|
+
def self.receive(values)
|
5
|
+
return EasyPost::Util::convert_to_easypost_object(JSON.parse(values), nil)
|
9
6
|
end
|
10
7
|
end
|
data/lib/easypost/insurance.rb
CHANGED
data/lib/easypost/item.rb
CHANGED
@@ -1,10 +1,6 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
response = EasyPost.make_request(:get, url + '/retrieve_reference', api_key, params)
|
6
|
-
return EasyPost::Util::convert_to_easypost_object(response, api_key) if response
|
7
|
-
end
|
8
|
-
|
1
|
+
class EasyPost::Item < EasyPost::Resource
|
2
|
+
def self.retrieve_reference(params={}, api_key=nil)
|
3
|
+
response = EasyPost.make_request(:get, url + '/retrieve_reference', api_key, params)
|
4
|
+
return EasyPost::Util::convert_to_easypost_object(response, api_key) if response
|
9
5
|
end
|
10
6
|
end
|
data/lib/easypost/object.rb
CHANGED
@@ -1,146 +1,144 @@
|
|
1
1
|
require "set"
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
end
|
19
|
-
|
20
|
-
def self.construct_from(values, api_key=nil, parent=nil, name=nil)
|
21
|
-
obj = self.new(values[:id], api_key, parent, name)
|
22
|
-
obj.refresh_from(values, api_key)
|
23
|
-
obj
|
24
|
-
end
|
3
|
+
class EasyPost::EasyPostObject
|
4
|
+
include Enumerable
|
5
|
+
|
6
|
+
attr_accessor :parent, :name, :api_key, :unsaved_values
|
7
|
+
@@immutable_values = Set.new([:api_key, :id])
|
8
|
+
|
9
|
+
def initialize(id=nil, api_key=nil, parent=nil, name=nil)
|
10
|
+
@api_key = api_key
|
11
|
+
@values = {}
|
12
|
+
@unsaved_values = Set.new
|
13
|
+
@transient_values = Set.new
|
14
|
+
@parent = parent
|
15
|
+
@name = name
|
16
|
+
self.id = id if id
|
17
|
+
end
|
25
18
|
|
26
|
-
|
27
|
-
|
28
|
-
|
19
|
+
def self.construct_from(values, api_key=nil, parent=nil, name=nil)
|
20
|
+
obj = self.new(values[:id], api_key, parent, name)
|
21
|
+
obj.refresh_from(values, api_key)
|
22
|
+
obj
|
23
|
+
end
|
29
24
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
end
|
25
|
+
def to_s(*args)
|
26
|
+
JSON.dump(@values)
|
27
|
+
end
|
34
28
|
|
35
|
-
|
36
|
-
|
29
|
+
def inspect
|
30
|
+
id_string = (self.respond_to?(:id) && !self.id.nil?) ? " id=#{self.id}" : ""
|
31
|
+
"#<#{self.class}:#{id_string}> JSON: " + to_json
|
32
|
+
end
|
37
33
|
|
38
|
-
|
34
|
+
def refresh_from(values, api_key, partial=false)
|
35
|
+
@api_key = api_key
|
39
36
|
|
40
|
-
|
41
|
-
add_accessors(added)
|
42
|
-
end
|
37
|
+
added = Set.new(values.keys - @values.keys)
|
43
38
|
|
44
|
-
|
45
|
-
|
46
|
-
@transient_values.delete(k)
|
47
|
-
@unsaved_values.delete(k)
|
48
|
-
end
|
39
|
+
instance_eval do
|
40
|
+
add_accessors(added)
|
49
41
|
end
|
50
42
|
|
51
|
-
|
52
|
-
@values[k.to_s]
|
43
|
+
values.each do |k, v|
|
44
|
+
@values[k.to_s] = EasyPost::Util.convert_to_easypost_object(v, api_key, self, k)
|
45
|
+
@transient_values.delete(k)
|
46
|
+
@unsaved_values.delete(k)
|
53
47
|
end
|
48
|
+
end
|
54
49
|
|
55
|
-
|
56
|
-
|
57
|
-
|
50
|
+
def [](k)
|
51
|
+
@values[k.to_s]
|
52
|
+
end
|
58
53
|
|
59
|
-
|
60
|
-
|
61
|
-
|
54
|
+
def []=(k, v)
|
55
|
+
send(:"#{k}=", v)
|
56
|
+
end
|
62
57
|
|
63
|
-
|
64
|
-
|
65
|
-
|
58
|
+
def keys
|
59
|
+
@values.keys
|
60
|
+
end
|
66
61
|
|
67
|
-
|
68
|
-
|
69
|
-
|
62
|
+
def values
|
63
|
+
@values.values
|
64
|
+
end
|
70
65
|
|
71
|
-
|
72
|
-
|
73
|
-
|
66
|
+
def to_json(options = {})
|
67
|
+
JSON.dump(@values)
|
68
|
+
end
|
74
69
|
|
75
|
-
|
76
|
-
|
77
|
-
|
70
|
+
def as_json(options = {})
|
71
|
+
@values.as_json
|
72
|
+
end
|
78
73
|
|
79
|
-
|
80
|
-
|
81
|
-
|
74
|
+
def to_hash
|
75
|
+
@values
|
76
|
+
end
|
82
77
|
|
83
|
-
|
84
|
-
|
85
|
-
|
78
|
+
def each(&blk)
|
79
|
+
@values.each(&blk)
|
80
|
+
end
|
86
81
|
|
87
|
-
|
88
|
-
|
89
|
-
|
82
|
+
def id=(id)
|
83
|
+
@values[:id] = id
|
84
|
+
end
|
85
|
+
|
86
|
+
def id
|
87
|
+
@values[:id]
|
88
|
+
end
|
90
89
|
|
91
|
-
|
90
|
+
protected
|
92
91
|
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
92
|
+
def flatten_unsaved
|
93
|
+
values = {}
|
94
|
+
for key in @unsaved_values
|
95
|
+
value = @values[key]
|
97
96
|
|
98
|
-
|
97
|
+
values[key] = value
|
99
98
|
|
100
|
-
|
101
|
-
|
102
|
-
end
|
99
|
+
if value.is_a?(EasyPost::EasyPostObject)
|
100
|
+
values[key] = flatten_unsaved(value)
|
103
101
|
end
|
104
|
-
|
105
|
-
return values
|
106
102
|
end
|
107
103
|
|
108
|
-
|
109
|
-
|
110
|
-
end
|
104
|
+
return values
|
105
|
+
end
|
111
106
|
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
107
|
+
def metaclass
|
108
|
+
class << self; self; end
|
109
|
+
end
|
110
|
+
|
111
|
+
def remove_accessors(keys)
|
112
|
+
metaclass.instance_eval do
|
113
|
+
keys.each do |k|
|
114
|
+
next if @@immutable_values.include?(k)
|
115
|
+
k_eq = :"#{k}="
|
116
|
+
remove_method(k) if method_defined?(k)
|
117
|
+
remove_method(k_eq) if method_defined?(k_eq)
|
120
118
|
end
|
121
119
|
end
|
120
|
+
end
|
122
121
|
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
end
|
140
|
-
|
141
|
-
cur = cur_parent
|
142
|
-
cur_parent = cur.parent
|
122
|
+
def add_accessors(keys)
|
123
|
+
metaclass.instance_eval do
|
124
|
+
keys.each do |k|
|
125
|
+
next if @@immutable_values.include?(k)
|
126
|
+
k = k.to_s
|
127
|
+
k_eq = :"#{k}="
|
128
|
+
define_method(k) { @values[k] }
|
129
|
+
define_method(k_eq) do |v|
|
130
|
+
@values[k] = v
|
131
|
+
@unsaved_values.add(k)
|
132
|
+
|
133
|
+
cur = self
|
134
|
+
cur_parent = self.parent
|
135
|
+
while cur_parent
|
136
|
+
if cur.name
|
137
|
+
cur_parent.unsaved_values.add(cur.name)
|
143
138
|
end
|
139
|
+
|
140
|
+
cur = cur_parent
|
141
|
+
cur_parent = cur.parent
|
144
142
|
end
|
145
143
|
end
|
146
144
|
end
|