hobo_fields 1.3.0.RC4 → 1.3.0.pre10

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGES.txt CHANGED
@@ -15,12 +15,12 @@
15
15
 
16
16
  EnumString -- now defines constants on the class for each value in
17
17
  the enum
18
-
18
+
19
19
  Also, won't define an is_foo? method if that already exists
20
20
 
21
21
  Removing HoboFields::Percentage -- this is better handled as an
22
22
  application specific type
23
-
23
+
24
24
  For example, is a percentage an fixnum or a float? Is 101% valid
25
25
  or invalid?
26
26
 
@@ -28,7 +28,7 @@
28
28
 
29
29
  *Breaking Change* EnumString: Change to automatically defined
30
30
  class methods on EnumString classes
31
-
31
+
32
32
  It used to be that if you did EnumString.for(:foo, :baa), your
33
33
  class had methods foo, baa and the instance got methods foo?
34
34
  and baa?. There was a big problem with name clashes with other
data/Rakefile CHANGED
@@ -1,7 +1,5 @@
1
1
  require 'rubygems'
2
2
  require 'active_record'
3
- require 'tmpdir'
4
-
5
3
  ActiveRecord::ActiveRecordError # hack for https://rails.lighthouseapp.com/projects/8994/tickets/2577-when-using-activerecordassociations-outside-of-rails-a-nameerror-is-thrown
6
4
 
7
5
  RUBY = File.join(Config::CONFIG['bindir'], Config::CONFIG['ruby_install_name']).sub(/.*\s.*/m, '"\&"')
@@ -13,7 +11,7 @@ require 'hobo_support'
13
11
  require 'hobo_fields'
14
12
 
15
13
  GEM_ROOT = File.expand_path('../', __FILE__)
16
- TESTAPP_PATH = File.join Dir.tmpdir, 'hobo_fields_testapp'
14
+ TESTAPP_PATH = '/tmp/hobo_fields_testapp'
17
15
  BIN = File.expand_path('../bin/hobofields', __FILE__)
18
16
  require 'hobo_support/common_tasks'
19
17
  include HoboSupport::CommonTasks
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.3.0.RC4
1
+ 1.3.0.pre10
data/bin/hobofields CHANGED
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env ruby
2
2
  require 'fileutils'
3
3
 
4
- if ENV["HOBODEV"]
5
- dev_root = File.expand_path ENV["HOBODEV"], FileUtils.pwd
4
+ if ENV["HOBO_DEV_ROOT"]
5
+ dev_root = File.expand_path ENV["HOBO_DEV_ROOT"], FileUtils.pwd
6
6
  $:.unshift "#{dev_root}/hobo_support/lib"
7
7
  else
8
8
  require 'rubygems'
@@ -12,7 +12,7 @@ begin
12
12
  require 'hobo_support/command'
13
13
  rescue LoadError
14
14
  puts "The 'hobo_support' gem is not installed.
15
- You probably need to set the HOBODEV environment variable to the local repository path."
15
+ You probably need to set the HOBO_DEV_ROOT environment variable to the local repository path."
16
16
  exit
17
17
  end
18
18
 
data/hobo_fields.gemspec CHANGED
@@ -1,6 +1,5 @@
1
1
  name = File.basename( __FILE__, '.gemspec' )
2
2
  version = File.read(File.expand_path('../VERSION', __FILE__)).strip
3
- require 'date'
4
3
 
5
4
  Gem::Specification.new do |s|
6
5
 
@@ -11,6 +10,7 @@ Gem::Specification.new do |s|
11
10
  s.summary = 'Rich field types and migration generator for Rails'
12
11
  s.description = 'Rich field types and migration generator for Rails'
13
12
 
13
+ s.add_runtime_dependency('rails', [">= 3.0.0"])
14
14
  s.add_runtime_dependency('hobo_support', ["= #{version}"])
15
15
  s.add_development_dependency('rubydoctest', [">= 0"])
16
16
  s.add_development_dependency('redcloth', [">= 0"]) # for testing rich types
@@ -18,10 +18,6 @@ module Generators
18
18
  self.join_table
19
19
  end
20
20
 
