gobl 0.1.2 → 0.2.0
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/lib/ext/hashme.rb +28 -0
- data/lib/gobl/bill/advances.rb +1 -77
- data/lib/gobl/bill/charge.rb +11 -65
- data/lib/gobl/bill/delivery.rb +5 -47
- data/lib/gobl/bill/discount.rb +11 -65
- data/lib/gobl/bill/exchange_rates.rb +1 -77
- data/lib/gobl/bill/invoice.rb +28 -104
- data/lib/gobl/bill/invoice_type.rb +3 -134
- data/lib/gobl/bill/line.rb +13 -65
- data/lib/gobl/bill/line_charge.rb +5 -47
- data/lib/gobl/bill/line_discount.rb +5 -47
- data/lib/gobl/bill/ordering.rb +2 -38
- data/lib/gobl/bill/outlay.rb +11 -59
- data/lib/gobl/bill/payment.rb +5 -47
- data/lib/gobl/bill/preceding.rb +12 -62
- data/lib/gobl/bill/scheme_keys.rb +1 -77
- data/lib/gobl/bill/tax.rb +4 -44
- data/lib/gobl/bill/totals.rb +17 -71
- data/lib/gobl/cal/date.rb +1 -90
- data/lib/gobl/cal/period.rb +5 -41
- data/lib/gobl/currency/code.rb +3 -134
- data/lib/gobl/currency/exchange_rate.rb +5 -41
- data/lib/gobl/document.rb +1 -58
- data/lib/gobl/dsig/digest.rb +5 -41
- data/lib/gobl/dsig/signature.rb +1 -90
- data/lib/gobl/enum.rb +81 -0
- data/lib/gobl/envelope.rb +9 -48
- data/lib/gobl/header.rb +10 -56
- data/lib/gobl/i18n/string.rb +1 -58
- data/lib/gobl/l10n/code.rb +1 -90
- data/lib/gobl/l10n/country_code.rb +3 -134
- data/lib/gobl/map.rb +62 -0
- data/lib/gobl/note/message.rb +5 -44
- data/lib/gobl/num/amount.rb +6 -35
- data/lib/gobl/object.rb +21 -0
- data/lib/gobl/operations.rb +3 -3
- data/lib/gobl/org/address.rb +18 -80
- data/lib/gobl/org/code.rb +1 -90
- data/lib/gobl/org/coordinates.rb +5 -47
- data/lib/gobl/org/email.rb +6 -47
- data/lib/gobl/org/inbox.rb +8 -50
- data/lib/gobl/org/item.rb +13 -65
- data/lib/gobl/org/item_code.rb +4 -41
- data/lib/gobl/org/key.rb +1 -90
- data/lib/gobl/org/meta.rb +1 -58
- data/lib/gobl/org/name.rb +12 -62
- data/lib/gobl/org/note.rb +6 -47
- data/lib/gobl/org/note_key.rb +3 -134
- data/lib/gobl/org/party.rb +14 -71
- data/lib/gobl/org/person.rb +9 -56
- data/lib/gobl/org/registration.rb +9 -59
- data/lib/gobl/org/source_key.rb +3 -134
- data/lib/gobl/org/tax_identity.rb +8 -53
- data/lib/gobl/org/telephone.rb +5 -44
- data/lib/gobl/org/unit.rb +1 -136
- data/lib/gobl/pay/advance.rb +11 -59
- data/lib/gobl/pay/card.rb +5 -41
- data/lib/gobl/pay/credit_transfer.rb +6 -50
- data/lib/gobl/pay/direct_debit.rb +4 -44
- data/lib/gobl/pay/due_date.rb +8 -50
- data/lib/gobl/pay/instructions.rb +11 -62
- data/lib/gobl/pay/method_key.rb +3 -134
- data/lib/gobl/pay/online.rb +4 -41
- data/lib/gobl/pay/term_key.rb +3 -134
- data/lib/gobl/pay/terms.rb +6 -47
- data/lib/gobl/stamp.rb +5 -41
- data/lib/gobl/struct.rb +15 -15
- data/lib/gobl/tax/category.rb +9 -50
- data/lib/gobl/tax/category_total.rb +11 -53
- data/lib/gobl/tax/combo.rb +6 -47
- data/lib/gobl/tax/localities.rb +1 -77
- data/lib/gobl/tax/locality.rb +6 -44
- data/lib/gobl/tax/rate.rb +8 -47
- data/lib/gobl/tax/rate_total.rb +9 -50
- data/lib/gobl/tax/rate_total_surcharge.rb +5 -41
- data/lib/gobl/tax/rate_value.rb +6 -47
- data/lib/gobl/tax/region.rb +12 -56
- data/lib/gobl/tax/scheme.rb +8 -50
- data/lib/gobl/tax/schemes.rb +1 -77
- data/lib/gobl/tax/set.rb +1 -77
- data/lib/gobl/tax/total.rb +4 -41
- data/lib/gobl/uuid/uuid.rb +1 -90
- data/lib/gobl/value.rb +58 -0
- data/lib/gobl/version.rb +1 -1
- data/lib/gobl.rb +3 -1
- data/lib/gobl_extensions/document_helper.rb +3 -3
- data/lib/gobl_extensions/envelope_helper.rb +5 -0
- data/lib/gobl_extensions/i18n/value_keys_helper.rb +3 -3
- data/lib/gobl_extensions/tax/region_helper.rb +3 -9
- metadata +11 -36
- data/home/cavalle/workspace/invopop/gobl.ruby/gobl.gemspec +0 -30
- data/lib/gobl/types.rb +0 -17
data/lib/gobl/envelope.rb
CHANGED
@@ -8,70 +8,31 @@
|
|
8
8
|
|
9
9
|
module GOBL
|
10
10
|
# Envelope wraps around a gobl document and provides support for digest creation and digital signatures.
|
11
|
-
class Envelope < GOBL::
|
11
|
+
class Envelope < GOBL::Object
|
12
12
|
# The Schema ID of the GOBL Envelope structure
|
13
13
|
SCHEMA_ID = 'https://gobl.org/draft-0/envelope'
|
14
14
|
|
15
|
-
# @!attribute [r] schema
|
15
|
+
# @!attribute [r] $schema
|
16
16
|
# Schema identifies the schema that should be used to understand this document
|
17
17
|
# @return [String]
|
18
|
-
|
18
|
+
property :$schema, String
|
19
|
+
validates :$schema, presence: true
|
19
20
|
|
20
21
|
# @!attribute [r] head
|
21
22
|
# Details on what the contents are
|
22
23
|
# @return [Header]
|
23
|
-
|
24
|
+
property :head, Header
|
25
|
+
validates :head, presence: true
|
24
26
|
|
25
27
|
# @!attribute [r] doc
|
26
28
|
# The data inside the envelope
|
27
29
|
# @return [Document]
|
28
|
-
|
30
|
+
property :doc, Document
|
31
|
+
validates :doc, presence: true
|
29
32
|
|
30
33
|
# @!attribute [r] sigs
|
31
34
|
# JSON Web Signatures of the header
|
32
35
|
# @return [Array<GOBL::DSig::Signature>]
|
33
|
-
|
34
|
-
|
35
|
-
# Creates a new object from a hash of GOBL data
|
36
|
-
#
|
37
|
-
# @param data [Hash] a hash of GOBL data
|
38
|
-
#
|
39
|
-
# @return [Envelope] the object created from the given data
|
40
|
-
def self.from_gobl!(data)
|
41
|
-
data = GOBL::Types::Hash[data]
|
42
|
-
|
43
|
-
new(
|
44
|
-
schema: data['$schema'],
|
45
|
-
head: Header.from_gobl!(data['head']),
|
46
|
-
doc: Document.from_gobl!(data['doc']),
|
47
|
-
sigs: data['sigs']&.map { |item| GOBL::DSig::Signature.from_gobl!(item) }
|
48
|
-
)
|
49
|
-
end
|
50
|
-
|
51
|
-
# Returns a hash of GOBL data representing the current object
|
52
|
-
#
|
53
|
-
# @return [Hash] the array of GOBL data that represents the current object
|
54
|
-
def to_gobl
|
55
|
-
{
|
56
|
-
'$schema' => attributes[:schema],
|
57
|
-
'head' => attributes[:head]&.to_gobl,
|
58
|
-
'doc' => attributes[:doc]&.to_gobl,
|
59
|
-
'sigs' => attributes[:sigs]&.map { |item| item&.to_gobl }
|
60
|
-
}.compact
|
61
|
-
end
|
62
|
-
|
63
|
-
# @!method self.new(attrs)
|
64
|
-
#
|
65
|
-
# Returns a {Envelope} object from a given hash of attributes. Nested
|
66
|
-
# attributes are supported: the constructor will instantiate the proper GOBL
|
67
|
-
# objects when nested hashes or arrays are given as part of the `attrs`
|
68
|
-
# parameter.
|
69
|
-
#
|
70
|
-
# The `new` method will only allow to create a new object if all attributes
|
71
|
-
# marked as mandatory and not calculated in the JSON schema are provided.
|
72
|
-
#
|
73
|
-
# @param attrs [Hash] the hash of attributes
|
74
|
-
#
|
75
|
-
# @return [Envelope] the object corresponding to the given input
|
36
|
+
property :sigs, [GOBL::DSig::Signature]
|
76
37
|
end
|
77
38
|
end
|
data/lib/gobl/header.rb
CHANGED
@@ -8,91 +8,45 @@
|
|
8
8
|
|
9
9
|
module GOBL
|
10
10
|
# Header defines the meta data of the body.
|
11
|
-
class Header < GOBL::
|
11
|
+
class Header < GOBL::Object
|
12
12
|
# The Schema ID of the GOBL Header structure
|
13
13
|
SCHEMA_ID = 'https://gobl.org/draft-0/envelope#/$defs/Header'
|
14
14
|
|
15
15
|
# @!attribute [r] uuid
|
16
16
|
# Unique UUIDv1 identifier for the envelope.
|
17
17
|
# @return [GOBL::UUID::UUID]
|
18
|
-
|
18
|
+
property :uuid, GOBL::UUID::UUID
|
19
|
+
validates :uuid, presence: true
|
19
20
|
|
20
21
|
# @!attribute [r] dig
|
21
22
|
# Digest of the canonical JSON body.
|
22
23
|
# @return [GOBL::DSig::Digest]
|
23
|
-
|
24
|
+
property :dig, GOBL::DSig::Digest
|
25
|
+
validates :dig, presence: true
|
24
26
|
|
25
27
|
# @!attribute [r] stamps
|
26
28
|
# Seals of approval from other organisations.
|
27
29
|
# @return [Array<Stamp>]
|
28
|
-
|
30
|
+
property :stamps, [Stamp]
|
29
31
|
|
30
32
|
# @!attribute [r] tags
|
31
33
|
# Set of labels that describe but have no influence on the data.
|
32
34
|
# @return [Array<String>]
|
33
|
-
|
35
|
+
property :tags, [String]
|
34
36
|
|
35
37
|
# @!attribute [r] meta
|
36
38
|
# Additional semi-structured information about this envelope.
|
37
39
|
# @return [GOBL::Org::Meta]
|
38
|
-
|
40
|
+
property :meta, GOBL::Org::Meta
|
39
41
|
|
40
42
|
# @!attribute [r] notes
|
41
43
|
# Any information that may be relevant to other humans about this envelope
|
42
44
|
# @return [String]
|
43
|
-
|
45
|
+
property :notes, String
|
44
46
|
|
45
47
|
# @!attribute [r] draft
|
46
48
|
# When true, implies that this document should not be considered final. Digital signatures are optional.
|
47
49
|
# @return [Boolean]
|
48
|
-
|
49
|
-
|
50
|
-
# Creates a new object from a hash of GOBL data
|
51
|
-
#
|
52
|
-
# @param data [Hash] a hash of GOBL data
|
53
|
-
#
|
54
|
-
# @return [Header] the object created from the given data
|
55
|
-
def self.from_gobl!(data)
|
56
|
-
data = GOBL::Types::Hash[data]
|
57
|
-
|
58
|
-
new(
|
59
|
-
uuid: GOBL::UUID::UUID.from_gobl!(data['uuid']),
|
60
|
-
dig: GOBL::DSig::Digest.from_gobl!(data['dig']),
|
61
|
-
stamps: data['stamps']&.map { |item| Stamp.from_gobl!(item) },
|
62
|
-
tags: data['tags']&.map { |item| item },
|
63
|
-
meta: data['meta'] ? GOBL::Org::Meta.from_gobl!(data['meta']) : nil,
|
64
|
-
notes: data['notes'],
|
65
|
-
draft: data['draft']
|
66
|
-
)
|
67
|
-
end
|
68
|
-
|
69
|
-
# Returns a hash of GOBL data representing the current object
|
70
|
-
#
|
71
|
-
# @return [Hash] the array of GOBL data that represents the current object
|
72
|
-
def to_gobl
|
73
|
-
{
|
74
|
-
'uuid' => attributes[:uuid]&.to_gobl,
|
75
|
-
'dig' => attributes[:dig]&.to_gobl,
|
76
|
-
'stamps' => attributes[:stamps]&.map { |item| item&.to_gobl },
|
77
|
-
'tags' => attributes[:tags]&.map { |item| item },
|
78
|
-
'meta' => attributes[:meta]&.to_gobl,
|
79
|
-
'notes' => attributes[:notes],
|
80
|
-
'draft' => attributes[:draft]
|
81
|
-
}.compact
|
82
|
-
end
|
83
|
-
|
84
|
-
# @!method self.new(attrs)
|
85
|
-
#
|
86
|
-
# Returns a {Header} object from a given hash of attributes. Nested
|
87
|
-
# attributes are supported: the constructor will instantiate the proper GOBL
|
88
|
-
# objects when nested hashes or arrays are given as part of the `attrs`
|
89
|
-
# parameter.
|
90
|
-
#
|
91
|
-
# The `new` method will only allow to create a new object if all attributes
|
92
|
-
# marked as mandatory and not calculated in the JSON schema are provided.
|
93
|
-
#
|
94
|
-
# @param attrs [Hash] the hash of attributes
|
95
|
-
#
|
96
|
-
# @return [Header] the object corresponding to the given input
|
50
|
+
property :draft, Boolean
|
97
51
|
end
|
98
52
|
end
|
data/lib/gobl/i18n/string.rb
CHANGED
@@ -9,64 +9,7 @@
|
|
9
9
|
module GOBL
|
10
10
|
module I18n
|
11
11
|
# Map of 2-Letter language codes to their translations.
|
12
|
-
class String < GOBL::
|
13
|
-
extend Forwardable
|
14
|
-
include Enumerable
|
15
|
-
|
16
|
-
# The Schema ID of the GOBL String structure
|
17
|
-
SCHEMA_ID = 'https://gobl.org/draft-0/i18n/string'
|
18
|
-
|
19
|
-
attribute :_value, GOBL::Types::Hash
|
20
|
-
|
21
|
-
# @!method [](key)
|
22
|
-
# Returns the value associated with the given key
|
23
|
-
# @param key [Object] the key
|
24
|
-
# @return [Object] the value associated with the given key
|
25
|
-
#
|
26
|
-
# @!method each
|
27
|
-
# Iterates over each key-value pair in the map
|
28
|
-
# @overload each(&block)
|
29
|
-
# Calls the given block with each key-value pair in the map
|
30
|
-
# @yield [key, value] a key-value pair of the map
|
31
|
-
# @return [self] the object itself
|
32
|
-
# @overload each
|
33
|
-
# Returns an Enumerator that iterates over the key-value pairs in the map
|
34
|
-
# @return [Enumerator] the enumerator of the key-value pairs
|
35
|
-
#
|
36
|
-
# @!method empty?
|
37
|
-
# Returns `true` if the number of entires in the map is zero, `false` otherwise.
|
38
|
-
# @return [Boolean] whether the map is empty or not
|
39
|
-
#
|
40
|
-
# @!method length
|
41
|
-
# Returns the number of entries in the map
|
42
|
-
# @return [Integer] the number of entries in the map
|
43
|
-
#
|
44
|
-
# @!method each_key
|
45
|
-
# Iterates over each key in the map
|
46
|
-
# @overload each(&block)
|
47
|
-
# Calls the given block with each key in the map
|
48
|
-
# @yield [key] a key of the map
|
49
|
-
# @return [self] the object itself
|
50
|
-
# @overload each
|
51
|
-
# Returns an Enumerator that iterates over the keys in the map
|
52
|
-
# @return [Enumerator] the enumerator of the keys
|
53
|
-
def_delegators :_value, :[], :each, :empty?, :length, :each_key
|
54
|
-
|
55
|
-
# Creates a new object from a hash of GOBL data
|
56
|
-
#
|
57
|
-
# @param data [Hash] a hash of GOBL data
|
58
|
-
#
|
59
|
-
# @return [String] the object created from the given data
|
60
|
-
def self.from_gobl!(data)
|
61
|
-
new(_value: data)
|
62
|
-
end
|
63
|
-
|
64
|
-
# Returns a hash of GOBL data representing the current object
|
65
|
-
#
|
66
|
-
# @return [Hash] the hash of GOBL data that represents the current object
|
67
|
-
def to_gobl
|
68
|
-
_value
|
69
|
-
end
|
12
|
+
class String < GOBL::Map
|
70
13
|
end
|
71
14
|
end
|
72
15
|
end
|
data/lib/gobl/l10n/code.rb
CHANGED
@@ -9,98 +9,9 @@
|
|
9
9
|
module GOBL
|
10
10
|
module L10n
|
11
11
|
# Code is used for short identifies like country or state codes.
|
12
|
-
class Code < GOBL::
|
12
|
+
class Code < GOBL::Value
|
13
13
|
# The Schema ID of the GOBL Code structure
|
14
14
|
SCHEMA_ID = 'https://gobl.org/draft-0/l10n/code'
|
15
|
-
|
16
|
-
attribute :_value, GOBL::Types::String
|
17
|
-
private :_value
|
18
|
-
|
19
|
-
# Creates a new object from a GOBL value
|
20
|
-
#
|
21
|
-
# @param data [String] the GOBL value
|
22
|
-
#
|
23
|
-
# @return [Code] the object created from the given data
|
24
|
-
def self.from_gobl!(data)
|
25
|
-
new(_value: data)
|
26
|
-
end
|
27
|
-
|
28
|
-
# Returns a GOBL value representing the current object
|
29
|
-
#
|
30
|
-
# @return [String] the GOBL value that represents the current object
|
31
|
-
def to_gobl
|
32
|
-
_value
|
33
|
-
end
|
34
|
-
|
35
|
-
# Returns a {Code} that corresponds to a given object. The object can be a
|
36
|
-
# `Symbol`, a `String` or anything coercible into one (via `#to_s`).
|
37
|
-
#
|
38
|
-
# @param object [Symbol, String, #to_s] the value of the object.
|
39
|
-
#
|
40
|
-
# @return [Code] the object corresponding to the given value.
|
41
|
-
#
|
42
|
-
# @example Instantiating from a symbol
|
43
|
-
# code = GOBL::L10n::Code.new(:value)
|
44
|
-
#
|
45
|
-
# @example Instantiating from a string
|
46
|
-
# code = GOBL::L10n::Code.new('value')
|
47
|
-
def self.new(object)
|
48
|
-
case object
|
49
|
-
when Hash, self # internal use, not to be used in public calls
|
50
|
-
super
|
51
|
-
when Symbol
|
52
|
-
new object.to_s
|
53
|
-
else
|
54
|
-
super _value: object.to_s
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
|
-
# Returns the string representation of the current object
|
59
|
-
#
|
60
|
-
# @return [String] the string representation of the current object
|
61
|
-
def to_s
|
62
|
-
_value.to_s
|
63
|
-
end
|
64
|
-
|
65
|
-
# Returns the symbol representation of the current object
|
66
|
-
#
|
67
|
-
# @return [Symbol] the symbol representation of the current object
|
68
|
-
def to_sym
|
69
|
-
to_s.parameterize.underscore.to_sym
|
70
|
-
end
|
71
|
-
|
72
|
-
# Returns whether the current object is equivalent to a given one. In addition
|
73
|
-
# to {Code} objects, the current object can be compared to a `Symbol`, a
|
74
|
-
# `String` or anything coercible into one (via `#to_s`)
|
75
|
-
#
|
76
|
-
# @param other [Code, Symbol, String, #to_s] the other object to compare to
|
77
|
-
#
|
78
|
-
# @return [Boolean] `true` if the objects are equivalent, `false` otherwise
|
79
|
-
#
|
80
|
-
# @example Comparing to another {Code} object
|
81
|
-
# code = GOBL::L10n::Code.new('value')
|
82
|
-
# code == GOBL::L10n::Code.new('value') #=> true
|
83
|
-
# code == GOBL::L10n::Code.new('other') #=> false
|
84
|
-
#
|
85
|
-
# @example Comparing to a string
|
86
|
-
# code = GOBL::L10n::Code.new('value')
|
87
|
-
# code == 'value' #=> true
|
88
|
-
# code == 'other' #=> false
|
89
|
-
#
|
90
|
-
# @example Comparing to a symbol
|
91
|
-
# code = GOBL::L10n::Code.new('value')
|
92
|
-
# code == :value #=> true
|
93
|
-
# code == :other #=> false
|
94
|
-
def ==(other)
|
95
|
-
case other
|
96
|
-
when self.class
|
97
|
-
super
|
98
|
-
when Symbol
|
99
|
-
to_sym == other
|
100
|
-
else
|
101
|
-
to_s == other.to_s
|
102
|
-
end
|
103
|
-
end
|
104
15
|
end
|
105
16
|
end
|
106
17
|
end
|
@@ -9,7 +9,7 @@
|
|
9
9
|
module GOBL
|
10
10
|
module L10n
|
11
11
|
# Defines an ISO 3166-2 country code
|
12
|
-
class CountryCode < GOBL::
|
12
|
+
class CountryCode < GOBL::Enum
|
13
13
|
# The Schema ID of the GOBL CountryCode structure
|
14
14
|
SCHEMA_ID = 'https://gobl.org/draft-0/l10n/country-code'
|
15
15
|
|
@@ -266,139 +266,8 @@ module GOBL
|
|
266
266
|
'ZW' => 'Zimbabwe'
|
267
267
|
}.freeze
|
268
268
|
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
# Creates a new object from a GOBL value
|
273
|
-
#
|
274
|
-
# @param data [String] the GOBL value
|
275
|
-
#
|
276
|
-
# @return [CountryCode] the object created from the given data
|
277
|
-
def self.from_gobl!(data)
|
278
|
-
new(_value: data)
|
279
|
-
end
|
280
|
-
|
281
|
-
# Returns a GOBL value representing the current object
|
282
|
-
#
|
283
|
-
# @return [String] the GOBL value that represents the current object
|
284
|
-
def to_gobl
|
285
|
-
_value
|
286
|
-
end
|
287
|
-
|
288
|
-
# Returns a {CountryCode} that corresponds to a given object. The object can be a
|
289
|
-
# `Symbol`, a `String` or anything coercible into one (via `#to_s`).
|
290
|
-
#
|
291
|
-
# @param object [Symbol, String, #to_s] the value of the object.
|
292
|
-
#
|
293
|
-
# @return [CountryCode] the object corresponding to the given value.
|
294
|
-
#
|
295
|
-
# @example Instantiating from a symbol
|
296
|
-
# country_code = GOBL::L10n::CountryCode.new(:af)
|
297
|
-
#
|
298
|
-
# @example Instantiating from a string
|
299
|
-
# country_code = GOBL::L10n::CountryCode.new('AF')
|
300
|
-
def self.new(object)
|
301
|
-
case object
|
302
|
-
when Hash, self # internal use, not to be used in public calls
|
303
|
-
super
|
304
|
-
when Symbol
|
305
|
-
new find_by_sym(object)
|
306
|
-
else
|
307
|
-
super _value: object.to_s
|
308
|
-
end
|
309
|
-
end
|
310
|
-
|
311
|
-
# Returns the string representation of the current object
|
312
|
-
#
|
313
|
-
# @return [String] the string representation of the current object
|
314
|
-
def to_s
|
315
|
-
_value.to_s
|
316
|
-
end
|
317
|
-
|
318
|
-
# Returns the symbol representation of the current object
|
319
|
-
#
|
320
|
-
# @return [Symbol] the symbol representation of the current object
|
321
|
-
def to_sym
|
322
|
-
to_s.parameterize.underscore.to_sym
|
323
|
-
end
|
324
|
-
|
325
|
-
# Returns whether the current object is equivalent to a given one. In addition
|
326
|
-
# to {CountryCode} objects, the current object can be compared to a `Symbol`, a
|
327
|
-
# `String` or anything coercible into one (via `#to_s`)
|
328
|
-
#
|
329
|
-
# @param other [CountryCode, Symbol, String, #to_s] the other object to compare to
|
330
|
-
#
|
331
|
-
# @return [Boolean] `true` if the objects are equivalent, `false` otherwise
|
332
|
-
#
|
333
|
-
# @example Comparing to another {CountryCode} object
|
334
|
-
# country_code = GOBL::L10n::CountryCode.new('AF')
|
335
|
-
# country_code == GOBL::L10n::CountryCode.new('AF') #=> true
|
336
|
-
# country_code == GOBL::L10n::CountryCode.new('AX') #=> false
|
337
|
-
#
|
338
|
-
# @example Comparing to a string
|
339
|
-
# country_code = GOBL::L10n::CountryCode.new('AF')
|
340
|
-
# country_code == 'AF' #=> true
|
341
|
-
# country_code == 'AX' #=> false
|
342
|
-
#
|
343
|
-
# @example Comparing to a symbol
|
344
|
-
# country_code = GOBL::L10n::CountryCode.new('AF')
|
345
|
-
# country_code == :af #=> true
|
346
|
-
# country_code == :ax #=> false
|
347
|
-
def ==(other)
|
348
|
-
case other
|
349
|
-
when self.class
|
350
|
-
super
|
351
|
-
when Symbol
|
352
|
-
to_sym == other
|
353
|
-
else
|
354
|
-
to_s == other.to_s
|
355
|
-
end
|
356
|
-
end
|
357
|
-
|
358
|
-
# Returns an array with all the enumerated objects of this type
|
359
|
-
#
|
360
|
-
# @return [Array<CountryCode>] the array of enumerated objects
|
361
|
-
def self.all
|
362
|
-
ENUM.keys.map { |key| new(key) }
|
363
|
-
end
|
364
|
-
|
365
|
-
# @api private
|
366
|
-
def self.find_by_sym(sym)
|
367
|
-
all.find { |object| object.to_sym == sym }
|
368
|
-
end
|
369
|
-
|
370
|
-
# @api private
|
371
|
-
def self.find_by_inquirer(method_name)
|
372
|
-
method_name =~ /(.+)\?$/ && find_by_sym(Regexp.last_match(1).to_sym)
|
373
|
-
end
|
374
|
-
|
375
|
-
# Returns the description of the current object
|
376
|
-
#
|
377
|
-
# @return [String] the description of the current object
|
378
|
-
def description
|
379
|
-
ENUM.fetch(_value, _value)
|
380
|
-
end
|
381
|
-
|
382
|
-
# @api private
|
383
|
-
def respond_to_missing?(method_name, include_private = false)
|
384
|
-
self.class.find_by_inquirer(method_name) || super
|
385
|
-
end
|
386
|
-
|
387
|
-
# Enables dynamic value inquirers like `CountryCode#af?` for
|
388
|
-
# each of the declared enum values (see {ENUM}). Each inquirer returns a
|
389
|
-
# `Boolean` denoting whether the value equals the enquired value (`true`) or
|
390
|
-
# not (`false`)
|
391
|
-
#
|
392
|
-
# @example
|
393
|
-
# country_code = GOBL::L10n::CountryCode.new('AF')
|
394
|
-
# country_code.af? # => true
|
395
|
-
# country_code.ax? # => false
|
396
|
-
def method_missing(method_name, *args, &block)
|
397
|
-
if value = self.class.find_by_inquirer(method_name)
|
398
|
-
self == value
|
399
|
-
else
|
400
|
-
super
|
401
|
-
end
|
269
|
+
def strict_enum?
|
270
|
+
true
|
402
271
|
end
|
403
272
|
end
|
404
273
|
end
|
data/lib/gobl/map.rb
ADDED
@@ -0,0 +1,62 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module GOBL
|
4
|
+
# Base class for map structures in the GOBL Schema. A map is an unconstrained list of
|
5
|
+
# keys and values
|
6
|
+
class Map < Struct
|
7
|
+
extend Forwardable
|
8
|
+
include Enumerable
|
9
|
+
|
10
|
+
# @api private
|
11
|
+
attr_accessor :_map
|
12
|
+
|
13
|
+
# Initializes a new map struct that corresponds to a given Hash
|
14
|
+
#
|
15
|
+
# @param map [Hash] the hash with the map data
|
16
|
+
#
|
17
|
+
# @return [Map] a new map object
|
18
|
+
def initialize(map)
|
19
|
+
super()
|
20
|
+
self._map = map
|
21
|
+
end
|
22
|
+
|
23
|
+
# @api private
|
24
|
+
def as_json(...)
|
25
|
+
_map.as_json(...)
|
26
|
+
end
|
27
|
+
|
28
|
+
# @!method [](key)
|
29
|
+
# Returns the value associated with the given key
|
30
|
+
# @param key [Object] the key
|
31
|
+
# @return [Object] the value associated with the given key
|
32
|
+
#
|
33
|
+
# @!method each
|
34
|
+
# Iterates over each key-value pair in the map
|
35
|
+
# @overload each(&block)
|
36
|
+
# Calls the given block with each key-value pair in the map
|
37
|
+
# @yield [key, value] a key-value pair of the map
|
38
|
+
# @return [self] the object itself
|
39
|
+
# @overload each
|
40
|
+
# Returns an Enumerator that iterates over the key-value pairs in the map
|
41
|
+
# @return [Enumerator] the enumerator of the key-value pairs
|
42
|
+
#
|
43
|
+
# @!method empty?
|
44
|
+
# Returns `true` if the number of entires in the map is zero, `false` otherwise.
|
45
|
+
# @return [Boolean] whether the map is empty or not
|
46
|
+
#
|
47
|
+
# @!method length
|
48
|
+
# Returns the number of entries in the map
|
49
|
+
# @return [Integer] the number of entries in the map
|
50
|
+
#
|
51
|
+
# @!method each_key
|
52
|
+
# Iterates over each key in the map
|
53
|
+
# @overload each(&block)
|
54
|
+
# Calls the given block with each key in the map
|
55
|
+
# @yield [key] a key of the map
|
56
|
+
# @return [self] the object itself
|
57
|
+
# @overload each
|
58
|
+
# Returns an Enumerator that iterates over the keys in the map
|
59
|
+
# @return [Enumerator] the enumerator of the keys
|
60
|
+
def_delegators :_map, :[], :each, :empty?, :length, :each_key
|
61
|
+
end
|
62
|
+
end
|
data/lib/gobl/note/message.rb
CHANGED
@@ -9,64 +9,25 @@
|
|
9
9
|
module GOBL
|
10
10
|
module Note
|
11
11
|
# Message represents the minimum possible contents for a GoBL document type.
|
12
|
-
class Message < GOBL::
|
12
|
+
class Message < GOBL::Object
|
13
13
|
# The Schema ID of the GOBL Message structure
|
14
14
|
SCHEMA_ID = 'https://gobl.org/draft-0/note/message'
|
15
15
|
|
16
16
|
# @!attribute [r] title
|
17
17
|
# Summary of the message content
|
18
18
|
# @return [String]
|
19
|
-
|
19
|
+
property :title, String
|
20
20
|
|
21
21
|
# @!attribute [r] content
|
22
22
|
# Details of what exactly this message wants to communicate
|
23
23
|
# @return [String]
|
24
|
-
|
24
|
+
property :content, String
|
25
|
+
validates :content, presence: true
|
25
26
|
|
26
27
|
# @!attribute [r] meta
|
27
28
|
# Any additional semi-structured data that might be useful.
|
28
29
|
# @return [GOBL::Org::Meta]
|
29
|
-
|
30
|
-
|
31
|
-
# Creates a new object from a hash of GOBL data
|
32
|
-
#
|
33
|
-
# @param data [Hash] a hash of GOBL data
|
34
|
-
#
|
35
|
-
# @return [Message] the object created from the given data
|
36
|
-
def self.from_gobl!(data)
|
37
|
-
data = GOBL::Types::Hash[data]
|
38
|
-
|
39
|
-
new(
|
40
|
-
title: data['title'],
|
41
|
-
content: data['content'],
|
42
|
-
meta: data['meta'] ? GOBL::Org::Meta.from_gobl!(data['meta']) : nil
|
43
|
-
)
|
44
|
-
end
|
45
|
-
|
46
|
-
# Returns a hash of GOBL data representing the current object
|
47
|
-
#
|
48
|
-
# @return [Hash] the array of GOBL data that represents the current object
|
49
|
-
def to_gobl
|
50
|
-
{
|
51
|
-
'title' => attributes[:title],
|
52
|
-
'content' => attributes[:content],
|
53
|
-
'meta' => attributes[:meta]&.to_gobl
|
54
|
-
}.compact
|
55
|
-
end
|
56
|
-
|
57
|
-
# @!method self.new(attrs)
|
58
|
-
#
|
59
|
-
# Returns a {Message} object from a given hash of attributes. Nested
|
60
|
-
# attributes are supported: the constructor will instantiate the proper GOBL
|
61
|
-
# objects when nested hashes or arrays are given as part of the `attrs`
|
62
|
-
# parameter.
|
63
|
-
#
|
64
|
-
# The `new` method will only allow to create a new object if all attributes
|
65
|
-
# marked as mandatory and not calculated in the JSON schema are provided.
|
66
|
-
#
|
67
|
-
# @param attrs [Hash] the hash of attributes
|
68
|
-
#
|
69
|
-
# @return [Message] the object corresponding to the given input
|
30
|
+
property :meta, GOBL::Org::Meta
|
70
31
|
end
|
71
32
|
end
|
72
33
|
end
|
data/lib/gobl/num/amount.rb
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
module GOBL
|
4
4
|
module Num
|
5
5
|
# Represents a numeric quantity with optional decimal places that determine accuracy
|
6
|
-
class Amount
|
6
|
+
class Amount < GOBL::Struct
|
7
7
|
# The integer value of the amount
|
8
8
|
attr_reader :value
|
9
9
|
|
@@ -33,40 +33,6 @@ module GOBL
|
|
33
33
|
end
|
34
34
|
end
|
35
35
|
|
36
|
-
# Creates a new {Amount} from a GOBL value
|
37
|
-
#
|
38
|
-
# @param data [Hash] a GOBL value
|
39
|
-
#
|
40
|
-
# @return [Amount] the object created from the given data
|
41
|
-
def self.from_gobl!(data)
|
42
|
-
new(data)
|
43
|
-
end
|
44
|
-
|
45
|
-
# Deserializes an {Amount} from a JSON string
|
46
|
-
#
|
47
|
-
# @param json [String] a JSON string
|
48
|
-
#
|
49
|
-
# @return [Amount] the deserialized {Amount}
|
50
|
-
def self.from_json!(json)
|
51
|
-
from_gobl!(JSON.parse(json))
|
52
|
-
end
|
53
|
-
|
54
|
-
# Returns a GOBL value representing the current amount
|
55
|
-
#
|
56
|
-
# @return [String] the GOBL value that represents the current amount
|
57
|
-
def to_gobl
|
58
|
-
to_s
|
59
|
-
end
|
60
|
-
|
61
|
-
# Serializes a GOBL struct into a JSON string
|
62
|
-
#
|
63
|
-
# @param options [#to_h] a Hash-like object to pass to `JSON.generate`
|
64
|
-
#
|
65
|
-
# @return [GOBL::Struct] the JSON string representing the GOBL struct
|
66
|
-
def to_json(options = nil)
|
67
|
-
JSON.generate(to_gobl, options)
|
68
|
-
end
|
69
|
-
|
70
36
|
# Returns the string representation of the current amount
|
71
37
|
#
|
72
38
|
# @return [String] the string representation of the current amount
|
@@ -222,6 +188,11 @@ module GOBL
|
|
222
188
|
self.class.new(value: -value, exp: exp)
|
223
189
|
end
|
224
190
|
|
191
|
+
# @api private
|
192
|
+
def as_json(*)
|
193
|
+
to_s
|
194
|
+
end
|
195
|
+
|
225
196
|
protected
|
226
197
|
|
227
198
|
# Extract the value and exponent from the string.
|