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