Pastie now auto-senses if line-wrap is a bad or good idea. Feedback?
## mark a section (Learn more)
# decribe_properties(attribute, valid_vales, invalid_values) # {{{ # Ensures that a Property with the specified attribute is: # -Valid for each of the values in the 'valid_values' array. # -Invalid for each of the values in the 'invalid_values' array. # # The 'attribute' arg must be a symbol. # The '*_values' args must be arrays in this format: # [ 'Description', 'value' ] # Eg: # [ 'can have multiple spaces', '123 A Street With A Long Name', # "can have a '", "123 O'Connor Ave" ] # # Returns # -1 if the 'attribute' arg is invalid. # -2 if the 'valid_values' arg is invalid. # -3 if the 'invalid_values' arg is invalid. # def describe_properties(attribute, valid_values, invalid_values) return -1 unless attribute.is_a? Symbol return -2 unless valid_values.is_a? Array return -3 unless invalid_values.is_a? Array describe Property, "attribute '#{attribute}' that is valid" do # Ensure that each valid value produces a valid property and no error message. valid_values.in_groups_of(2) do |description, value| it description do p = build_property({:"#{attribute}" => value}) p.save p.should be_valid p.should have(0).error_on(:"#{attribute}") end end # Ensure that each invalid value produces an invalid property and related error message. invalid_values.in_groups_of(2) do |description, value| it description do p = build_property({:"#{attribute}" => value}) p.save p.should_not be_valid p.should have_at_least(1).error_on(:"#{attribute}") end end end end # }}} # Test data {{{ valid_addresses = [ # {{{ 'can have multiple spaces', '267 A Street With A Long Name', 'can have 1 letter after the street number', '267B Albany Ave', "can have a '", "123 S'omewhere Street", 'can have a -', '123 Some-Where', 'can have a ,', '123 Some, Weird Street', 'can have only 4 characters', '1 Fo', 'can have only 5 characters', '1 Foo', 'can have 127 characters', '123 Almost at maximum lengthxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', 'can have 128 characters', '123 Maximum lengthxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', ] # }}} invalid_addresses = [ # {{{ "can't be empty", '', "can't be only 3 characters", 'xxx', "can't be missing a street number", 'Bloor Street', "can't have 2 letters after the street number", '123AB Some Street', "can't have a \"", '123 Double " Quote', "can't have an !", '123 Exclamation!', "can't have an &", '123 Amp&ersand', "can't have a 1-letter street name", '123 F', "can't be 129 characters", '123 Too longxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', ] # }}} # End test data. }}} describe_properties :address, valid_addresses, invalid_addresses
This paste will be private.
From the Design Piracy series on my blog: