0.0
Low commit activity in last 3 years
No release in over a year
Class attributes are not natively supported by ruby, this fixes the problem!
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
 Dependencies
 Project Readme

Ruby class attributes

class-cattr gem provides simple way to set and get class attributes.

Installation

to install

gem install class-cattr

or in Gemfile

gem 'class-cattr'

and to use

require 'class-cattr'

How to use

  • require 'class-cattr'
  • define class attributes as cattr :name, default: value, class: true|fase, instance: true|false
  • get them via cattr.name (or via class and instance method if provided)
class AppModel
  # define :admin_path class attrbiute with class and instance methodss
  cattr :admin_path,
    # defaults value will be calculated on read, if proc provided
    default: proc { '/admin/%s' % to_s.tableize },
    
    # create class setter and getter
    class: true,
    
    # create instance setter and getter
    instance: true

  # :icon, default value is nil
  cattr :icon, 'undefined.png'
end

class User < AppModel
  cattr.icon = 'user.png'
end

class Product < AppModel
end

###

User.cattr.admin_path  # '/admin/people' (available allways)
User.admin_path        # '/admin/people' (from class: true)
@user.cattr.admin_path # '/admin/people' (available allways)
@user.admin_path       # '/admin/people' (from instance: true)

User.cattr.icon        # 'user.png'
User.icon              # NoMethodErorr
@user.cattr.icon       # 'user.png'
@user.icon             # NoMethodErorr

Product.cattr.icon     # 'undefined.png'
Product.icon           # NoMethodErorr
@product.cattr.icon    # 'undefined.png'
@product.icon          # NoMethodErorr

Tips

class User
  cattr :icon, 'undefined.png'
  # can ve defined as
  cattr.icon = 'undefined.png'
  # but in this fashion you can't define class and instance setters and getters
  
  # this all all the same
  catr.time_now = proc { Time.now }
  catr(:time_now) { Time.now }
  catr :time_now, default: proc { Time.now }

  # you can define argument withut equal sign
  self.admin_path 'foo'
  # same as
  self.admin_path = 'foo'
end

# it is advice to define cattr with
cattr :name, opts

# and use via
Klass.cattr.name
@klass.cattr.name

Q&A

Q: Why did you create this when Rails provides class_attribute ?
A: There is a small but nimble Ruby community that uses Ruby and outside the Rails eco-system.

Q: Why did you not use some and improve one of the existing similar libs?
A: I like clean interface without base class pollution, approach I did not find anywhre. This gem only adds cattr methods to class and instance. Optionaly, you can polute only class methods, you can pollute instance only methods, or both.

Dependency

none

Development

After checking out the repo, run bundle install to install dependencies. Then, run rspec to run the tests.

Contributing

Bug reports and pull requests are welcome on GitHub at https://github.com/dux/class-cattr. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the Contributor Covenant code of conduct.

License

The gem is available as open source under the terms of the MIT License.