Skip to content
/ hb Public

Simple Hash Builder (=Presenter) for Rails API

Notifications You must be signed in to change notification settings

shozawa/hb

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

12 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Hb

Simple Hash Builder which has ActiveModelSerializers like interface.

Installation

Add this line to your application's Gemfile:

gem 'hb'

And then execute:

$ bundle

Or install it yourself as:

$ gem install hb

Usage

Creating Presenter

Subclass Hb::Base and declare attributes.

class PersonPresenter < Hb::Base
  attributes :id, :email
  attribute :last_name, key: :family_name
end

The attributes names are whitelist of attributes to be exposed. You can change key name by using :key option.

Building Hash

Person = Struct.new(:id, :email, :last_name, :first_name, :age)

person = Person.new(1, 'shozawa@sample.com', 'shozawa', 'tomohiro', 28)

PersonPresenter.new(person).to_h

# => { id: 1, email: 'shozawa@sample.com', family_name: 'shozawa' }

# you can pass ActiveModel object like this
PersonPresenter.new(User.find(1)).to_h

# and you can use factory method
PersonPresenter.wrap(person)

Building Collection

people = [
  Person.new(1, 'nobunaga', 'oda', 30),
  Person.new(2, 'ieyasu', 'tokugawa', 50),
]

# factory method for collection
PersonPresenter.collection(people)

Computed Attributes

class PersonPresenter < Hb::Base
  attributes :id, :email, :full_name
  def full_name
    "#{object.first_name} #{object.last_name}"
  end
end

# => { id: 1, email: 'shozawa@sample.com', full_name: 'tomohiro shozawa' }

object is the object to be wrapped.

Transforming Keys

# pass method_name
Hb::Base.key_format :upcase
PersonPresenter.new(person).to_h
# => { "ID" => 1, "EMAIL" => 'shozawa@sample.com', "FULL_NAME": ... }

# with options
Hb::Base.key_format camelize: :lower
PersonPresenter.new(person).to_h
# => { "id" => 1, "email" => 'shozawa@sample.com', "fullName": ... }

# you can pass proc
Hb::Base.key_format -> (k) { '_' + k }
PersonPresenter.new(person).to_h
# => { "_id" => 1, "_email" => 'shozawa@sample.com', "_full_name": ... }

Contributing

Bug reports and pull requests are welcome on GitHub at https://github.com/shozawa/hb.

About

Simple Hash Builder (=Presenter) for Rails API

Resources

Stars

Watchers

Forks

Packages

No packages published