tormenta20 0.2.11 → 0.2.12

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.
@@ -0,0 +1,5 @@
1
+ {
2
+ "id": "t20_eja",
3
+ "nome": "Tormenta 20 - Edição Jogo do Ano",
4
+ "nome_curto": "T20 - EJA"
5
+ }
@@ -0,0 +1,52 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Tormenta20
4
+ module Concerns
5
+ # Mixin that gives any gem model access to its book/page reference.
6
+ #
7
+ # Methods are lazy-loaded: the database is queried on the first call
8
+ # and the result is memoized for the lifetime of the instance.
9
+ #
10
+ # @example
11
+ # guerreiro = Tormenta20.classes.find("guerreiro")
12
+ # guerreiro.book_reference # => "T20 - EJA, p. 56"
13
+ # guerreiro.page # => 56
14
+ # guerreiro.book # => "T20 - EJA"
15
+ # guerreiro.full_book # => "Tormenta 20 - Edição Jogo do Ano"
16
+ module BookReferenceable
17
+ # "T20 - EJA, p. 215" — nil se não houver entrada no índice.
18
+ def book_reference
19
+ entry = _indice_entry
20
+ return nil unless entry
21
+
22
+ "#{entry.livro.nome_curto}, p. #{entry.pagina}"
23
+ end
24
+
25
+ # Número da página (Integer) — nil se não indexado.
26
+ def page
27
+ _indice_entry&.pagina
28
+ end
29
+
30
+ # Nome curto do livro (String) — nil se não indexado.
31
+ def book
32
+ _indice_entry&.livro&.nome_curto
33
+ end
34
+
35
+ # Nome completo do livro (String) — nil se não indexado.
36
+ def full_book
37
+ _indice_entry&.livro&.nome
38
+ end
39
+
40
+ private
41
+
42
+ def _indice_entry
43
+ # Memoize por instância; reset se o id mudar.
44
+ return @_indice_entry if defined?(@_indice_entry)
45
+
46
+ @_indice_entry = Models::IndiceRemissivo
47
+ .includes(:livro)
48
+ .find_by(tabela: self.class.table_name, registro_id: id.to_s)
49
+ end
50
+ end
51
+ end
52
+ end
@@ -125,6 +125,7 @@ module Tormenta20
125
125
  pool: 5,
126
126
  timeout: 5000
127
127
  )
128
+ Models::Base.logger = nil
128
129
 
129
130
  @connected = true
130
131
  end
@@ -14,6 +14,8 @@ module Tormenta20
14
14
  # @abstract Subclass and set table_name to create a new model
15
15
  class Base < ActiveRecord::Base
16
16
  self.abstract_class = true
17
+
18
+ include Concerns::BookReferenceable
17
19
  end
18
20
  end
19
21
  end
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_record"
4
+
5
+ module Tormenta20
6
+ module Models
7
+ # Entrada do índice remissivo de um livro.
8
+ #
9
+ # Cada linha representa um termo do índice associado a uma página.
10
+ # Os campos +tabela+ e +registro_id+ são opcionais e preenchidos quando
11
+ # o termo é vinculado a um registro concreto de outra tabela da gem.
12
+ #
13
+ # @example Buscar página de "Guerreiro" no T20 EJA
14
+ # Tormenta20::Models::IndiceRemissivo
15
+ # .where(livro_id: "t20_eja", tabela: "classes", registro_id: "guerreiro")
16
+ # .pluck(:pagina)
17
+ #
18
+ # @example Buscar todas as entradas de um livro que mencionam "Magia"
19
+ # Tormenta20::Models::IndiceRemissivo
20
+ # .where(livro_id: "t20_eja")
21
+ # .where("termo LIKE ?", "%Magia%")
22
+ class IndiceRemissivo < Base
23
+ self.table_name = "indice_remissivo"
24
+ self.primary_key = "id"
25
+
26
+ belongs_to :livro,
27
+ class_name: "Tormenta20::Models::Livro",
28
+ foreign_key: "livro_id"
29
+
30
+ validates :livro_id, presence: true
31
+ validates :termo, presence: true
32
+ validates :pagina, presence: true, numericality: { only_integer: true, greater_than: 0 }
33
+
34
+ # Scopes
35
+ scope :do_livro, ->(livro_id) { where(livro_id: livro_id) }
36
+ scope :para_tabela, ->(tabela) { where(tabela: tabela) }
37
+ scope :associados, -> { where.not(registro_id: nil) }
38
+ scope :nao_associados, -> { where(registro_id: nil) }
39
+ scope :buscar_termo, ->(q) { where("termo LIKE ?", "%#{q}%") }
40
+
41
+ def to_h
42
+ {
43
+ id: id,
44
+ livro_id: livro_id,
45
+ termo: termo,
46
+ pagina: pagina,
47
+ tabela: tabela,
48
+ registro_id: registro_id
49
+ }.compact
50
+ end
51
+
52
+ def associado?
53
+ registro_id.present?
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_record"
4
+
5
+ module Tormenta20
6
+ module Models
7
+ class Livro < Base
8
+ self.table_name = "livros"
9
+
10
+ has_many :indice_remissivo_entries,
11
+ class_name: "Tormenta20::Models::IndiceRemissivo",
12
+ foreign_key: "livro_id",
13
+ dependent: :destroy
14
+
15
+ validates :id, presence: true, uniqueness: true
16
+ validates :nome, presence: true
17
+ validates :nome_curto, presence: true
18
+
19
+ def to_h
20
+ {
21
+ id: id,
22
+ nome: nome,
23
+ nome_curto: nome_curto
24
+ }
25
+ end
26
+ end
27
+ end
28
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Tormenta20
4
- VERSION = "0.2.11"
4
+ VERSION = "0.2.12"
5
5
  end