21
- def table_exists?
22
- ActiveRecord::Migration.table_exists? table_name
23
- end
24
-
25
21
  def field_specs
26
22
  i = 0
27
23
  foreign_keys.inject({}) do |h, v|
@@ -130,7 +126,7 @@ module Generators
130
126
  all_models = table_model_classes
131
127
  hobo_models = all_models.select { |m| m.try.include_in_migration && m.name.underscore.not_in?(ignore_model_names) }
132
128
  non_hobo_models = all_models - hobo_models
133
- db_tables = connection.tables - Migrator.ignore_tables.*.to_s - non_hobo_models.reject { |t| t.try.hobo_shim? }.*.table_name
129
+ db_tables = connection.tables - Migrator.ignore_tables.*.to_s - non_hobo_models.*.table_name
134
130
  [hobo_models, db_tables]
135
131
  end
136
132
 
@@ -391,8 +387,6 @@ module Generators
391
387
  def drop_index(table, name)
392
388
  # see https://hobo.lighthouseapp.com/projects/8324/tickets/566
393
389
  # for why the rescue exists
394
- max_length = connection.index_name_length
395
- name = name[0,max_length] if name.length > max_length
396
390
  "remove_index :#{table}, :name => :#{name} rescue ActiveRecord::StatementInvalid"
397
391
  end
398
392
 
@@ -28,17 +28,7 @@ module HoboFields
28
28
  def to_add_statement(new_table_name)
29
29
  r = "add_index :#{new_table_name}, #{fields.*.to_sym.inspect}"
30
30
  r += ", :unique => true" if unique
31
- if default_name?
32
- check_name = @model.connection.index_name(self.table, :column => self.fields)
33
- else
34
- check_name = name
35
- end
36
- if check_name.length > @model.connection.index_name_length
37
- r += ", :name => '#{name[0,@model.connection.index_name_length]}'"
38
- $stderr.puts("WARNING: index name #{check_name} too long, trimming")
39
- else
40
- r += ", :name => '#{name}'" unless default_name?
41
- end
31
+ r += ", :name => '#{name}'" unless default_name?
42
32
  r
43
33
  end
44
34
 
@@ -22,16 +22,13 @@ module HoboFields
22
22
  inheriting_cattr_reader :index_specs => []
23
23
  inheriting_cattr_reader :ignore_indexes => []
24
24
 
25
- # eval avoids the ruby 1.9.2 "super from singleton method ..." error
26
- eval %(
27
- def self.inherited(klass)
28
- fields do |f|
29
- f.field(inheritance_column, :string)
30
- end
31
- index(inheritance_column)
32
- super
25
+ def self.inherited(klass)
26
+ fields do |f|
27
+ f.field(inheritance_column, :string)
33
28
  end
34
- )
29
+ index(inheritance_column)
30
+ super
31
+ end
35
32
 
36
33
  def self.index(fields, options = {})
37
34
  # don't double-index fields
@@ -170,11 +167,7 @@ module HoboFields
170
167
 
171
168
  def self.add_index_for_field(name, args, options)
172
169
  to_name = options.delete(:index)
173
- unless to_name
174
- # passing :unique => true doesn't do anything without an index
175
- Rails.logger.error('ERROR: passing :unique => true without :index => true does nothing. Use :unique instead.') if options[:unique]
176
- return
177
- end
170
+ return unless to_name
178
171
  index_opts = {}
179
172
  index_opts[:unique] = :unique.in?(args) || options.delete(:unique)
180
173
  # support :index => true declaration
@@ -4,10 +4,10 @@ module HoboFields
4
4
 
5
5
  PERMITTED_TAGS = %w(a abbr acronym address b bdo big blockquote br caption center cite code colgroup dd del dfn dir
6
6
  div dl dt em fieldset font h1 h2 h3 h4 h5 h6 i img ins kbd label legend li map menu ol optgroup
7
- option p pre q s samp select small span strike strong sub sup table tbody td textarea tfoot
7
+ option p pre q s samp select small span strike strong sub sup tbody td textarea tfoot
8
8
  th thead tr tt u ul var)
9
9
 
10
- PERMITTED_ATTRIBUTES = %w(href title class style align name src label target border)
10
+ PERMITTED_ATTRIBUTES = %w(href title class style align name src label target)
11
11
 
12
12
  class Helper
13
13
  include ActionView::Helpers::SanitizeHelper
@@ -1,5 +1,3 @@
1
- require 'active_support/core_ext/string/output_safety'
2
-
3
1
  module HoboFields
4
2
  module Types
5
3
  class EmailAddress < String
@@ -15,7 +13,7 @@ module HoboFields
15
13
  end
16
14
 
17
15
  def to_html(xmldoctype = true)
18
- ERB::Util.html_escape(self).sub('@', " at ").gsub('.', ' dot ')
16
+ self.sub('@', " at ").gsub('.', ' dot ')
19
17
  end
20
18
 
21
19
  HoboFields.register_type(:email_address, self)
@@ -85,7 +85,7 @@ module HoboFields
85
85
  end
86
86
 
87
87
  def to_html(xmldoctype = true)
88
- self.class.translated_values[self].html_safe
88
+ self.class.translated_values[self]
89
89
  end
90
90
 
91
91
  def ==(other)
@@ -5,11 +5,11 @@ module HoboFields
5
5
  COLUMN_TYPE = :string
6
6
 
7
7
  class << self
8
- attr_accessor :model_name
8
+ attr_accessor :table_name
9
9
  end
10
10
 
11
11
  def to_html(xmldoctype = true)
12
- I18n.t("activerecord.attributes.#{self.class.model_name.underscore}.lifecycle.states.#{self}", :default => self).html_safe
12
+ I18n.t("#{self.class.table_name}.states.#{self}", :default => self)
13
13
  end
14
14
  end
15
15
  end
@@ -7,7 +7,7 @@ module HoboFields
7
7
  HoboFields.register_type(:password, self)
8
8
 
9
9
  def to_html(xmldoctype = true)
10
- I18n.t("hobo.password_hidden", :default => "[password hidden]").html_safe
10
+ "[password hidden]"
11
11
  end
12
12
 
13
13
  end
@@ -3,7 +3,7 @@ module HoboFields
3
3
  class RawHtmlString < HoboFields::Types::Text
4
4
 
5
5
  def to_html(xmldoctype = true)
6
- self.html_safe
6
+ self
7
7
  end
8
8
 
9
9
  HoboFields.register_type(:raw_html, self)
@@ -5,7 +5,7 @@ module HoboFields
5
5
  HoboFields.register_type(:raw_markdown, self)
6
6
 
7
7
  def to_html(xmldoctype = true)
8
- blank? ? "" : Markdown.new(self).to_html.html_safe
8
+ blank? ? "" : Markdown.new(self).to_html
9
9
  end
10
10
 
11
11
  end
@@ -5,7 +5,7 @@ module HoboFields
5
5
  COLUMN_TYPE = :text
6
6
 
7
7
  def self.declared(model, name, options)
8
- model.serialize name, options.delete(:class) || Object
8
+ model.serialize name, options.delete(:class)
9
9
  end
10
10
 
11
11
  HoboFields.register_type(:serialized, self)
@@ -1,12 +1,13 @@
1
- require 'active_support/core_ext/string/output_safety'
2
1
  module HoboFields
3
2
  module Types
4
3
  class Text < String
5
4
 
5
+ HTML_ESCAPE = { '&' => '&amp;', '"' => '&quot;', '>' => '&gt;', '<' => '&lt;' }
6
+
6
7
  COLUMN_TYPE = :text
7
8
 
8
9
  def to_html(xmldoctype = true)
