Good info Jeremy. Thanks for the thorough review and comments. Making a 
plugin out of the code seems like a good idea. Will try and find some time 
to make the refactor soon. :)

mj

On Thursday, July 19, 2012 1:17:28 AM UTC-7, Jeremy Evans wrote:
>
> On Wednesday, July 18, 2012 10:54:32 PM UTC-7, mjackson wrote:
>>
>> I released a gem a little while ago for doing factories with Sequel. It's 
>> called, ever so creatively, sequel-factory.
>>
>> http://mjijackson.github.com/sequel-factory
>>
>> From the README:
>>
>> Sequel::Factory supports the following features:
>>
>> * Multiple factories per model, with different attributes
>> * Inclusion of the attributes of one factory into another
>> * Ability to configure the Sequel::Model method used by a factory to 
>> generate instances (defaults to create)
>> * Ability to override factory-generated values on instance creation
>> * Sequential attributes (e.g. auto-incrementing ids)
>>
>> Also, the actual code is only ~100 lines of Ruby, so it should be fairly 
>> straightforward for you to understand.
>>
>>
> Looks good.  Note that the recommended way to do this in Sequel  would be 
> to make it a model plugin, and load it via:
>
>   Sequel::Model.plugin :factory
>
> The change should be pretty simple, changing your "class Model" to "module 
> Plugins; module Factory; module ClassMethods", and defining regular methods 
> instead of singleton methods.  You may want to take a look at the plugins 
> that ship with Sequel to get an idea of how things are structured.  Another 
> change that should be made if you turn this into the plugin is to 
> initialize the @factories and @factory_method variable in the plugin's 
> apply method, and copy it into the subclass inside inherited (see below for 
> reasoning).
>
> One of the advantages of the plugins route is that the methods are added 
> to a module that extends the Model class, instead of the model's singleton 
> class, so it is easy to override them and call super.  With Ruby 2.0's 
> Module#prepend, this won't be as important, but it's still nice.  Another 
> benefit is that your code will be more similar to other Sequel code, so 
> it'll be easier for Sequel users to understand and extend.
>
> Other notes:
>
> * make_with should probably use ensure, so that if make raises an 
> exception, the @factory_method is still reset to the previous value.
> * When using model inheritance (Employee < Person < Sequel::Model), 
> factories defined in the parent class (Person) aren't copied into the 
> subclass (Employee) when subclassing.  Plugins usually handle these cases 
> by duping the variables inside inherited.
> * Calling superclass.method if superclass.defined(:method) is generally 
> not done in Sequel.  Sequel uses a copy-on-subclassing approach (by 
> overriding inherited) so that the data already exists in the subclass.  
> This decouples the subclass data from the superclass data after the 
> subclass has been created.
>
> Thanks,
> Jeremy
>

-- 
You received this message because you are subscribed to the Google Groups 
"sequel-talk" group.
To view this discussion on the web visit 
https://groups.google.com/d/msg/sequel-talk/-/5zNnHfb779sJ.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/sequel-talk?hl=en.

Reply via email to