fic_tracker/lib/fic_tracker.rb

101 lines
2 KiB
Ruby

# frozen_string_literal: true
require 'logging'
require_relative 'fic_tracker/version'
module FicTracker
class Error < StandardError; end
class ConfigError < Error; end
def self.logger
@logger ||= Logging.logger[self].tap do |logger|
logger.add_appenders ::Logging.appenders.stdout
logger.level = :warn
end
end
def self.configure!
Config.load!
end
def self.cache
configure! unless @cache
@cache
end
def self.cache=(cache)
@cache = cache
end
def self.database
configure! unless @database
@database
end
def self.database=(database)
@database = database
end
def self.debug!
logger.level = :debug
end
def self.logger=(global_logger)
@logger = global_logger
@global_logger = !global_logger.nil?
end
def self.global_logger?
@global_logger ||= false
end
module Models
def self.const_missing(const)
raise 'No database connected' unless FicTracker.database
model = const.to_s.downcase
require_relative "fic_tracker/models/#{model}"
mod = const_get(const) if const_defined? const
return mod if mod
raise "Model not found: #{const}"
end
end
module Tasks
autoload :Cleanup, 'fic_tracker/tasks/cleanup'
end
module Renderers
autoload :Epub, 'fic_tracker/renderers/epub'
autoload :HTML, 'fic_tracker/renderers/html'
autoload :Markdown, 'fic_tracker/renderers/markdown'
def self.render(type, story, **attrs)
klass = case type
when :Markdown, :markdown, :md
Markdown
when :HTML, :html
HTML
when :Epub, :epub
Epub
end
unless attrs[:io]
require 'stringio'
attrs[:io] = StringIO.new
attrs[:_stringio] = true
end
return klass.new(story, **attrs).render unless attrs[:stringio]
attrs[:io].string
end
end
end
require_relative 'fic_tracker/backend'
require_relative 'fic_tracker/config'