9
- ERB::Util.html_escape(self).gsub("\n", "<br#{xmldoctype ? ' /' : ''}>\n").html_safe
10
+ gsub(/[&"><]/) { |special| HTML_ESCAPE[special] }.gsub("\n", "<br#{xmldoctype ? ' /' : ''}>\n")
10
11
  end
11
12
 
12
13
  HoboFields.register_type(:text, self)
@@ -12,7 +12,7 @@ module HoboFields
12
12
  else
13
13
  textilized = RedCloth.new(self, [ :hard_breaks ])
14
14
  textilized.hard_breaks = true if textilized.respond_to?("hard_breaks=")
15
- HoboFields::SanitizeHtml.sanitize(textilized.to_html)
15
+ textilized.to_html
16
16
  end
17
17
  end
18
18
 
data/lib/hobo_fields.rb CHANGED
@@ -1,7 +1,6 @@
1
1
  require 'hobo_support'
2
2
 
3
3
  ActiveSupport::Dependencies.autoload_paths |= [ File.dirname(__FILE__) ]
4
- ActiveSupport::Dependencies.autoload_once_paths |= [ File.dirname(__FILE__) ]
5
4
 
6
5
  module Hobo
7
6
  # Empty class to represent the boolean type.
@@ -11,15 +10,13 @@ end
11
10
  module HoboFields
12
11
 
13
12
  VERSION = File.read(File.expand_path('../../VERSION', __FILE__)).strip
14
- @@root = Pathname.new File.expand_path('../..', __FILE__)
15
- def self.root; @@root; end
16
13
 
17
14
  extend self
18
15
 
19
16
  PLAIN_TYPES = {
20
17
  :boolean => Hobo::Boolean,
21
18
  :date => Date,
22
- :datetime => ActiveSupport::TimeWithZone,
19
+ :datetime => (defined?(ActiveSupport::TimeWithZone) ? ActiveSupport::TimeWithZone : Time),
23
20
  :time => Time,
24
21
  :integer => Integer,
25
22
  :decimal => BigDecimal,
@@ -47,7 +44,9 @@ module HoboFields
47
44
  }
48
45
 
49
46
  @field_types = PLAIN_TYPES.with_indifferent_access
47
+
50
48
  @never_wrap_types = Set.new([NilClass, Hobo::Boolean, TrueClass, FalseClass])
49
+
51
50
  attr_reader :field_types
52
51
 
53
52
  def to_class(type)
@@ -59,32 +58,36 @@ module HoboFields
59
58
  end
60
59
  end
61
60
 
61
+
62
62
  def to_name(type)
63
63
  field_types.key(type) || ALIAS_TYPES[type]
64
64
  end
65
65
 
66
+
66
67
  def can_wrap?(type, val)
67
68
  col_type = type::COLUMN_TYPE
68
69
  return false if val.blank? && (col_type == :integer || col_type == :float || col_type == :decimal)
69
70
  klass = Object.instance_method(:class).bind(val).call # Make sure we get the *real* class
70
- init_method = type.instance_method(:initialize)
71
- [-1,1].include?(init_method.arity) &&
72
- init_method.owner != Object.instance_method(:initialize).owner &&
73
- !@never_wrap_types.any? { |c| klass <= c }
71
+ arity = type.instance_method(:initialize).arity
72
+ (arity == 1 || arity == -1) && !@never_wrap_types.any? { |c| klass <= c }
74
73
  end
75
74
 
75
+
76
76
  def never_wrap(type)
77
77
  @never_wrap_types << type
78
78
  end
79
79
 
80
+
80
81
  def register_type(name, klass)
81
82
  field_types[name] = klass
82
83
  end
83
84
 
85
+
84
86
  def plain_type?(type_name)
85
87
  type_name.in?(PLAIN_TYPES)
86
88
  end
87
89
 
90
+
88
91
  def standard_class(name)
89
92
  class_name = STANDARD_TYPES[name]
90
93
  "HoboFields::Types::#{class_name}".constantize if class_name
@@ -5,7 +5,7 @@ Our test requires to prepare the testapp for a different environment:
5
5
 
6
6
  doctest_require: ENV["RAILS_ENV"] = 'mysql_test'; 'prepare_testapp'
7
7
 
8
- >> system "cd #{TESTAPP_PATH} && rake db:setup"
8
+ >> system "cd #{TEST_APP_ROOT} && rake db:setup"
9
9
  => true
10
10
 
11
11
  >> p Rails.env
@@ -71,5 +71,5 @@ Cleanup
71
71
 
72
72
  >> nuke_model_class(Product)
73
73
  >> ActiveRecord::Base.connection.execute "drop table `products`;"
74
- >> system "cd #{TESTAPP_PATH} && rake db:drop RAILS_ENV=mysql_test"
74
+ >> system "cd #{TEST_APP_ROOT} && rake db:drop RAILS_ENV=mysql_test"
75
75
  {.hidden}
@@ -1,8 +1,7 @@
1
1
  require 'fileutils'
2
2
  system %(rake test:prepare_testapp)
3
- TESTAPP_PATH = '/tmp/hobo_fields_testapp'
4
- FileUtils.chdir TESTAPP_PATH
5
- require "#{TESTAPP_PATH}/config/environment"
3
+ FileUtils.chdir '/tmp/hobo_fields_testapp'
4
+ require 'config/environment'
6
5
  require 'rails/generators'
7
6
  Rails::Generators.configure!
8
7
 
@@ -7,13 +7,6 @@ Our test requires to prepare the testapp:
7
7
 
8
8
  doctest_require: 'prepare_testapp'
9
9
 
10
- >>
11
- ActiveRecord::Migration.create_table :articles do |t|
12
- t.text :body
13
- t.string :status
14
- end
15
- >>
16
-
17
10
  {.hidden}
18
11
 
19
12
  ## `to_html` method
@@ -33,33 +26,26 @@ This class defines the methods `to_html` to customize the way the type is render
33
26
  # Loud text always renderd in caps.
34
27
  # It's rude to shout too much so it's not allowed to be
35
28
  # longer than 100 characters
36
- >>
37
- class LoudText < String
29
+ class LoudText < String
38
30
 
39
- COLUMN_TYPE = :string
31
+ COLUMN_TYPE = :string
40
32
 
41
- HoboFields.register_type(:loud, self)
33
+ HoboFields.register_type(:loud, self)
42
34
 
43
- def validate
44
- "is too long (you shouldn't shout that much)" if length > 100
45
- end
35
+ def validate
36
+ "is too long (you shouldn't shout that much)" if length > 100
37
+ end
46
38
 
47
- def format
48
- # make sure we have enough exclamation marks
49
- self =~ /!!!$/ ? self + "!!!" : self
50
- end
39
+ def format
40
+ # make sure we have enough exclamation marks
41
+ self =~ /!!!$/ ? self + "!!!" : self
42
+ end
51
43
 
52
- def to_html(xmldoctype = true)
53
- upcase
54
- end
55
-
56
- end
57
- >>
44
+ def to_html(xmldoctype = true)
45
+ upcase
46
+ end
58
47
 
59
- >> LoudText.new("foO<BAa").to_html
60
- => "FOO<BAA"
61
- >> LoudText.new("foO<BAa").to_html.html_safe?
62
- => false
48
+ end
63
49
 
64
50
  If you place this class in `app/rich_types/loud_text.rb`, Hobo will load it automatically.
65
51
 
@@ -95,41 +81,10 @@ Provides validation of correct email address format.
95
81
  >> bad.validate
96
82
  => "is invalid"
97
83
 
98
- >> nasty = HoboFields::Types::EmailAddress.new("foo<nasty>&lt;nasty&gt;@baa.com")
99
- >> nasty.to_html
100
- => "foo&lt;nasty&gt;&lt;nasty&gt; at baa dot com"
101
- >> nasty.to_html.html_safe?
102
- => true
103
-
104
84
  ### `HoboFields::Types::HtmlString`
105
85
 
106
86
  `HtmlString` provides no special behavior. The main reason for using this type is that the `to_html` method does not do any html-escaping. Use this for columns that store raw HTML in the database.
107
87
 
108
- # no safety treatments are done by `to_html`.
109
- # even if `nasty.to_html` is actually unsafe, it is marked as html_safe.
110
- >> nasty = HoboFields::Types::HtmlString.new("p1<p>p2</p>p3<nasty>p4</nasty>p5&lt;script&gt;p6<script>p7</script>p8")
111
- >> nasty.to_html
112
- => "p1<p>p2</p>p3<nasty>p4</nasty>p5&lt;script&gt;p6<script>p7</script>p8"
113
- >> nasty.to_html.html_safe?
114
- => true
115
-
116
- >>
117
- class Article < ActiveRecord::Base
118
- fields do
119
- body HoboFields::Types::HtmlString
120
- end
121
- end
122
- >> article = Article.create!(:body => "</div>>>p1<p>p2</p>p3<nasty>p4</nasty>p5&lt;script&gt;p6<script>p7</script>p8")
123
- # some unsafe html fragements are removed on save,
124
- # but there's no guarantees that it is well-formed
125
- >> article.body
126
- => "</div>>>p1<p>p2</p>p3p4p5&lt;script&gt;p6p8"
127
- >> article.body == article.body.to_html
128
- => true
129
- >> article.body.to_html.html_safe?
130
- => true
131
-
132
-
133
88
  ### `HoboFields::Types::MarkdownString`
134
89
 
135
90
  `HoboFields::Types::MarkdownString` provides a `to_html` that renders markdown syntax into html. It requires the bluecloth gem.
@@ -142,17 +97,12 @@ Provides validation of correct email address format.
142
97
  And text can be *emphasised*
143
98
  )
144
99
  >> markdown.to_html
145
- => "<h1>This is a heading</h1>\n\n<p>And text can be <em>emphasised</em></p>"
146
- >> markdown.to_html.html_safe?
147
- => true
100
+ >> markdown = HoboFields::Types::MarkdownString.new "# This is a heading\n\nAnd text can be *emphasised*\n"
101
+ =>""
102
+ <h1>This is a heading</h1>
148
103
 
149
- # some unsafe html fragements are removed by `to_html`,
150
- # but there's no guarantees that it is well-formed
151
- >> markdown = HoboFields::Types::MarkdownString.new("</div>>>p1<script>p2")
152
- >> markdown.to_html
153
- => "<p></div>>>p1</p>"
154
- >> markdown.to_html.html_safe?
155
- => true
104
+ <p>And text can be <em>emphasised</em></p>
105
+ >>
156
106
 
157
107
  ### `HoboFields::Types::TextileString`
158
108
 
@@ -164,16 +114,7 @@ Provides validation of correct email address format.
164
114
  )