@@ -6,6 +6,9 @@ require "sqlite3"
6
6
 
7
7
  require_relative "tormenta20/database"
8
8
 
9
+ # Load concerns before models
10
+ require_relative "tormenta20/concerns/book_referenceable"
11
+
9
12
  # Load base model first, then other models
10
13
  require_relative "tormenta20/models/base"
11
14
  Dir["#{__dir__}/tormenta20/models/*.rb"].each { |file| require file unless file.include?("base") }
@@ -182,6 +185,20 @@ module Tormenta20
182
185
  Models::Condicao
183
186
  end
184
187
 
188
+ # Acesso aos livros cadastrados.
189
+ #
190
+ # @return [Class] Tormenta20::Models::Livro
191
+ def livros
192
+ Models::Livro
193
+ end
194
+
195
+ # Acesso ao índice remissivo.
196
+ #
197
+ # @return [Class] Tormenta20::Models::IndiceRemissivo
198
+ def indice_remissivo
199
+ Models::IndiceRemissivo
200
+ end
201
+
185
202
  # @!endgroup
186
203
  end
187
204
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tormenta20
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.11
4
+ version: 0.2.12
5
5
  platform: ruby
6
6
  authors:
7
7
  - LuanGB
@@ -73,14 +73,18 @@ files:
73
73
  - docs/armaduras.md
74
74
  - docs/armas.md
75
75
  - docs/classes.md
76
+ - docs/condicoes.md
76
77
  - docs/divindades.md
77
78
  - docs/escudos.md
79
+ - docs/indice_remissivo.md
78
80
  - docs/itens.md
81
+ - docs/livros.md
79
82
  - docs/magias.md
80
83
  - docs/materiais_especiais.md
81
84
  - docs/melhorias.md
82
85
  - docs/origens.md
83
86
  - docs/poderes.md
87
+ - docs/racas.md
84
88
  - docs/regras.md
85
89
  - examples/database_usage.rb
86
90
  - exe/tormenta20
@@ -329,6 +333,7 @@ files:
329
333
  - src/json/equipamentos/municoes/flechas.json
330
334
  - src/json/equipamentos/municoes/pedras.json
331
335
  - src/json/equipamentos/municoes/virotes.json
336
+ - src/json/indice_remissivo/t20_eja.json
332
337
  - src/json/itens_superiores/materiais_especiais/aco_rubi.json
333
338
  - src/json/itens_superiores/materiais_especiais/adamante.json
334
339
  - src/json/itens_superiores/materiais_especiais/gelo_eterno.json
@@ -364,6 +369,7 @@ files:
364
369
  - src/json/itens_superiores/melhorias/geral/discreto.json
365
370
  - src/json/itens_superiores/melhorias/geral/macabro.json
366
371
  - src/json/itens_superiores/melhorias/geral/material_especial.json
372
+ - src/json/livros/t20_eja.json
367
373
  - src/json/magias/abencoar_alimentos.json
368
374
  - src/json/magias/acalmar_animal.json
369
375
  - src/json/magias/adaga_mental.json
@@ -1244,6 +1250,7 @@ files:
1244
1250
  - src/json/regras/venenos.json
1245
1251
  - src/python/__init__.py
1246
1252
  - src/ruby/tormenta20.rb
1253
+ - src/ruby/tormenta20/concerns/book_referenceable.rb
1247
1254
  - src/ruby/tormenta20/database.rb
1248
1255
  - src/ruby/tormenta20/models/arma.rb
1249
1256
  - src/ruby/tormenta20/models/armadura.rb
@@ -1252,7 +1259,9 @@ files:
1252
1259
  - src/ruby/tormenta20/models/condicao.rb
1253
1260
  - src/ruby/tormenta20/models/divindade.rb
1254
1261
  - src/ruby/tormenta20/models/escudo.rb
1262
+ - src/ruby/tormenta20/models/indice_remissivo.rb
1255
1263
  - src/ruby/tormenta20/models/item.rb
1264
+ - src/ruby/tormenta20/models/livro.rb
1256
1265
  - src/ruby/tormenta20/models/magia.rb
1257
1266
  - src/ruby/tormenta20/models/material_especial.rb
1258
1267
  - src/ruby/tormenta20/models/melhoria.rb