Class: Cardio::Mod::Dirs
- Inherits:
-
Array
- Object
- Array
- Cardio::Mod::Dirs
- Defined in:
- lib/cardio/mod/dirs.rb
Overview
Dirs objects are used to manage the load paths for card mods. Mods can be loaded as gems and by using directories with mod subdirectories.
-
Gemfile
A mod gem needs a metadata attribute with { “card-mod” => “the_mod_name” } or the name has to start with “card-mod-”. Then you can just add it to your Gemfile. Otherwise it won’t be recognized as mod.
-
mod directory
Give a path to a directory with mods. The mods will be loaded in alphabetical order. To change the load order you can add number prefixes to the mod names (like “01_this_first”) or add a Modfile. In the Modfile you list all the mods you want to be loaded from that directory in load order with a preceding “mod” command (similar to a Gemfile). The mods are expected in subdirectories with the mod names.
Mods in Modfiles are always loaded before mods in the Gemfile. If you have to change the order add gem mods to your Modfile using the mod_gem command. You can omit the ‘card-mod’ prefix.
Example for a mod directory:
# my_mod/Modfile
mod "twitter"
gem_mod "logger"
mod "cache"
# directory structure
my_mods/
Modfile
cache/
set/
all/
my_cache.rb
twitter/
set/
type/
basic.rb
set_pattern/
my_pattern.rb
Dir checks always for gems. You can initialize an Dirs object with an additional array of paths to card mod directories.
Instance Attribute Summary collapse
-
#mods ⇒ Object
readonly
Returns the value of attribute mods.
Instance Method Summary collapse
-
#add_mod(mod_name, path: nil, group: nil) ⇒ Object
Add a mod to mod load paths.
- #delete_mod(mod_name) ⇒ Object
- #dirname(path, type) ⇒ Object
-
#each(type = nil) ⇒ Object
Iterate over each mod directory.
- #each_subpath(*subdirs) ⇒ Object
- #each_tmp(type) ⇒ Object
- #each_with_tmp(type = nil) ⇒ Object
- #fetch_mod(mod_name) ⇒ Object
-
#initialize(mod_paths = []) ⇒ Dirs
constructor
A new instance of Dirs.
-
#path(mod_name) ⇒ Object
The path to mod ‘mod_name`.
- #subpaths(*subdirs) ⇒ Object
Constructor Details
#initialize(mod_paths = []) ⇒ Dirs
Returns a new instance of Dirs.
51 52 53 54 55 56 57 58 59 60 61 62 63 |
# File 'lib/cardio/mod/dirs.rb', line 51 def initialize mod_paths=[] @mods = [] @mods_by_name = {} @loaded_gem_mods = ::Set.new add_core_mods add_gem_mods Array(mod_paths).each do |mp| @current_path = mp add_from_modfile || add_from_dir end super() @mods.each { |mod| self << mod.path } end |
Instance Attribute Details
#mods ⇒ Object (readonly)
Returns the value of attribute mods.
48 49 50 |
# File 'lib/cardio/mod/dirs.rb', line 48 def mods @mods end |
Instance Method Details
#add_mod(mod_name, path: nil, group: nil) ⇒ Object
Add a mod to mod load paths
66 67 68 69 70 71 72 73 74 75 76 77 78 |
# File 'lib/cardio/mod/dirs.rb', line 66 def add_mod mod_name, path: nil, group: nil if @mods_by_name.key? Mod.normalize_name(mod_name) raise StandardError, "name conflict: mod with name \"#{mod_name}\" already loaded" end path ||= File.join @current_path, mod_name group ||= @current_group mod = Mod.new mod_name, path, group, @mods.size @mods << mod @mods_by_name[mod.name] = mod end |
#delete_mod(mod_name) ⇒ Object
80 81 82 83 84 85 |
# File 'lib/cardio/mod/dirs.rb', line 80 def delete_mod mod_name name = Mod.normalize_name mod_name mod = @mods_by_name[name] @mods.delete mod @mods_by_name.delete name end |
#dirname(path, type) ⇒ Object
114 115 116 |
# File 'lib/cardio/mod/dirs.rb', line 114 def dirname path, type type ? File.join(path, type.to_s) : path end |
#each(type = nil) ⇒ Object
Iterate over each mod directory
107 108 109 110 111 112 |
# File 'lib/cardio/mod/dirs.rb', line 107 def each type=nil super() do |path| dirname = dirname path, type yield dirname if Dir.exist? dirname end end |
#each_subpath(*subdirs) ⇒ Object
132 133 134 135 136 |
# File 'lib/cardio/mod/dirs.rb', line 132 def each_subpath *subdirs subpaths(*subdirs).each do |mod_name, subpath| yield mod_name, subpath end end |
#each_tmp(type) ⇒ Object
118 119 120 121 122 123 |
# File 'lib/cardio/mod/dirs.rb', line 118 def each_tmp type @mods.each do |mod| path = mod.tmp_dir type yield path if Dir.exist? path end end |
#each_with_tmp(type = nil) ⇒ Object
125 126 127 128 129 130 |
# File 'lib/cardio/mod/dirs.rb', line 125 def each_with_tmp type=nil @mods.each do |mod| dirname = dirname mod.path, type yield dirname, mod.tmp_dir(type) if Dir.exist? dirname end end |
#fetch_mod(mod_name) ⇒ Object
100 101 102 |
# File 'lib/cardio/mod/dirs.rb', line 100 def fetch_mod mod_name @mods_by_name[Mod.normalize_name(mod_name)] end |
#path(mod_name) ⇒ Object
Returns the path to mod ‘mod_name`.
89 90 91 |
# File 'lib/cardio/mod/dirs.rb', line 89 def path mod_name fetch_mod(mod_name)&.path end |
#subpaths(*subdirs) ⇒ Object
93 94 95 96 97 98 |
# File 'lib/cardio/mod/dirs.rb', line 93 def subpaths *subdirs @mods.each_with_object({}) do |mod, hash| path = mod.subpath(*subdirs) hash[mod.name] = path if path end end |