mattbrictson/tomo

View on GitHub
docs/api/Paths.md

Summary

Maintainability
Test Coverage
# Tomo::Paths

Provides syntactic sugar for accessing settings that represent file system paths. For every tomo setting in the form `:<name>_path`, Paths will expose a method of that name that behaves like a Ruby Pathname object. As a special exception, the `:deploy_to` setting is also exposed even though it does not follow the same naming convention.

In tomo the following path settings are always available:

```ruby
settings[:deploy_to]     # => "/var/www/my-app"
settings[:current_path]  # => "/var/www/my-app/current"
settings[:release_path]  # => "/var/www/my-app/releases/20190531164322"
settings[:releases_path] # => "/var/www/my-app/releases"
settings[:shared_path]   # => "/var/www/my-app/shared"
```

Using Paths, these same settings can be accessed like this:

```ruby
paths.deploy_to # => "/var/www/my-app"
paths.current   # => "/var/www/my-app/current"
paths.release   # => "/var/www/my-app/releases/20190531164322"
paths.releases  # => "/var/www/my-app/releases"
paths.shared    # => "/var/www/my-app/shared"
```

More powerfully, the values returned by Paths respond to `join` and `dirname`, so you can easily compose them:

```ruby
paths.current.dirname       # => "/var/www/my-app"
paths.release.join("tmp")   # => "/var/www/my-app/releases/20190531164322/tmp"
paths.shared.join("bundle") # => "/var/www/my-app/shared/bundle"
```

Paths can be used wherever a path string is expected, like [chdir](Remote.md#chdirdir-block-obj):

```ruby
remote.chdir(paths.current) do
  remote.run("bundle", "exec", "puma", "--daemon")
end
# $ cd /var/www/my-app/current && bundle exec puma --daemon
```

If a plugin defines a setting with the suffix `_path` or if you create your own setting with that suffix, it automatically will be exposed via the Paths object:

```ruby
# .tomo/config.rb
set my_custom_path: "/opt/custom"
```

```ruby
paths.my_custom.join("var") # => "/opt/custom/var"
```