Skip to content

Instantly share code, notes, and snippets.

@jdickey
Created April 26, 2012 07:29
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jdickey/2497174 to your computer and use it in GitHub Desktop.
Save jdickey/2497174 to your computer and use it in GitHub Desktop.
Assigning to field enumerated by Enumerize gem fails.

Problems with Assigning Values to enumerized Fields

I have a fairly simple data model that I wish to include an enumerated value in. If I set the :default value of that field, it has that value when the model is instantiated. If I explicitly assign a symbol from among my list of defined values to that field, it becomes an ordinary Symbol with no enumeration magic. If I do not assign a default value in the model definition, then the value is nil and cannot be modified.

Attached files:

  • 01-output.txt - snippet of output from running the spec
  • 02-article.rb - the data model with the enumerated field (article_status)
  • 03-article_spec.rb - (part of) an RSpec specfile for article.rb
  • 04-schema.rb - my current db/schema.rb file, including the articles table definition
  • 05-articles_cell_spec_helpers.rb - a helper file used by article_spec.rb, particularly ArticleCellSpecHelpers::stubbed_article et al.
  • 06-recent_updates_data.rb - test fixture data.

Any help greatly appreciated.

NOTE: I am working on a simplified bug report following Jon Leighton's great example; I'll either replace this gist or link to a new one when that's done.

