Just did this in my constance gem, and totally love it as a way to add 
configuration or options configurability to your gem:
http://stufftohelpyouout.blogspot.com/2012/09/forget-struct-and-openstruct-flexible.html
like:
module MyModule
  class << self
    attr_accessor :debug, :proc, :some_mapping
    def configure(&block); yield; end
  end
end
I''ve seen people that use OpenStruct, Struct, and I had my own way to
do it
before this, but this seems a lot better.
-- 
You received this message because you are subscribed to the Google Groups
"Ruby on Rails: Talk" group.
To post to this group, send email to
rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org
To unsubscribe from this group, send email to
rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org
To view this discussion on the web visit
https://groups.google.com/d/msg/rubyonrails-talk/-/ojeZ8-j7EEYJ.
For more options, visit https://groups.google.com/groups/opt_out.
Ilia Bylich
2012-Sep-23  12:11 UTC
Re: A super-easy and great way to implement Gem configuration
I am not sure that this way is simple. I usually use for gem configuration 
this code
require ''active_support/configurable''
module GemModule
  include ActiveSupport::Configurable
  class << self
    def setup
      yield config
    end
  end
end
And then you can write
GemModule.setup do |config|
  config.option1 = "value1"
  config.option2 = 2
end
And
GemModule.config.option1
# => "value1"
Moreover, you can define method_missing in you module and delegate unknown 
methods to self.config. Then you will be able to write
GemModule.option1
# => "value1"
http://api.rubyonrails.org/classes/ActiveSupport/Configurable.html
суббота, 22 сентября 2012 г., 18:38:22 UTC+3 пользователь gsw
написал:>
> Just did this in my constance gem, and totally love it as a way to add 
> configuration or options configurability to your gem:
>
>
http://stufftohelpyouout.blogspot.com/2012/09/forget-struct-and-openstruct-flexible.html
>
> like:
>
> module MyModule
>   class << self
>     attr_accessor :debug, :proc, :some_mapping
>     def configure(&block); yield; end
>   end
> end
>
>
> I''ve seen people that use OpenStruct, Struct, and I had my own way
to do
> it before this, but this seems a lot better.
>
-- 
You received this message because you are subscribed to the Google Groups
"Ruby on Rails: Talk" group.
To post to this group, send email to
rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org
To unsubscribe from this group, send email to
rubyonrails-talk+unsubscribe@googlegroups.com.
To view this discussion on the web visit
https://groups.google.com/d/msg/rubyonrails-talk/-/AE0JhCfmW6oJ.
For more options, visit https://groups.google.com/groups/opt_out.
On Sunday, September 23, 2012 8:11:43 AM UTC-4, Ilia Bylich wrote:> > I am not sure that this way is simple. I usually use for gem configuration > this code > > require ''active_support/configurable'' > module GemModule > include ActiveSupport::Configurable > > class << self > def setup > yield config > end > end > end > > And then you can write > > GemModule.setup do |config| > config.option1 = "value1" > config.option2 = 2 > end > > And > > GemModule.config.option1 > # => "value1" > > Moreover, you can define method_missing in you module and delegate unknown > methods to self.config. Then you will be able to write > GemModule.option1 > # => "value1" > > http://api.rubyonrails.org/classes/ActiveSupport/Configurable.html > >That works, but it has the following disadvantages over the method I described: 1. If you use ActiveSupport::Configurable you are tied to using activesupport/Rails. Many times you want to write the Gem so that it isn''t Rails-specific and want to limit dependencies. 2. I know Rails uses the "pass the config into the block thing", but it isn''t as DRY as not typing "config." before each parameter. 3. By defining the attr_accessors, you limit the chance that a user will mistype/misspell a variable. 4. The way you described allows the user to define config parameters with procs and lambdas, but the way I describe allows the user to define "config parameters" as procs, lambdas, and methods, i.e. the user can actually just define a variable as: def some_variable_name # some really involved implementation here, even refactored into various methods, etc. in the block. end See more at: http://stufftohelpyouout.blogspot.com/2012/09/forget-struct-and-openstruct-flexible.html Hope that helps. -- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To view this discussion on the web visit https://groups.google.com/d/msg/rubyonrails-talk/-/zcMdqXgj6gYJ. For more options, visit https://groups.google.com/groups/opt_out.
Just as an update, I had bugs in the previous code provided and fixed with 
help from Jesús Gabriel y Galán and Calvin B. on the list in this post: 
http://www.ruby-forum.com/topic/4406183
module MyModule
  class << self
    attr_accessor :debug, :proc_or_lambda, :some_array, :some_hash, :time 
    def configure(&blk); class_eval(&blk); end
  end
