gobl 0.6.1 → 0.6.2

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
  SHA256:
3
- metadata.gz: 922b876883d44b5061b36575f25d4d6fcd4bcc69e7897a1994f822efc07e0037
4
- data.tar.gz: e5336560d0e2709307e62d7bd112e6b2ed317c1724e76a2fe2cbd023a79f8186
3
+ metadata.gz: 260a74838fdcc4fb1f061650fab0f2372d75cc641433e364ace0e6f0c7210341
4
+ data.tar.gz: 3295ae2a0a090e2a645656ad37e952884d32cec81885af60344e1a93f8d1cec0
5
5
  SHA512:
6
- metadata.gz: cab22b27eeb9527c00354fd4a8789deb5c1dbfb7222121094a2497425c8fc5cd701ca52482a52aee9a92a3ca939f3e3d7c43a4ca6f287d206f1719219b6683f4
7
- data.tar.gz: cfff33363d3e5a6d018be2fdb0b5964002863104ef2ec32983e6596300c65dfd216c5fea3fa6455d942cb8ec8ccd203b66ddf1f51f4982192383d3afb6589ed9
6
+ metadata.gz: 61d1572d9ab2d1c112b3c3a0138aa6e5e01c8c8e41b416499abc33ed5d400f8a23b8c3dd6b6b14a89df365d2063595c97873d8f15b2b1f05bc732d9c6138820e
7
+ data.tar.gz: c788ee19f631e61c18ad1acc2db7279bed92c37783f7b192f8b7863a26585d8c8818ab376f6e10a883e1612648ce74e7d51ef5aaa4c913255d79916013e2d16a
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ module GOBL
4
+ module Extensions
5
+ # Additional methods for the generated {GOBL::Document} class
6
+ module DocumentHelper
7
+ # Returns the Schema ID of the current document
8
+ #
9
+ # @return [GOBL::ID] the Schema ID
10
+ def schema
11
+ @schema ||= GOBL::ID.new(_map['$schema'])
12
+ end
13
+
14
+ # Extracts the GOBL struct embedded in the document. It determines the type of document
15
+ # currently embedded by reading the schema and attemps to instantiate the detected
16
+ # class.
17
+ #
18
+ # @return [GOBL::Struct] the GOBL struct embedded in the document
19
+ def extract
20
+ raise 'unknown schema' unless schema.gobl?
21
+
22
+ typs = ['GOBL']
23
+ schema.modules.each do |mod|
24
+ typs << mod.underscore.camelize
25
+ end
26
+ typs << schema.name.underscore.camelize
27
+ klass = typs.join('::').constantize
28
+
29
+ # Sanity check
30
+ raise "#{klass.name}::SCHEMA_ID expected to be '#{schema}'" unless schema == klass::SCHEMA_ID
31
+
32
+ klass.new _map.except('$schema')
33
+ end
34
+
35
+ module ClassMethods
36
+ # Embeds the given GOBL struct in a new document injecting the proper Schema ID.
37
+ #
38
+ # @return [Document] the document embedding the given struct
39
+ def embed(struct)
40
+ new struct.as_json.merge(
41
+ '$schema' => struct.class::SCHEMA_ID
42
+ )
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module GOBL
4
+ module Extensions
5
+ # Additional methods for the generated {GOBL::Envelope} class
6
+ module EnvelopeHelper
7
+ def self.included(klass)
8
+ klass.alias_method :schema, '$schema'
9
+ klass.alias_method :schema=, '$schema='
10
+ end
11
+
12
+ # Extracts the GOBL struct embedded in the envelope's document
13
+ #
14
+ # @see GOBL::Extensions::DocumentHelper#extract
15
+ #
16
+ # @return [GOBL::Struct] the GOBL struct embedded in the envelope's document
17
+ def extract
18
+ doc.extract
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module GOBL
4
+ module Extensions
5
+ module I18n
6
+ # Additional methods for the generated {GOBL::I18n::String} class
7
+ module ValueKeysHelper
8
+ # Enables dynamic getter methods for the mapped keys.
9
+ #
10
+ # @example
11
+ # str = GOBL::I18n::String.new(en: 'Name', es: 'Nombre')
12
+ # str.en #=> "Name"
13
+ # str.es #=> "Nombre"
14
+ def method_missing(method_name, *args, &block)
15
+ if _map.key?(method_name) || _map.key?(method_name.to_s)
16
+ _map[method_name] || _map[method_name.to_s]
17
+ else
18
+ super
19
+ end
20
+ end
21
+
22
+ # @api private
23
+ def respond_to_missing?(method_name, *)
24
+ _map.key?(method_name) || _map.key?(method_name.to_s) || super
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ module GOBL
4
+ module Extensions
5
+ module Tax
6
+ # Additional methods for the generated {GOBL::Tax::Regime} class
7
+ module RegimeHelper
8
+ module ClassMethods
9
+ # Loads a {GOBL::Tax::Regime} object identified by the given code with all its data
10
+ #
11
+ # @param code [String] the code of the regime to load
12
+ #
13
+ # @return [Regime] the requested regime
14
+ def fetch(code)
15
+ regimes[code] ||= load_regime(code)
16
+ end
17
+
18
+ protected
19
+
20
+ # map of regime ID to regime instance
21
+ def regimes
22
+ @regimes ||= {}
23
+ end
24
+
25
+ def load_regime(code)
26
+ path = File.join("#{__dir__}/../../../../data/regimes", "#{code.to_s.downcase}.json")
27
+ msg = "regime definition for #{code} does not exist at #{path}"
28
+ raise StandardError, msg unless File.exist?(path)
29
+
30
+ data = File.read(path)
31
+ from_json!(data)
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
data/lib/gobl/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module GOBL
4
- VERSION = '0.6.1'
4
+ VERSION = '0.6.2'
5
5
  end