165
115
  >> textile.to_html
166
116
  => "<p>Text can be <em>emphasised</em></p>"
167
- >> textile.to_html.html_safe?
168
- => true
169
-
170
- # some unsafe html fragements are removed by `to_html`,
171
- # but there's no guarantees that it is well-formed
172
- >> textile = HoboFields::Types::TextileString.new("</div>>>p1<script>p2")
173
- >> textile.to_html
174
- => "<p></div>&gt;&gt;p1</p>"
175
- >> textile.to_html.html_safe?
176
- => true
117
+ >>
177
118
 
178
119
  ### `HoboFields::Types::Text`
179
120
 
@@ -183,68 +124,16 @@ Provides validation of correct email address format.
183
124
 
184
125
  Cat & Mouse)
185
126
  >> text.to_html
186
- => "Tom &amp; Jerry<br />\n<br />\n Cat &amp; Mouse"
187
- >> text.to_html.html_safe?
188
- => true
189
-
190
- # `to_html` always returns actually html-safe string
191
- >> text = HoboFields::Types::Text.new("</div>>>p1<script>p2")
192
- >> text.to_html
193
- => "&lt;/div&gt;&gt;&gt;p1&lt;script&gt;p2"
194
- >> text.to_html.html_safe?
195
- => true
127
+ =>
128
+ "Tom &amp; Jerry<br />
129
+ <br />
130
+ Cat &amp; Mouse"
131
+ >>
196
132
 
