class Kangaru::Paths

def app_dir

def app_dir
  @app_dir ||= lib_dir.join(name)
end

def build_path(*fragments, dir:, ext:)

def build_path(*fragments, dir:, ext:)
  return dir if fragments.empty?
  ext  = ".#{ext}" if ext
  file = "#{fragments.pop}#{ext}"
  dir.join(*fragments, file)
end

def collapsed_dirs

def collapsed_dirs
  [models_dir, controllers_dir].map(&:to_s)
end

def controllers_dir

def controllers_dir
  @controllers_dir ||= app_dir.join(CONTROLLERS_DIRNAME)
end

def dir

The directory that contains the gem.
def dir
  @dir ||= gem_path.dirname
end

def gem_dir

def gem_dir
  @gem_dir ||= lib_dir.dirname
end

def gem_path(*fragments, ext: nil)

Paths inside the root directory of the gem.
def gem_path(*fragments, ext: nil)
  build_path(*fragments, dir: gem_dir, ext:)
end

def initialize(source:)

def initialize(source:)
  @source = Pathname.new(source)
end

def lib_dir

def lib_dir
  @lib_dir ||= source.dirname
end

def lib_path(*fragments, ext: :rb)

2. gem_name/*.rb (app_path)
1. gem_name.rb (source_file)
Paths inside the lib path of the gem. Conventionally contains two files:
def lib_path(*fragments, ext: :rb)
  build_path(*fragments, dir: lib_dir, ext:)
end

def models_dir

def models_dir
  @models_dir ||= app_dir.join(MODELS_DIRNAME)
end

def name

Infers the gem name from the source filename.
def name
  @name ||= source.basename(".rb").to_s
end

def path(*fragments, ext: :rb)

The gem application directory (gem/lib/gem_name).
def path(*fragments, ext: :rb)
  build_path(*fragments, dir: app_dir, ext:)
end

def view_path(*fragments, ext: :erb)

def view_path(*fragments, ext: :erb)
  build_path(*fragments, dir: views_dir, ext:)
end

def views_dir

def views_dir
  @views_dir ||= app_dir.join(VIEWS_DIRNAME)
end