data/lib/gobl.rb CHANGED
@@ -10,10 +10,9 @@ require 'hashme'
10
10
 
11
11
  require_relative 'ext/hashme'
12
12
 
13
- loader = Zeitwerk::Loader.for_gem(warn_on_extra_files: false)
13
+ loader = Zeitwerk::Loader.for_gem
14
14
  loader.inflector.inflect(
15
15
  'gobl' => 'GOBL',
16
- 'gobl_extensions' => 'GOBLExtensions',
17
16
  'uuid' => 'UUID',
18
17
  'url' => 'URL',
19
18
  'item_id' => 'ItemID',
@@ -22,6 +21,7 @@ loader.inflector.inflect(
22
21
  'id' => 'ID',
23
22
  'cbc' => 'CBC'
24
23
  )
24
+ loader.ignore("#{__dir__}/ext")
25
25
  loader.setup
26
26
 
27
27
  # Main GOBL namespace. It provides direct access to the library's configuration (see
@@ -41,4 +41,13 @@ module GOBL
41
41
  end
42
42
  end
43
43
 
44
- require_relative 'extensions'
44
+ # Extensions are all defined here so they are auto-loaded by Zeitwerk.
45
+ #
46
+ # Both the instance and class method modules need to be included/extended explicitly here
47
+ # to get YARD parsing them properly.
48
+
49
+ GOBL::I18n::String.include GOBL::Extensions::I18n::ValueKeysHelper
50
+ GOBL::Document.include GOBL::Extensions::DocumentHelper
51
+ GOBL::Document.extend GOBL::Extensions::DocumentHelper::ClassMethods
52
+ GOBL::Envelope.include GOBL::Extensions::EnvelopeHelper
53
+ GOBL::Tax::Regime.extend GOBL::Extensions::Tax::RegimeHelper::ClassMethods
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gobl
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.1
4
+ version: 0.6.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Lilue
@@ -66,7 +66,6 @@ files:
66
66
  - data/regimes/gb.json
67
67
  - data/regimes/nl.json
68
68
  - lib/ext/hashme.rb
69
- - lib/extensions.rb
70
69
  - lib/gobl.rb
71
70
  - lib/gobl/bill/advances.rb
72
71
  - lib/gobl/bill/charge.rb
@@ -101,6 +100,10 @@ files:
101
100
  - lib/gobl/dsig/signature.rb
102
101
  - lib/gobl/enum.rb
103
102
  - lib/gobl/envelope.rb
103
+ - lib/gobl/extensions/document_helper.rb
104
+ - lib/gobl/extensions/envelope_helper.rb
105
+ - lib/gobl/extensions/i18n/value_keys_helper.rb
106
+ - lib/gobl/extensions/tax/regime_helper.rb
104
107
  - lib/gobl/header.rb
105
108
  - lib/gobl/i18n/string.rb
106
109
  - lib/gobl/id.rb
@@ -155,10 +158,6 @@ files:
155
158
  - lib/gobl/uuid/uuid.rb
156
159
  - lib/gobl/value.rb
157
160
  - lib/gobl/version.rb
158
- - lib/gobl_extensions/document_helper.rb
159
- - lib/gobl_extensions/envelope_helper.rb
160
- - lib/gobl_extensions/i18n/value_keys_helper.rb
161
- - lib/gobl_extensions/tax/regime_helper.rb
162
161
  homepage: https://github.com/invopop/gobl.ruby
163
162
  licenses:
164
163
  - Apache-2.0
data/lib/extensions.rb DELETED
@@ -1,12 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # Extensions are all defined here so they are auto-loaded by Zeitwerk.
4
- #
5
- # Both the instance and class method modules need to be included/extended explicitly here
6
- # to get YARD parsing them properly.
7
-
8
- GOBL::I18n::String.include GOBLExtensions::I18n::ValueKeysHelper
9
- GOBL::Document.include GOBLExtensions::DocumentHelper
10
- GOBL::Document.extend GOBLExtensions::DocumentHelper::ClassMethods
11
- GOBL::Envelope.include GOBLExtensions::EnvelopeHelper
12
- GOBL::Tax::Regime.extend GOBLExtensions::Tax::RegimeHelper::ClassMethods
@@ -1,45 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module GOBLExtensions
4
- # Additional methods for the generated {GOBL::Document} class
5
- module DocumentHelper
6
- # Returns the Schema ID of the current document
7
- #
8
- # @return [GOBL::ID] the Schema ID
9
- def schema
10
- @schema ||= GOBL::ID.new(_map['$schema'])
11
- end
12
-
13
- # Extracts the GOBL struct embedded in the document. It determines the type of document
14
- # currently embedded by reading the schema and attemps to instantiate the detected
15
- # class.
16
- #
17
- # @return [GOBL::Struct] the GOBL struct embedded in the document
18
- def extract
19
- raise 'unknown schema' unless schema.gobl?
20
-
21
- typs = ['GOBL']
22
- schema.modules.each do |mod|
23
- typs << mod.underscore.camelize
24
- end
25
- typs << schema.name.underscore.camelize
26
- klass = typs.join('::').constantize
27
-
28
- # Sanity check
29
- raise "#{klass.name}::SCHEMA_ID expected to be '#{schema}'" unless schema == klass::SCHEMA_ID
30
-
31
- klass.new _map.except('$schema')
32
- end
33
-
34
- module ClassMethods
35
- # Embeds the given GOBL struct in a new document injecting the proper Schema ID.
36
- #
37
- # @return [Document] the document embedding the given struct
38
- def embed(struct)
39
- new struct.as_json.merge(
40
- '$schema' => struct.class::SCHEMA_ID
41
- )
42
- end
43
- end
44
- end
45
- end
@@ -1,20 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module GOBLExtensions
4
- # Additional methods for the generated {GOBL::Envelope} class
5
- module EnvelopeHelper
6
- def self.included(klass)
7
- klass.alias_method :schema, '$schema'
8
- klass.alias_method :schema=, '$schema='
9
- end
10
-
11
- # Extracts the GOBL struct embedded in the envelope's document
12
- #
13
- # @see GOBLExtensions::DocumentHelper#extract
14
- #
15
- # @return [GOBL::Struct] the GOBL struct embedded in the envelope's document
16
- def extract
17
- doc.extract
18
- end
19
- end
20
- end
@@ -1,27 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module GOBLExtensions
4
- module I18n
5
- # Additional methods for the generated {GOBL::I18n::String} class
6
- module ValueKeysHelper
7
- # Enables dynamic getter methods for the mapped keys.
8
- #
9
- # @example
10
- # str = GOBL::I18n::String.new(en: 'Name', es: 'Nombre')
11
- # str.en #=> "Name"
12
- # str.es #=> "Nombre"
13
- def method_missing(method_name, *args, &block)
14
- if _map.key?(method_name) || _map.key?(method_name.to_s)
15
- _map[method_name] || _map[method_name.to_s]
16
- else
17
- super
18
- end
19
- end
20
-
21
- # @api private
22
- def respond_to_missing?(method_name, *)
23
- _map.key?(method_name) || _map.key?(method_name.to_s) || super
24
- end
25
- end
26
- end
27
- end
@@ -1,35 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module GOBLExtensions
4
- module Tax
5
- # Additional methods for the generated {GOBL::Tax::Regime} class
6
- module RegimeHelper
7
- module ClassMethods
8
- # Loads a {GOBL::Tax::Regime} object identified by the given code with all its data
9
- #
10
- # @param code [String] the code of the regime to load
11
- #
12
- # @return [Regime] the requested regime
13
- def fetch(code)
14
- regimes[code] ||= load_regime(code)
15
- end
16
-
17
- protected
18
-
19
- # map of regime ID to regime instance
20
- def regimes
21
- @regimes ||= {}
22
- end
23
-
24
- def load_regime(code)
25
- path = File.join("#{__dir__}/../../../data/regimes", "#{code.to_s.downcase}.json")
26
- msg = "regime definition for #{code} does not exist at #{path}"
27
- raise StandardError, msg unless File.exist?(path)
28
-
29
- data = File.read(path)
30
- from_json!(data)
31
- end
32
- end
33
- end
34
- end
35
- end