197
133
  ### `HoboFields::Types::PasswordString`
198
134
 
199
135
  `HoboFields::Types::PasswordString` provides a simple `to_html` to prevent accidental display of a password. It simply returns "`[password hidden]`". The type is also used to indicate the need for an `<input type='password'>`
200
136
 
201
- >> HoboFields::Types::PasswordString.new("pass<word>").to_html
202
- => "[password hidden]"
203
- >> HoboFields::Types::PasswordString.new("pass<word>").to_html.html_safe?
204
- => true
205
-
206
- ### `HoboFields::Serialized`
207
-
208
- This type lets you store an arbitrary object as serialized text into
209
- the database column. You can optionally pass the :class option to
210
- restrict the column type.
211
-
212
- >>
213
- >>
214
- def migrate(renames={})
215
- up, down = Generators::Hobo::Migration::Migrator.run(renames)
216
- ActiveRecord::Migration.class_eval(up)
217
- ActiveRecord::Base.send(:descendants).each { |model| model.reset_column_information }
218
- [up, down]
219
- end
220
- {.hidden}
221
-
222
- >>
223
- class Vault1 < ActiveRecord::Base
224
- fields do
225
- content :serialized
226
- end
227
- end
228
-
229
- >> migrate
230
- >> Vault1.create!(:content => {:key => "in Vault"})
231
- >> Vault1.first.content
232
- => {:key => "in Vault"}
233
-
234
- >>
235
- class Vault2 < ActiveRecord::Base
236
- fields do
237
- content :serialized, :class => Hash
238
- end
239
- end
240
-
241
- >> migrate
242
- >> Vault2.create!(:content => {:key => "in Vault"})
243
- >> Vault2.first.content
244
- => {:key => "in Vault"}
245
- >> Vault2.create!(:content => 17) rescue ActiveRecord::SerializationTypeMismatch
246
- >> Vault2.all.size
247
- => 1 # second record not created because of type mismatch
248
137
 