end
and can configure like:
MyModule.debug = true
MyModule.proc_or_lambda = lambda{|a,b| puts "a=#{a} b=#{b}"}
# ...
or
MyModule.configure do
  @debug = true
  @proc_or_lambda = lambda{|a,b| puts "a=#{a} b=#{b}"}
  @some_array = [:foo,:bar]
  @some_mapping = {:key => ''value''}
  def self.time; Time.now; end
end
or
MyModule.configure do
  self.debug = true
  self.proc_or_lambda = lambda{|a,b| puts "a=#{a} b=#{b}"}
  self.some_array = [:foo,:bar]
  self.some_mapping = {:key => ''value''}
  def self.time; Time.now; end
end
Posted here with more examples:
http://stufftohelpyouout.blogspot.com/2012/09/forget-struct-and-openstruct-flexible.html
On Sunday, September 23, 2012 11:56:49 AM UTC-4, gsw
wrote:>
> On Sunday, September 23, 2012 8:11:43 AM UTC-4, Ilia Bylich wrote:
>>
>> I am not sure that this way is simple. I usually use for gem 
>> configuration this code
>>
>> require ''active_support/configurable''
>> module GemModule
>>   include ActiveSupport::Configurable
>>
>>   class << self
>>     def setup
>>       yield config
>>     end
>>   end
>> end
>>
>> And then you can write
>>
>> GemModule.setup do |config|
>>   config.option1 = "value1"
>>   config.option2 = 2
>> end
>>
>> And
>>
>> GemModule.config.option1
>> # => "value1"
>>
>> Moreover, you can define method_missing in you module and delegate 
>> unknown methods to self.config. Then you will be able to write
>> GemModule.option1
>> # => "value1"
>>
>> http://api.rubyonrails.org/classes/ActiveSupport/Configurable.html
>>
>>
> That works, but it has the following disadvantages over the method I 
> described:
>
> 1. If you use ActiveSupport::Configurable you are tied to using 
> activesupport/Rails. Many times you want to write the Gem so that it
isn''t
> Rails-specific and want to limit dependencies.
> 2. I know Rails uses the "pass the config into the block thing",
but it
> isn''t as DRY as not typing "config." before each
parameter.
> 3. By defining the attr_accessors, you limit the chance that a user will 
> mistype/misspell a variable.
> 4. The way you described allows the user to define config parameters with 
> procs and lambdas, but the way I describe allows the user to define
"config
> parameters" as procs, lambdas, and methods, i.e. the user can actually
just
> define a variable as:
>
> def some_variable_name
>   # some really involved implementation here, even refactored into various 
> methods, etc. in the block.
> end
>
> See more at: 
>
http://stufftohelpyouout.blogspot.com/2012/09/forget-struct-and-openstruct-flexible.html
>
> Hope that helps.
>
-- 
You received this message because you are subscribed to the Google Groups
"Ruby on Rails: Talk" group.
To post to this group, send email to
rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org
To unsubscribe from this group, send email to
rubyonrails-talk+unsubscribe@googlegroups.com.
To view this discussion on the web visit
https://groups.google.com/d/msg/rubyonrails-talk/-/1HjVIJoIanAJ.
For more options, visit https://groups.google.com/groups/opt_out.