Class: FocusNfe::Esquemas::Esquema

Inherits:
Object
  • Object
show all
Defined in:
lib/focus_nfe/esquemas/esquema.rb

Overview

Esquema de emissão de um documento fiscal: a coleção de Campos esperados pela API para aquele tipo de documento.

Constant Summary collapse

DIRETORIO =

Returns diretório dos schemas empacotados (+data/schemas/+).

Returns:

  • (String)

    diretório dos schemas empacotados (+data/schemas/+)

File.expand_path("../../../data/schemas", __dir__.to_s)
NOME_VALIDO =

Returns nomes de schema aceitos (alfanumérico, hífen, underscore).

Returns:

  • (Regexp)

    nomes de schema aceitos (alfanumérico, hífen, underscore)

/\A[\w-]+\z/

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(definicoes) ⇒ Esquema

Returns a new instance of Esquema.

Parameters:

  • definicoes (Array<Hash>)

    entradas de campo já parseadas do JSON



60
61
62
# File 'lib/focus_nfe/esquemas/esquema.rb', line 60

def initialize(definicoes)
  @campos = definicoes.map { |definicao| Campo.new(definicao) }
end

Instance Attribute Details

#camposArray<Campo> (readonly)

Returns campos definidos pelo esquema.

Returns:

  • (Array<Campo>)

    campos definidos pelo esquema



57
58
59
# File 'lib/focus_nfe/esquemas/esquema.rb', line 57

def campos
  @campos
end

Class Method Details

.carregar(nome) ⇒ Esquema?

Carrega o schema empacotado de um documento, memoizando por nome. Nomes fora do padrão alfanumérico são rejeitados (devolve nil) antes de tocar o filesystem, evitando travessia de caminho via nome e não poluindo o cache com entradas arbitrárias.

Parameters:

  • nome (String)

    nome do documento (ex.: "nfe"), igual ao caminho_base

Returns:

  • (Esquema, nil)

    o esquema, ou nil se o nome for inválido ou não houver arquivo



41
42
43
44
45
46
47
# File 'lib/focus_nfe/esquemas/esquema.rb', line 41

def carregar(nome)
  return cache[nome] if cache.key?(nome)
  return nil unless nome.to_s.match?(NOME_VALIDO)

  caminho = File.join(DIRETORIO, "schema_#{nome}.json")
  cache[nome] = File.exist?(caminho) ? new(JSON.parse(File.read(caminho))) : nil
end

Instance Method Details

#descreverArray<Hash>

Descrição serializável do esquema: um Hash por campo, na ordem do schema.

Returns:

  • (Array<Hash>)

    descrição estruturada de cada Campo



67
68
69
# File 'lib/focus_nfe/esquemas/esquema.rb', line 67

def descrever
  campos.map(&:to_h)
end