249
138
  ## Enum Strings
250
139
 
@@ -328,11 +217,6 @@ Sometimes it's nice to have a proper type name. Here's one way you might go abou
328
217
  >> Article.attr_type :status
329
218
  => Article::Status
330
219
 
331
- >> Article::Status::PUBLISHED.to_html
332
- => "published"
333
- >> Article::Status::PUBLISHED.to_html.html_safe?
334
- => true
335
-
336
220
  ### Translating EnumString's
337
221
 
338
222
  Named EnumString's may be translated. Here is an example fr.yml:
@@ -359,8 +243,6 @@ The translated value is available via `to_html`:
359
243
 
360
244
  >> Article::Status::PUBLISHED.to_html
361
245
  => "publiés"
362
- >> Article::Status::PUBLISHED.to_html.html_safe?
363
- => true
364
246
 
365
247
  Translations only work with named EnumString's. The recommended way of naming the EnumString is to assign it to a constant, but if you do not wish to do this, you can supply the name in an option:
366
248
 
@@ -369,26 +251,3 @@ Translations only work with named EnumString's. The recommended way of naming t
369
251
 
370
252
  `tableize` will be called on your name to provide the translation key.
371
253
 
372
-
373
- ###
374
-
375
- ### `HoboFields::Types::RawHtmlString`
376
-
377
- # no safety treatments are done by `to_html`.
378
- # even if `nasty.to_html` is actually unsafe, it is marked as html_safe.
379
- >> nasty = HoboFields::Types::RawHtmlString.new("p1<p>p2</p>p3<nasty>p4</nasty>p5&lt;script&gt;p6<script>p7</script>p8")
380
- >> nasty.to_html
381
- => "p1<p>p2</p>p3<nasty>p4</nasty>p5&lt;script&gt;p6<script>p7</script>p8"
382
- >> nasty.to_html.html_safe?
383
- => true
384
-
385
- ### `HoboFields::Types::RawMarkdownString`
386
-
387
- # no safety treatments are done by `to_html`.
388
- # even if `markdown.to_html` is actually unsafe, it is marked as html_safe.
389
- >> markdown = HoboFields::Types::RawMarkdownString.new("</div>>>p1<script>p2")
390
- >> markdown.to_html
391
- => "<p></div>>>p1<script>p2</p>"
392
- >> markdown.to_html.html_safe?
393
- => true
394
-
metadata CHANGED
@@ -1,8 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hobo_fields
3
3
  version: !ruby/object:Gem::Version
4
- prerelease: 6
5
- version: 1.3.0.RC4
4
+ hash: -1637175975
5
+ prerelease: true
6
+ segments:
7
+ - 1
8
+ - 3
9
+ - 0
10
+ - pre10
11
+ version: 1.3.0.pre10
6
12
  platform: ruby
