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_gem_mod(mod_name, mod_path) ⇒ Object
-
#add_path(mod_name, path = nil) ⇒ Object
(also: #mod)
Add a mod to mod load paths.
- #dirname(path, type) ⇒ Object
-
#each(type = nil) ⇒ Object
Iterate over each mod directory.
- #each_assets_path ⇒ Object
- #each_tmp(type) ⇒ Object
- #each_with_tmp(type = nil) ⇒ Object
- #gem_mod(name) ⇒ Object
-
#initialize(mod_paths = []) ⇒ Dirs
constructor
A new instance of Dirs.
-
#path(mod_name) ⇒ Object
The path to mod ‘mod_name`.
- #unknown_gem_mod!(name) ⇒ Object
Constructor Details
#initialize(mod_paths = []) ⇒ Dirs
Returns a new instance of Dirs.
49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
# File 'lib/cardio/mod/dirs.rb', line 49 def initialize mod_paths=[] @mods = [] @loaded_gem_mods = ::Set.new @paths = {} mod_paths = Array(mod_paths) mod_paths.each do |mp| @current_path = mp load_from_modfile || load_from_dir end load_from_gemfile super() @mods.each do |mod_name| self << @paths[mod_name] end end |
Instance Attribute Details
#mods ⇒ Object (readonly)
Returns the value of attribute mods.
46 47 48 |
# File 'lib/cardio/mod/dirs.rb', line 46 def mods @mods end |
Instance Method Details
#add_gem_mod(mod_name, mod_path) ⇒ Object
86 87 88 89 90 91 |
# File 'lib/cardio/mod/dirs.rb', line 86 def add_gem_mod mod_name, mod_path return if @loaded_gem_mods.include?(mod_name) @loaded_gem_mods << mod_name add_path mod_name, mod_path end |
#add_path(mod_name, path = nil) ⇒ Object Also known as: mod
Add a mod to mod load paths
66 67 68 69 70 71 72 73 74 |
# File 'lib/cardio/mod/dirs.rb', line 66 def add_path mod_name, path=nil if @mods.include? mod_name raise Card::Error, "name conflict: mod with name \"#{mod_name}\" already loaded" end @mods << mod_name path ||= File.join @current_path, mod_name @paths[mod_name] = path end |
#dirname(path, type) ⇒ Object
111 112 113 |
# File 'lib/cardio/mod/dirs.rb', line 111 def dirname path, type type ? File.join(path, type.to_s) : path end |
#each(type = nil) ⇒ Object
Iterate over each mod directory
104 105 106 107 108 109 |
# File 'lib/cardio/mod/dirs.rb', line 104 def each type=nil super() do |path| dirname = dirname path, type yield dirname if Dir.exist? dirname end end |
#each_assets_path ⇒ Object
129 130 131 132 133 134 |
# File 'lib/cardio/mod/dirs.rb', line 129 def each_assets_path @mods.each do |mod| path = File.join(@paths[mod], "public", "assets") yield mod, path if Dir.exist? path end end |
#each_tmp(type) ⇒ Object
115 116 117 118 119 120 |
# File 'lib/cardio/mod/dirs.rb', line 115 def each_tmp type @mods.each do |mod| path = tmp_dir mod, type yield path if Dir.exist? path end end |
#each_with_tmp(type = nil) ⇒ Object
122 123 124 125 126 127 |
# File 'lib/cardio/mod/dirs.rb', line 122 def each_with_tmp type=nil @mods.each do |mod| dirname = dirname @paths[mod], type yield dirname, tmp_dir(mod, type) if Dir.exist? dirname end end |
#gem_mod(name) ⇒ Object
76 77 78 79 80 |
# File 'lib/cardio/mod/dirs.rb', line 76 def gem_mod name deps = Mod.dependencies name unknown_gem_mod!(name) if deps.blank? deps.each { |spec| add_gem_mod spec.name, spec.full_gem_path } end |
#path(mod_name) ⇒ Object
Returns the path to mod ‘mod_name`.
97 98 99 |
# File 'lib/cardio/mod/dirs.rb', line 97 def path mod_name @paths[mod_name] || @paths["card-mod-#{mod_name}"] end |