An open API service indexing awesome lists of open source software.

https://github.com/jun0kada/context_eval


https://github.com/jun0kada/context_eval

rails ruby

Last synced: 2 months ago
JSON representation

Awesome Lists containing this project

README

          

# ContextEval

[![Build Status](https://travis-ci.org/Jun0kada/context_eval.svg?branch=master)](https://travis-ci.org/Jun0kada/context_eval)

provide `Object#context_eval`

## Installation

Add this line to your application's Gemfile:

```ruby
gem 'context_eval'
```

And then execute:

$ bundle

Or install it yourself as:

$ gem install context_eval

## Usage

```ruby
class Notification < ActiveRecord::Base
belongs_to :user
belongs_to :notifiable, polymorphic: true

delegate :notification_config, to: :notifiable

def title
notifiable.context_eval(notification_config[:title]) || raise
end

def message
notifiable.context_eval(notification_config[:message])
end
end

module Notifiable
extend ActiveSupport::Concern

included do
config_accessor :notification_config, instance_writer: false # ActiveSupport::Configurable

has_one :notification, as: :notifiable, dependent: :destroy, class_name: '::Notification'

after_create do
self.create_notification!(user: context_eval(notification_config[:send_to]))
end
end
end

class Nice < ActiveRecord::Base
include Notifiable

self.notification_config = {
title: 'Nice!',
send_to: -> { article.user }
}

belongs_to :article
end

class Comment < ActiveRecord::Base
include Notifiable

self.notification_config = {
title: -> { "#{body[0..20]}..." },
message: :body,
send_to: -> { article.user }
}

belongs_to :article
end
```

```sample.html.erb


    <% @notifications.each do |notification| %>

  • <%= notification.title %>

    <% if notification.message.present? %>

    <%= notification.message %>


    <% end %>

  • <% end %>

```

### Detail

```ruby
class User
attr_accessor :name

def initialize(name)
@name = name
end
end

user = User.new('john')

# Symbol
user.context_eval(:name) #=> john

# Proc
proc_arg = Proc.new { "Mr. #{name}" }
user.context_eval(proc_arg) #=> Mr. john

# Proc and args
proc_arg = Proc.new { |age| "Mr. #{name}, #{age} years old." }
user.context_eval(proc_arg, 30) #=> Mr. john, 30 years old.

# Lambda
lambda_arg = -> { "Mr. #{name}" }
user.context_eval(lambda_arg) #=> Mr. john

# Lambda and args
lambda_arg = -> (age) { "Mr. #{name}, #{age} years old." }
user.context_eval(lambda_arg, 30) #=> Mr. john, 30 years old.

# String
user.context_eval('Hey john') #=> Hey John

# Nil
user.context_eval(nil) #=> nil
```

##

## Contributing

Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/context_eval. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.

## License

The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).

## Code of Conduct

Everyone interacting in the ContextEval project’s codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/[USERNAME]/context_eval/blob/master/CODE_OF_CONDUCT.md).