7
13
  authors:
8
14
  - Tom Locke
@@ -10,53 +16,84 @@ autorequire:
10
16
  bindir: bin
11
17
  cert_chain: []
12
18
 
13
- date: 2011-11-09 00:00:00 -05:00
19
+ date: 2010-10-10 00:00:00 -04:00
14
20
  default_executable:
15
21
  dependencies:
16
22
  - !ruby/object:Gem::Dependency
17
- name: hobo_support
23
+ name: rails
18
24
  prerelease: false
19
25
  requirement: &id001 !ruby/object:Gem::Requirement
20
26
  none: false
21
27
  requirements:
22
- - - "="
28
+ - - ">="
23
29
  - !ruby/object:Gem::Version
24
- version: 1.3.0.RC4
30
+ hash: 7
31
+ segments:
32
+ - 3
33
+ - 0
34
+ - 0
35
+ version: 3.0.0
25
36
  type: :runtime
26
37
  version_requirements: *id001
27
38
  - !ruby/object:Gem::Dependency
28
- name: rubydoctest
39
+ name: hobo_support
29
40
  prerelease: false
30
41
  requirement: &id002 !ruby/object:Gem::Requirement
31
42
  none: false
32
43
  requirements:
33
- - - ">="
44
+ - - "="
34
45
  - !ruby/object:Gem::Version
35
- version: "0"
36
- type: :development
46
+ hash: -1637175975
47
+ segments:
48
+ - 1
49
+ - 3
50
+ - 0
51
+ - pre10
52
+ version: 1.3.0.pre10
53
+ type: :runtime
37
54
  version_requirements: *id002
38
55
  - !ruby/object:Gem::Dependency
39
- name: redcloth
56
+ name: rubydoctest
40
57
  prerelease: false
41
58
  requirement: &id003 !ruby/object:Gem::Requirement
42
59
  none: false
43
60
  requirements:
44
61
  - - ">="
45
62
  - !ruby/object:Gem::Version
63
+ hash: 3
64
+ segments:
65
+ - 0
46
66
  version: "0"
47
67
  type: :development
48
68
  version_requirements: *id003
49
69
  - !ruby/object:Gem::Dependency
50
- name: bluecloth
70
+ name: redcloth
51
71
  prerelease: false
52
72
  requirement: &id004 !ruby/object:Gem::Requirement
53
73
  none: false
54
74
  requirements:
55
75
  - - ">="
56
76
  - !ruby/object:Gem::Version
77
+ hash: 3
78
+ segments:
79
+ - 0
57
80
  version: "0"
58
81
  type: :development
59
82
  version_requirements: *id004
83
+ - !ruby/object:Gem::Dependency
84
+ name: bluecloth
85
+ prerelease: false
86
+ requirement: &id005 !ruby/object:Gem::Requirement
87
+ none: false
88
+ requirements:
89
+ - - ">="
90
+ - !ruby/object:Gem::Version
91
+ hash: 3
92
+ segments:
93
+ - 0
94
+ version: "0"
95
+ type: :development
96
+ version_requirements: *id005
60
97
  description: Rich field types and migration generator for Rails
61
98
  email: tom@tomlocke.com
62
99
  executables:
@@ -122,17 +159,25 @@ required_ruby_version: !ruby/object:Gem::Requirement
122
159
  requirements:
123
160
  - - ">="
124
161
  - !ruby/object:Gem::Version
162
+ hash: 3
163
+ segments:
164
+ - 0
125
165
  version: "0"
126
166
  required_rubygems_version: !ruby/object:Gem::Requirement
127
167
  none: false
128
168
  requirements:
129
169
  - - ">="
130
170
  - !ruby/object:Gem::Version
171
+ hash: 23
172
+ segments:
173
+ - 1
174
+ - 3
175
+ - 6
131
176
  version: 1.3.6
132
177
  requirements: []
133
178
 
134
179
  rubyforge_project: hobo
135
- rubygems_version: 1.6.2
180
+ rubygems_version: 1.3.7
136
181
  signing_key:
137
182
  specification_version: 3
138
183
  summary: Rich field types and migration generator for Rails