schofield 0.2.2 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.rvmrc +61 -0
- data/Gemfile.lock +4 -4
- data/README.rdoc +1 -1
- data/VERSION +1 -1
- data/lib/generators/schofield/association.rb +24 -24
- data/lib/generators/schofield/attribute.rb +49 -32
- data/lib/generators/schofield/attributes.rb +129 -128
- data/lib/generators/schofield/level.rb +86 -86
- data/lib/generators/schofield/levels.rb +21 -16
- data/lib/generators/schofield/navigation.rb +17 -0
- data/lib/generators/schofield/responses.rb +13 -13
- data/lib/generators/schofield/routes.rb +19 -14
- data/lib/generators/schofield/schofield_generator.rb +22 -18
- data/lib/generators/templates/controller.erb +7 -7
- data/lib/generators/templates/form.erb +11 -7
- data/lib/generators/templates/index.erb +2 -2
- data/lib/generators/templates/join_controller.erb +1 -1
- data/lib/generators/templates/model.erb +37 -39
- data/lib/generators/templates/show.erb +1 -1
- data/schofield.gemspec +10 -9
- data/spec/spec_helper.rb +1 -1
- metadata +20 -20
data/.rvmrc
ADDED
@@ -0,0 +1,61 @@
|
|
1
|
+
#!/usr/bin/env bash
|
2
|
+
|
3
|
+
# This is an RVM Project .rvmrc file, used to automatically load the ruby
|
4
|
+
# development environment upon cd'ing into the directory
|
5
|
+
|
6
|
+
# First we specify our desired <ruby>[@<gemset>], the @gemset name is optional.
|
7
|
+
environment_id="ree-1.8.7-2011.03@schofield"
|
8
|
+
|
9
|
+
#
|
10
|
+
# Uncomment following line if you want options to be set only for given project.
|
11
|
+
#
|
12
|
+
# PROJECT_JRUBY_OPTS=( --1.9 )
|
13
|
+
|
14
|
+
#
|
15
|
+
# First we attempt to load the desired environment directly from the environment
|
16
|
+
# file. This is very fast and efficient compared to running through the entire
|
17
|
+
# CLI and selector. If you want feedback on which environment was used then
|
18
|
+
# insert the word 'use' after --create as this triggers verbose mode.
|
19
|
+
#
|
20
|
+
if [[ -d "${rvm_path:-$HOME/.rvm}/environments" \
|
21
|
+
&& -s "${rvm_path:-$HOME/.rvm}/environments/$environment_id" ]]
|
22
|
+
then
|
23
|
+
\. "${rvm_path:-$HOME/.rvm}/environments/$environment_id"
|
24
|
+
|
25
|
+
if [[ -s "${rvm_path:-$HOME/.rvm}/hooks/after_use" ]]
|
26
|
+
then
|
27
|
+
. "${rvm_path:-$HOME/.rvm}/hooks/after_use"
|
28
|
+
fi
|
29
|
+
else
|
30
|
+
# If the environment file has not yet been created, use the RVM CLI to select.
|
31
|
+
if ! rvm --create use "$environment_id"
|
32
|
+
then
|
33
|
+
echo "Failed to create RVM environment '${environment_id}'."
|
34
|
+
return 1
|
35
|
+
fi
|
36
|
+
fi
|
37
|
+
|
38
|
+
#
|
39
|
+
# If you use an RVM gemset file to install a list of gems (*.gems), you can have
|
40
|
+
# it be automatically loaded. Uncomment the following and adjust the filename if
|
41
|
+
# necessary.
|
42
|
+
#
|
43
|
+
# filename=".gems"
|
44
|
+
# if [[ -s "$filename" ]]
|
45
|
+
# then
|
46
|
+
# rvm gemset import "$filename" | grep -v already | grep -v listed | grep -v complete | sed '/^$/d'
|
47
|
+
# fi
|
48
|
+
|
49
|
+
# If you use bundler, this might be useful to you:
|
50
|
+
# if command -v bundle && [[ -s Gemfile ]]
|
51
|
+
# then
|
52
|
+
# bundle install
|
53
|
+
# fi
|
54
|
+
|
55
|
+
if [[ $- == *i* ]] # check for interactive shells
|
56
|
+
then
|
57
|
+
echo "Using: $(tput setaf 2)$GEM_HOME$(tput sgr0)" # show the user the ruby and gemset they are using in green
|
58
|
+
else
|
59
|
+
echo "Using: $GEM_HOME" # don't use colors in interactive shells
|
60
|
+
fi
|
61
|
+
|
data/Gemfile.lock
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
GEM
|
2
2
|
remote: http://rubygems.org/
|
3
3
|
specs:
|
4
|
-
diff-lcs (1.1.
|
4
|
+
diff-lcs (1.1.3)
|
5
5
|
git (1.2.5)
|
6
|
-
jeweler (1.5.
|
6
|
+
jeweler (1.5.2)
|
7
7
|
bundler (~> 1.0.0)
|
8
8
|
git (>= 1.2.5)
|
9
9
|
rake
|
10
|
-
rake (0.
|
11
|
-
rcov (0.9.
|
10
|
+
rake (0.9.2.2)
|
11
|
+
rcov (0.9.11)
|
12
12
|
rspec (2.1.0)
|
13
13
|
rspec-core (~> 2.1.0)
|
14
14
|
rspec-expectations (~> 2.1.0)
|
data/README.rdoc
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
Description goes here.
|
4
4
|
|
5
5
|
== Contributing to schofield
|
6
|
-
|
6
|
+
|
7
7
|
* Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet
|
8
8
|
* Check out the issue tracker to make sure someone already hasn't requested it and/or contributed it
|
9
9
|
* Fork the project
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.3.0
|
@@ -1,31 +1,31 @@
|
|
1
1
|
module Schofield
|
2
|
-
|
2
|
+
|
3
3
|
module Generators
|
4
|
-
|
4
|
+
|
5
5
|
class Association
|
6
|
-
|
6
|
+
|
7
7
|
ONE_TO_ONE = '1-1'
|
8
8
|
ONE_TO_MANY = '1-*'
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
|
10
|
+
|
11
|
+
|
12
12
|
class << self; attr_accessor :all end
|
13
13
|
@all = []
|
14
|
-
|
14
|
+
|
15
15
|
def self.reference_parents
|
16
16
|
all.each { |a| a.reference_parent }
|
17
17
|
end
|
18
|
-
|
18
|
+
|
19
19
|
def self.report
|
20
20
|
all.each { |a| Responses.say a.report }
|
21
21
|
end
|
22
|
-
|
23
|
-
|
24
|
-
|
22
|
+
|
23
|
+
|
24
|
+
|
25
25
|
attr_reader :parent, :child, :parent_name, :child_name , :polymorphic_name
|
26
26
|
attr_writer :nest
|
27
27
|
attr_accessor :cardinality
|
28
|
-
|
28
|
+
|
29
29
|
def initialize child, parent_name, one_to_one, polymorphic_name=nil
|
30
30
|
@child = child
|
31
31
|
@child_name = child.name
|
@@ -35,16 +35,16 @@ module Schofield
|
|
35
35
|
@nest = polymorphic_name.present? && !one_to_one
|
36
36
|
self.class.all << self
|
37
37
|
end
|
38
|
-
|
38
|
+
|
39
39
|
def nest?
|
40
40
|
@nest
|
41
41
|
end
|
42
|
-
|
42
|
+
|
43
43
|
def reference_parent
|
44
44
|
@parent = Levels.find(@parent_name)
|
45
45
|
@parent.child_associations << self
|
46
46
|
end
|
47
|
-
|
47
|
+
|
48
48
|
def report
|
49
49
|
<<-STRING.gsub(/^ {8}/, '')
|
50
50
|
parent: #{@parent.name}
|
@@ -55,40 +55,40 @@ module Schofield
|
|
55
55
|
---
|
56
56
|
STRING
|
57
57
|
end
|
58
|
-
|
58
|
+
|
59
59
|
def one_to_one?
|
60
60
|
@cardinality == Association::ONE_TO_ONE
|
61
61
|
end
|
62
|
-
|
62
|
+
|
63
63
|
def one_to_many?
|
64
64
|
@cardinality == Association::ONE_TO_MANY
|
65
65
|
end
|
66
|
-
|
66
|
+
|
67
67
|
def polymorphic?
|
68
68
|
@polymorphic_name.present?
|
69
69
|
end
|
70
|
-
|
70
|
+
|
71
71
|
def non_polymorphic?
|
72
72
|
!polymorphic?
|
73
73
|
end
|
74
|
-
|
74
|
+
|
75
75
|
def polymorphic_one_to_one?
|
76
76
|
polymorphic? && one_to_one?
|
77
77
|
end
|
78
|
-
|
78
|
+
|
79
79
|
def polymorphic_one_to_many?
|
80
80
|
polymorphic? && one_to_many?
|
81
81
|
end
|
82
|
-
|
82
|
+
|
83
83
|
def non_polymorphic_one_to_one?
|
84
84
|
non_polymorphic? && one_to_one?
|
85
85
|
end
|
86
|
-
|
86
|
+
|
87
87
|
def non_polymorphic_one_to_many?
|
88
88
|
non_polymorphic? && one_to_many?
|
89
89
|
end
|
90
90
|
|
91
91
|
end
|
92
|
-
|
92
|
+
|
93
93
|
end
|
94
94
|
end
|
@@ -1,87 +1,104 @@
|
|
1
1
|
module Schofield
|
2
|
-
|
2
|
+
|
3
3
|
module Generators
|
4
|
-
|
4
|
+
|
5
5
|
class Attribute
|
6
|
-
|
6
|
+
|
7
7
|
ATTACHMENT_IMAGE_NAMES = %w( image thumbnail enlargement photo avatar )
|
8
|
-
|
8
|
+
|
9
9
|
attr_reader :model_name, :name, :max_number, :max_length, :attachment_name, :type
|
10
|
-
|
11
|
-
|
10
|
+
|
11
|
+
|
12
12
|
def initialize column
|
13
|
-
|
13
|
+
|
14
14
|
if (match_data = column.name.match(/(.+)_file_name$/))
|
15
15
|
@attachment_name = match_data[1]
|
16
16
|
@attachment = true
|
17
|
-
@image = @attachment_name =~ /#{ATTACHMENT_IMAGE_NAMES.join('|')}/
|
17
|
+
@image = !!(@attachment_name =~ /#{ATTACHMENT_IMAGE_NAMES.join('|')}/)
|
18
18
|
end
|
19
|
-
|
19
|
+
|
20
20
|
if (match_data = column.name.match(/^(.+)_id$/))
|
21
|
-
|
22
|
-
|
21
|
+
model_name = match_data[1]
|
22
|
+
if Levels.exists?(model_name)
|
23
|
+
@model_name = model_name
|
24
|
+
@reference = true
|
25
|
+
end
|
23
26
|
end
|
24
|
-
|
27
|
+
|
25
28
|
@name = column.name
|
26
29
|
@required = !column.null
|
27
30
|
@type = column.type
|
28
31
|
@max_length = column.type == :string ? column.limit : nil
|
29
32
|
@max_number = column.type == :integer && !@reference ? 256**column.limit / 2 - 1 : nil
|
30
|
-
|
33
|
+
|
31
34
|
end
|
32
|
-
|
35
|
+
|
33
36
|
def reference?
|
34
37
|
@reference == true
|
35
38
|
end
|
36
|
-
|
39
|
+
|
37
40
|
def attachment?
|
38
41
|
@attachment == true
|
39
42
|
end
|
40
|
-
|
43
|
+
|
41
44
|
def image?
|
42
|
-
@image
|
45
|
+
@image
|
43
46
|
end
|
44
|
-
|
47
|
+
|
45
48
|
def required?
|
46
49
|
@required && !@attachment
|
47
50
|
end
|
48
|
-
|
51
|
+
|
52
|
+
def validate_presence?
|
53
|
+
required? && @name != 'position' && !boolean? && !fingerprint? && @name != 'slug'
|
54
|
+
end
|
55
|
+
|
49
56
|
def required_attachment?
|
50
57
|
@attachment && @required
|
51
58
|
end
|
52
|
-
|
59
|
+
|
53
60
|
def text?
|
54
61
|
type == :text
|
55
62
|
end
|
56
|
-
|
63
|
+
|
57
64
|
def boolean?
|
58
65
|
type == :boolean
|
59
66
|
end
|
60
|
-
|
67
|
+
|
61
68
|
def actual_name
|
62
69
|
@attachment_name || @model_name || @name
|
63
70
|
end
|
64
|
-
|
71
|
+
|
72
|
+
def fingerprint?
|
73
|
+
!!(@name =~ /_fingerprint$/)
|
74
|
+
end
|
75
|
+
|
76
|
+
def accessible_name
|
77
|
+
actual_name unless fingerprint? || @name == 'slug'
|
78
|
+
end
|
79
|
+
|
65
80
|
def to_column
|
66
81
|
"'#{actual_name.humanize}', lambda { |x| " +
|
67
82
|
case
|
68
|
-
when image? then "image_tag(x.#{@attachment_name}.url(:
|
83
|
+
when image? then "image_tag(x.#{@attachment_name}.url(:admin), :alt => '', :class => 'thumbnail')"
|
69
84
|
when attachment? then "link_to('#{actual_name.humanize}', x.#{@attachment_name}.url)"
|
85
|
+
when boolean? then "x.#{actual_name} ? '✓' : ''"
|
70
86
|
else "x.#{actual_name}"
|
71
87
|
end + ' }'
|
72
88
|
end
|
73
|
-
|
89
|
+
|
74
90
|
def weight
|
75
91
|
case
|
76
|
-
when image?
|
77
|
-
when @name == 'name'
|
78
|
-
when @name == 'title'
|
79
|
-
when reference?
|
80
|
-
|
92
|
+
when image? then 1
|
93
|
+
when @name == 'name' then 2
|
94
|
+
when @name == 'title' then 3
|
95
|
+
when reference? then 4
|
96
|
+
when @name == 'published' then 6
|
97
|
+
else 5
|
81
98
|
end
|
82
99
|
end
|
83
|
-
|
100
|
+
|
84
101
|
end
|
85
|
-
|
102
|
+
|
86
103
|
end
|
87
104
|
end
|
@@ -1,87 +1,87 @@
|
|
1
1
|
module Schofield
|
2
|
-
|
2
|
+
|
3
3
|
module Generators
|
4
|
-
|
4
|
+
|
5
5
|
class Attributes
|
6
|
-
|
6
|
+
|
7
7
|
include Enumerable
|
8
|
-
|
9
|
-
|
8
|
+
|
9
|
+
|
10
10
|
def initialize
|
11
|
-
@attributes
|
12
|
-
@
|
13
|
-
@
|
14
|
-
@attachments
|
15
|
-
@required_attachments
|
16
|
-
@
|
17
|
-
@
|
18
|
-
@
|
11
|
+
@attributes = []
|
12
|
+
@presence_validateds = []
|
13
|
+
@presence_validated_one_to_ones = []
|
14
|
+
@attachments = []
|
15
|
+
@required_attachments = []
|
16
|
+
@accessibles = []
|
17
|
+
@max_numbers = {}
|
18
|
+
@max_lengths = {}
|
19
|
+
@references_count = 0
|
19
20
|
end
|
20
|
-
|
21
|
-
|
21
|
+
|
22
|
+
|
22
23
|
def new_attribute column, one_to_one
|
23
|
-
|
24
|
+
|
24
25
|
attribute = Attribute.new column
|
25
26
|
@attributes << attribute
|
26
|
-
|
27
|
-
@
|
28
|
-
|
29
|
-
if attribute.
|
30
|
-
if one_to_one then @
|
31
|
-
else @
|
27
|
+
|
28
|
+
@references_count += 1 if attribute.reference?
|
29
|
+
|
30
|
+
if attribute.validate_presence?
|
31
|
+
if one_to_one then @presence_validated_one_to_ones << attribute
|
32
|
+
else @presence_validateds << attribute
|
32
33
|
end
|
33
34
|
end
|
34
|
-
|
35
|
+
|
35
36
|
if attribute.attachment?
|
36
|
-
@attachments << attribute
|
37
|
-
@required_attachments << attribute
|
37
|
+
@attachments << attribute
|
38
|
+
@required_attachments << attribute if attribute.required_attachment?
|
38
39
|
end
|
39
|
-
|
40
|
+
|
40
41
|
if attribute.max_number
|
41
42
|
@max_numbers[attribute.max_number] ||= []
|
42
43
|
@max_numbers[attribute.max_number] << attribute.name
|
43
44
|
end
|
44
|
-
|
45
|
+
|
45
46
|
if attribute.max_length
|
46
47
|
@max_lengths[attribute.max_length] ||= []
|
47
48
|
@max_lengths[attribute.max_length] << attribute.name
|
48
49
|
end
|
49
50
|
|
51
|
+
accessible_name = attribute.accessible_name
|
52
|
+
@accessibles << accessible_name if accessible_name.present?
|
53
|
+
|
50
54
|
attribute
|
51
55
|
end
|
52
|
-
|
56
|
+
|
53
57
|
def each
|
54
58
|
@attributes.each { |a| yield a }
|
55
59
|
end
|
56
|
-
|
60
|
+
|
57
61
|
def join?
|
58
|
-
@
|
62
|
+
@references_count == @attributes.select{ |a| a.name != 'position' }.count && @references_count == 2
|
59
63
|
end
|
60
|
-
|
64
|
+
|
61
65
|
def validations?
|
62
66
|
validations.any?
|
63
67
|
end
|
64
|
-
|
65
|
-
def
|
66
|
-
|
68
|
+
|
69
|
+
def attr_accessors?
|
70
|
+
attr_accessors.present?
|
67
71
|
end
|
68
|
-
|
69
|
-
def
|
70
|
-
|
72
|
+
|
73
|
+
def attr_accessibles?
|
74
|
+
attr_accessibles.present?
|
71
75
|
end
|
72
|
-
|
76
|
+
|
73
77
|
def attachments?
|
74
78
|
@attachments.any?
|
75
79
|
end
|
76
|
-
|
80
|
+
|
77
81
|
def validations
|
78
82
|
@validations ||= get_validations
|
79
83
|
end
|
80
|
-
|
81
|
-
def acts_as_markdowns
|
82
|
-
@acts_as_markdowns ||= (names = @attributes.select(&:text?).map(&:name)).any? ? "acts_as_markdown #{join_names(names)}" : ''
|
83
|
-
end
|
84
|
-
|
84
|
+
|
85
85
|
def to_s_string
|
86
86
|
case
|
87
87
|
when name? then 'name'
|
@@ -89,116 +89,117 @@ module Schofield
|
|
89
89
|
when text? then 'text'
|
90
90
|
end
|
91
91
|
end
|
92
|
-
|
92
|
+
|
93
93
|
def attached_files
|
94
|
-
@attachments.map { |
|
95
|
-
|
96
|
-
|
97
|
-
string += ":path => ':class/:id.:extension',\n"
|
98
|
-
string += indentation + ":storage => :s3,\n"
|
99
|
-
string += indentation + ":s3_credentials => \"\#{Rails.root}/config/s3.yml\",\n"
|
100
|
-
string += indentation + ":url => ':s3_domain_url'"
|
101
|
-
}.join("\n")
|
94
|
+
@attachments.map { |attribute|
|
95
|
+
"\n has_attached_file :#{attribute.attachment_name}, {" + (attribute.image? ? image_attachment(name) : non_image_attachment(name)) + "\n }.merge(S3_ATTACHMENT_INFO)"
|
96
|
+
}.join("\n")
|
102
97
|
end
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
def attr_protecteds
|
109
|
-
@attr_protecteds ||= (@attachments.any? ? 'attr_protected :' + @attachments.map { |attachment_name|
|
110
|
-
self.select { |attribute|
|
111
|
-
(match_data = attribute.name.match(/^#{attachment_name}_(.+)$/)).present? && %w(file_name content_type file_size updated_at).include?(match_data[1])
|
112
|
-
}.map(&:name)
|
98
|
+
|
99
|
+
def attr_accessors
|
100
|
+
@attr_accessors ||= (@attachments.any? ? 'attr_accessor :' + @attachments.map { |attribute|
|
101
|
+
%w( _content_type _file_size ).map{ |suffix| "#{attribute.attachment_name}#{suffix}" } + (attribute.image? ? ["#{attribute.attachment_name}_dimensions"] : [])
|
113
102
|
}.flatten.join(', :') : '')
|
114
103
|
end
|
115
|
-
|
116
|
-
def
|
117
|
-
|
118
|
-
end
|
119
|
-
|
120
|
-
def join_names names
|
121
|
-
":#{names.join(', :')}"
|
122
|
-
end
|
123
|
-
|
124
|
-
def get_validations
|
125
|
-
@validations = []
|
126
|
-
validate_presence
|
127
|
-
validate_presence_unless_nested
|
128
|
-
validate_length
|
129
|
-
validate_numericality
|
130
|
-
validate_email_address
|
131
|
-
validate_phone_number
|
132
|
-
validate_url
|
133
|
-
validate_boolean
|
134
|
-
validate_attachment_presence
|
135
|
-
@validations
|
104
|
+
|
105
|
+
def attr_accessibles
|
106
|
+
@attr_accessibles ||= @accessibles.any? ? 'attr_accessible :' + @accessibles.join(', :') : ''
|
136
107
|
end
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
108
|
+
|
109
|
+
|
110
|
+
|
111
|
+
private
|
112
|
+
|
113
|
+
def names_matching regex
|
114
|
+
self.select { |a| a.name.match(regex) }.map(&:name)
|
141
115
|
end
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
if (booleans = select { |a| a.boolean? && a.required? }).any?
|
146
|
-
@validations << "validates #{join_names(booleans.map(&:name))}, :boolean => true"
|
116
|
+
|
117
|
+
def join_names names
|
118
|
+
":#{names.join(', :')}"
|
147
119
|
end
|
148
|
-
|
149
|
-
|
120
|
+
|
121
|
+
def get_validations
|
122
|
+
@validations = []
|
123
|
+
validate_presence
|
124
|
+
validate_presence_unless_nested
|
125
|
+
validate_length
|
126
|
+
validate_numericality
|
127
|
+
validate_email_address
|
128
|
+
validate_phone_number
|
129
|
+
validate_url
|
130
|
+
validate_attachments
|
131
|
+
@validations
|
150
132
|
end
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
133
|
+
|
134
|
+
def validate_presence
|
135
|
+
if (names = @presence_validateds.map(&:actual_name)).any?
|
136
|
+
@validations << "validates #{join_names(names)}, :presence => true"
|
137
|
+
end
|
156
138
|
end
|
157
|
-
end
|
158
139
|
|
159
|
-
|
160
|
-
|
161
|
-
|
140
|
+
def validate_presence_unless_nested
|
141
|
+
if (names = @presence_validated_one_to_ones.map(&:actual_name)).any?
|
142
|
+
@validations << "validates #{join_names(names)}, :presence => true, :unless => :nested"
|
143
|
+
end
|
162
144
|
end
|
163
|
-
end
|
164
145
|
|
165
|
-
|
166
|
-
|
167
|
-
|
146
|
+
def validate_length
|
147
|
+
@max_lengths.each do |length, names|
|
148
|
+
@validations << "validates #{join_names(names)}, :length => { :maximum => #{length} }, :allow_nil => true"
|
149
|
+
end
|
168
150
|
end
|
169
|
-
end
|
170
151
|
|
171
|
-
|
172
|
-
|
173
|
-
|
152
|
+
def validate_numericality
|
153
|
+
@max_numbers.each do |number, names|
|
154
|
+
@validations << "validates #{join_names(names)}, :numericality => { :less_than_or_equal_to => #{number} }, :allow_nil => true"
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
def validate_email_address
|
159
|
+
if (names = names_matching(/email_address$/)).any?
|
160
|
+
@validations << "validates #{join_names(names)}, :email => true, :allow_nil => true"
|
161
|
+
end
|
174
162
|
end
|
175
|
-
end
|
176
163
|
|
177
|
-
|
178
|
-
|
179
|
-
|
164
|
+
def validate_phone_number
|
165
|
+
if (names = names_matching(/phone_number$/)).any?
|
166
|
+
@validations << "validates #{join_names(names)}, :phone_number => true, :allow_nil => true"
|
167
|
+
end
|
180
168
|
end
|
181
|
-
end
|
182
169
|
|
183
|
-
|
184
|
-
|
185
|
-
|
170
|
+
def validate_url
|
171
|
+
if (names = names_matching(/url$/)).any?
|
172
|
+
@validations << "validates #{join_names(names)}, :url => true, :allow_nil => true"
|
173
|
+
end
|
186
174
|
end
|
187
|
-
end
|
188
175
|
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
176
|
+
def validate_attachments
|
177
|
+
@attachments.each do |attribute|
|
178
|
+
name = attribute.attachment_name
|
179
|
+
@validations << "validates_attachment_presence :#{name}" if attribute.required_attachment?
|
180
|
+
@validations << "validates_attachment_content_type :#{name}, Rails.configuration.bodmin.image_content_type" if attribute.image?
|
181
|
+
@validations << "validates_attachment_size :#{name}, :less_than => 10.megabytes"
|
182
|
+
@validations << "validates_attachment_dimensions :#{name}, :width => 1..Infinity, :height => 1..Infinity" if attribute.image?
|
183
|
+
end
|
184
|
+
end
|
185
|
+
|
186
|
+
def image_attachment name
|
187
|
+
"\n :styles => { :admin => '96x78#' }," +
|
188
|
+
"\n :path => 'images/:class_with_thumbnails/:id/:fingerprint.:extension'," +
|
189
|
+
"\n :convert_options => { :admin => \"-colorspace RGB -strip \#{Rails.configuration.bodmin.image_quality}\" }"
|
190
|
+
end
|
191
|
+
|
192
|
+
def non_image_attachment name
|
193
|
+
"\n :path => 'downloads/:class/:id/:fingerprint.:extension'"
|
194
|
+
end
|
194
195
|
|
195
196
|
def method_missing(method, *args, &block)
|
196
197
|
if match_data = method.to_s.match(/^(.+)\?$/)
|
197
198
|
self.find { |a| a.name == match_data[1] }.present?
|
198
199
|
end
|
199
200
|
end
|
200
|
-
|
201
|
+
|
201
202
|
end
|
202
|
-
|
203
|
+
|
203
204
|
end
|
204
205
|
end
|