lib/mona.rb in mona-0.2.1 vs lib/mona.rb in mona-0.2.2

- old
+ new

@@ -1,26 +1,110 @@ -#Mona - 2ch library. -#Copyright (C) 2011- masarakki <masaki@hisme.net> -# -#== How to access 2ch.net -# -#first, create instance of Board. -#if you want to access to hayabusa2.2ch.net/news4vip, -# board = Mona::Board.new('hayabusa2', 'news4vip') -#then you can get list of Thread by -# threads = board.threads -#or if you know thread info, you can create Thread instance -# thread = Mona::Thread.new(:board => Mona::Board.new('hayabusa2', 'news4vip'), :id => 101010101) -# +# frozen_string_literal: true + +require 'mona/version' +require 'dry/system' +require 'benchmark' +require "zeitwerk" +require 'pry' + module Mona - autoload :Client, 'mona/client' - autoload :Board, 'mona/board' - autoload :Thread, 'mona/thread' + class Error < StandardError; end - VERSION_MAJOR = 0 - VERSION_MINOR = 1 - VERSION_PATCH = 0 + PROJECT_FILENAME = 'Monafile.rb' + PACKAGE_FILENAME = 'Package.rb' - def self.version - [VERSION_MAJOR, VERSION_MINOR, VERSION_PATCH].join('.') + module Mixins + def self.included(base) + require 'sorbet-runtime' + + base.extend T::Sig + end + end + + class Container < Dry::System::Container + use :env, inferrer: -> { ENV.fetch("RUBY_ENV", :production).to_sym } + # use :logging + + configure do |config| + config.root = __dir__ + + config.component_dirs.add 'mona' do |dir| + dir.namespaces.add nil, key: nil, const: "mona" + end + end + end + + Deps = Container.injector + + Container.finalize! unless Container.env == :test + + Zeitwerk::Loader + .for_gem + .tap(&:setup) + .tap(&:eager_load) + + class << self + attr_accessor :current_project + + def init_package(package_name = nil, from: caller_locations.first.path, env: nil, prevent_eager_load: false) + sync_current_project!(from) do + package_name ||= Container["package.builder"].call(from, current_project.root_path, current_project.package_dirname).name + env ||= current_project.env + + Container["package.initializer"].call(package_name, env: env, prevent_eager_load: prevent_eager_load) + end + end + + def root(from = caller_locations.first.path) + sync_current_project!(from) do + current_project.root_path + end + end + + def tasks(from = caller_locations.first.path) + sync_current_project!(from) do + Container["task.manager"] + end + end + + def loader(from = caller_locations.first.path) + sync_current_project!(from) do + current_project.loader + end + end + + def configs(from = caller_locations.first.path) + sync_current_project!(from) do + Container["config.manager"] + end + end + + def packages(from = caller_locations.first.path) + sync_current_project!(from) do + Container["package.repo"] + end + end + + def sync_current_project!(path, &block) + path = File.expand_path(path) + path = File.dirname(path) unless File.directory?(path) + + root = Container['project.find_root'].call(path) + + if @current_project && @current_project.root_path == root + return block.call + end + + synchronize do + @current_project = Container["project.initializer"].call(path) + + block.call + end + end + + def synchronize(&block) + @mutex ||= Mutex.new + + @mutex.synchronize(&block) + end end end