Skip to content

stephendolan/decorator

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

21 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Decorator

Shard CI API Documentation Website GitHub release

A simple Crystal shard for decorating objects.

Installation

Add the dependency to your shard.yml:

dependencies:
  decorator:
    github: stephendolan/decorator

Run shards install

🎬 Screencast

Watch a LuckyCast on the Decorator shard

Usage

Require the shard:

require "decorator"

Create a decorator Struct that inherits from Decorator::Base, and define what it decorates:

struct TimeDecorator < Decorator::Base
  decorates time : Time

  # Return a pretty version of a date and weekday in the format:
  # `Monday, November 2, 2020`
  def date_with_weekday : String
    time.to_s("%A, %B %-d, %Y")
  end

  # Return a pretty version of a date in the format:
  # `November 2, 2020`
  def date : String
    time.to_s("%B %-d, %Y")
  end
end

In the above example, Decorator adds the following to the TimeDecorator struct for you:

  • An initialize(@time : Time) method
  • A collection(objects : Array(Time)) class method
  • A getter (or getter? for Bool types) for @time

Now, you're able to transform Time objects using the decorator:

decorated_time = TimeDecorator.new(Time.utc)

puts decorated_time.date_with_weekday
# => "Monday, November 2, 2020"

puts decorated_time.date
# => "November 2, 2020"

Or even a collection of time objects with the collection method:

decorated_times = TimeDecorator.collection([
  Time.utc - 1.year,
  Time.utc,
  Time.utc + 1.year
])

puts decorated_times[0].date_with_weekday
# => "Saturday, November 2, 2019"
puts decorated_times[1].date_with_weekday
# => "Monday, November 2, 2020"
puts decorated_times[2].date_with_weekday
# => "Tuesday, November 2, 2021"

Contributing

  1. Fork it
  2. Create your feature branch (git checkout -b my-new-feature)
  3. Commit your changes (git commit -am 'Add some feature')
  4. Push to the branch (git push origin my-new-feature)
  5. Create a new Pull Request

Contributors

Inspiration