# Snippet of Terminal output from running 'rake spec:models'; note the single failure
Article
basic, existential structure
***** Article is not valid because Article status is not included in the list
starts with non-blank attributes (FAILED - 1)
is an ActiveRecord subclass
has expected instance methods
#publish
has expected class methods
#top
#newest
validation
it fails with an empty title
it fails with an empty title_image
it fails with empty content
support for contributions
including reporting
states that a newly-published article has no contributions
associations
has an author
class Article < ActiveRecord::Base
include Enumerize
attr_accessor :meldd, :article_status
validates_presence_of :title, :title_image, :content, :article_status
# keywords needs to be set in order to publish
belongs_to :author, :class_name => 'User'
enumerize :article_status, :in => [:new, :draft, :private, :published], :default => :new
def publish
@meldd.add_entry self
end
def proposed_contributions
[]
end
def self.top
end
def self.newest
end
end
require 'spec_helper'
require_relative '../support/cells/articles/recent_updates_data'
describe Article do
include ArticlesCellSpecHelpers
before(:each) do
@user = stubbed_user recent_updates_data.first[:author]
@it = stubbed_article(:user => @user)
end
describe "basic, existential structure" do
it "starts with non-blank attributes" do
@it.id.should be_a_positive_integer
@it.title.should_not be_an_empty_string
@it.content.should_not be_an_empty_string
@it.keywords.should be_a_JSON_array_of String
if @it.assoc_links
@it.assoc_links.should be_a_JSON_hash_of String, String
end
@it.title_image.should_not be_an_empty_string
@it.created_at.should be_an_earlier_datetime_than DateTime.now
@it.updated_at.should be_an_earlier_datetime_than DateTime.now
@it.author_id.should == @user.id
@it.should enumerize(:article_status).in(:new, :draft, :private, :published)
@it.article_status = :published
puts "***** Article is not valid because " + @it.errors.full_messages.join(';') unless @it.valid?
@it.should be_valid
end
# more specs follow...
end
end
# encoding: UTF-8
ActiveRecord::Schema.define(:version => 20120426052951) do
create_table "articles", :force => true do |t|
t.string "title"
t.text "keywords"
t.text "content"
t.text "assoc_links"
t.string "title_image"
t.datetime "created_at", :null => false
t.datetime "updated_at", :null => false
t.integer "author_id"
t.string "article_status"
end
# other tables follow...
end
require_relative 'cells/articles/recent_updates_data'
module ArticlesCellSpecHelpers
def get_value_at_index_or params_hash, index, &block
ret = params_hash[index] if params_hash.has_key? index
ret ||= yield params_hash
ret
end
def stubbed_article(params = {})
user = get_value_at_index_or(params, :user) { stubbed_user "Joe Blow"}
data = recent_updates_data().first
[:author, :meldd].each {|field| data.delete field}
[:assoc_links, :keywords].each {|field| data[field] = data[field].to_json}
data[:author_id] = user.id
data[:status] = :published
stub_model Article, data
end
def stubbed_user(pen_name)
user = stub_model User, :pen_name => pen_name,
:email => pen_name.downcase.scan(/\S+/).flatten.join('.') + '@example.com'
end
def stubbed_contribution_core(params_in = {})
ContributionCore.new stubbed_contribution_core_params(params_in)
end
def stubbed_contribution_core_params(params_in = {})
author = get_value_at_index_or(params_in, :author) { stubbed_user "Effable Hack"}
article = get_value_at_index_or(params_in, :article) { stubbed_article :user => author }
contributor = get_value_at_index_or(params_in, :contributor) { stubbed_user "X S Critic" }
original_content = get_value_at_index_or(params_in, :original_content) do
article.content.match(/(\S+\s+){0,5}/)[0].rstrip
end
original_start = get_value_at_index_or(params_in, :original_start) { 0 }
{
:article_id => article.id,
:contributor_id => contributor.id,
:original_content => original_content,
:original_start => original_start
}
end
end
module ArticlesCellSpecHelpers
def recent_updates_data(the_meldd = nil)
loremipsum = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque in lectus vitae massa cursus dignissim non sed lorem. Quisque ullamcorper turpis et justo aliquam cursus. Aenean risus augue, rutrum eget iaculis id, placerat eget quam. Cras pharetra dolor nec ante vehicula fermentum. Donec tincidunt mi felis. Aliquam eros metus, dictum eu auctor sed, lobortis eget magna. Sed mattis sapien eu leo suscipit ut hendrerit tellus scelerisque. Phasellus eu tortor quis urna vulputate venenatis. Aliquam adipiscing suscipit nulla, at consequat nunc bibendum nec. In hac habitasse platea dictumst. Maecenas et leo sem. Nunc consequat mi nec ante tempor ut lacinia mi faucibus.\nIn nec tortor tellus, nec varius urna. Donec laoreet molestie viverra. Nullam mauris risus, ultricies non aliquet nec, lobortis eget ipsum. Curabitur interdum, risus non bibendum viverra, orci elit venenatis quam, nec tempus eros risus eget risus. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Etiam porttitor ultricies tempor. Cras dapibus mollis eros porta pharetra. Vestibulum sodales ipsum sed eros cursus molestie. Suspendisse potenti. Quisque scelerisque eros sed magna varius eget congue diam faucibus. Suspendisse eros diam, egestas sed sodales pellentesque, bibendum vitae erat. Etiam felis arcu, interdum vitae aliquam in, euismod vitae sem. Nullam auctor elementum erat, id ultrices leo porttitor vitae.\nCras in posuere tellus. Donec ut turpis a neque malesuada pulvinar. Etiam eleifend orci sit amet ligula commodo nec ultrices turpis lobortis. Maecenas nec sodales nibh. Ut dignissim lorem sit amet elit iaculis sed laoreet tortor sagittis. Cras sit amet nunc justo. Sed tempor vulputate justo a scelerisque. Suspendisse vitae nunc neque. Phasellus sollicitudin leo laoreet sem facilisis sodales. Praesent tempus cursus elit, quis rhoncus purus pellentesque eu. Proin sit amet metus eget nunc pellentesque rutrum. Quisque ornare urna in dolor tempus sed aliquet risus faucibus. Quisque ultrices eros id felis ornare suscipit.\nIn malesuada accumsan cursus. Aliquam felis libero, scelerisque in pretium vitae, scelerisque nec lorem. Nullam aliquet dolor ipsum. Praesent imperdiet odio at lectus convallis venenatis. Etiam sodales, leo at pellentesque viverra, leo est vestibulum leo, eget rutrum orci leo et ipsum. Sed hendrerit lorem eu ante adipiscing imperdiet non at enim. Nam tellus ipsum, vulputate non sollicitudin nec, facilisis sed lorem. Morbi egestas ullamcorper massa, ac ullamcorper sapien venenatis nec. Morbi et ante magna, eget auctor risus. Pellentesque imperdiet aliquam feugiat. Nam venenatis, massa id imperdiet porttitor, sapien lectus aliquam nunc, venenatis dignissim neque magna quis elit. Pellentesque hendrerit mauris ac arcu volutpat consectetur. Donec et arcu lectus, ut gravida libero.\nNunc blandit pulvinar neque, sed pretium nulla dictum ut. In ut fringilla est. Curabitur feugiat tellus nec orci congue interdum. Donec sit amet nulla tortor, pellentesque cursus magna. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Proin sit amet justo id nisi consectetur tempor. Fusce laoreet tristique tempus. Morbi tempor vestibulum vulputate. Phasellus et rhoncus velit. Pellentesque in diam vitae felis ultrices rhoncus.\n"
article_data = [
{:name => 'article1',
:title => 'The First Article: New Thinking',
:keywords => ['keyword', 'key word'],
:assoc_links => {'http://www.example.com' => 'An Example of Something'},
:author => 'John Doe',
},
{:name => 'Article 2',
:title => 'Tech Trends 1789',
:keywords => ['keyword', 'keyword2'],
:assoc_links => {'http://www.example.net' => 'A Trendy Site'},
:author => 'William Brokenbowe',
},
{:name => 'Green',
:title => 'Green Faces of a Modern City',
:keywords => ['key word', 'keyword2'],
:assoc_links => {'http://www.example.org' => "It's Not Easy Being Green"},
:author => 'Kermit D. Broga'
},
{:name => 'Odd Partners',
:title => 'Bentley-Dannone Joint Venture',
:keywords => ['keyword1', 'keyword2', 'keyword3'],
:assoc_links => {'http://www.example.com/bentley' => 'More details on the partnership'},
:author => 'Kermit D. Broga',
},
{:name => 'NUS Ballast Tech',
:title => 'NUS develops new technology to treat ballast water',
:keywords => ['keyword2'],
:assoc_links => {'http://www.nus.edu.sg' => 'National University of Singapore'},
:author => 'John Doe',
},
{:name => 'DHL Schools',
:title => 'DHL ships millions of new books to schools',
:keywords => ['keyword', 'keyword2'],
:assoc_links => {'www.example.com.ph' => 'This domain is available?!?'},
:author => 'Irene Doe',
}
]
article_data.each_with_index do |item, index|
item[:id] = index + 1
item[:content] = loremipsum
item[:title_image] = 'image1.png'
item[:meldd] = the_meldd
item[:created_at] = DateTime.strptime("2012-04-05T#{22 - index}:05:15+08:00").to_datetime
item[:updated_at] = DateTime.strptime("2012-04-05T#{22 - index}:05:15+08:00").to_datetime
end
# article_data will be returned
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment