activemodel 3.0.pre → 3.0.0.rc

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.
Files changed (45) hide show
  1. data/CHANGELOG +44 -1
  2. data/MIT-LICENSE +1 -1
  3. data/README.rdoc +184 -0
  4. data/lib/active_model.rb +29 -19
  5. data/lib/active_model/attribute_methods.rb +167 -46
  6. data/lib/active_model/callbacks.rb +134 -0
  7. data/lib/active_model/conversion.rb +41 -1
  8. data/lib/active_model/deprecated_error_methods.rb +1 -1
  9. data/lib/active_model/dirty.rb +56 -12
  10. data/lib/active_model/errors.rb +205 -46
  11. data/lib/active_model/lint.rb +53 -17
  12. data/lib/active_model/locale/en.yml +26 -23
  13. data/lib/active_model/mass_assignment_security.rb +160 -0
  14. data/lib/active_model/mass_assignment_security/permission_set.rb +40 -0
  15. data/lib/active_model/mass_assignment_security/sanitizer.rb +23 -0
  16. data/lib/active_model/naming.rb +70 -5
  17. data/lib/active_model/observing.rb +40 -16
  18. data/lib/active_model/railtie.rb +2 -0
  19. data/lib/active_model/serialization.rb +59 -0
  20. data/lib/active_model/serializers/json.rb +17 -11
  21. data/lib/active_model/serializers/xml.rb +66 -123
  22. data/lib/active_model/test_case.rb +0 -2
  23. data/lib/active_model/translation.rb +64 -0
  24. data/lib/active_model/validations.rb +150 -68
  25. data/lib/active_model/validations/acceptance.rb +53 -33
  26. data/lib/active_model/validations/callbacks.rb +57 -0
  27. data/lib/active_model/validations/confirmation.rb +41 -23
  28. data/lib/active_model/validations/exclusion.rb +18 -13
  29. data/lib/active_model/validations/format.rb +28 -24
  30. data/lib/active_model/validations/inclusion.rb +18 -13
  31. data/lib/active_model/validations/length.rb +67 -65
  32. data/lib/active_model/validations/numericality.rb +83 -58
  33. data/lib/active_model/validations/presence.rb +10 -8
  34. data/lib/active_model/validations/validates.rb +110 -0
  35. data/lib/active_model/validations/with.rb +90 -23
  36. data/lib/active_model/validator.rb +186 -0
  37. data/lib/active_model/version.rb +3 -2
  38. metadata +79 -20
  39. data/README +0 -21
  40. data/lib/active_model/state_machine.rb +0 -70
  41. data/lib/active_model/state_machine/event.rb +0 -62
  42. data/lib/active_model/state_machine/machine.rb +0 -75
  43. data/lib/active_model/state_machine/state.rb +0 -47
  44. data/lib/active_model/state_machine/state_transition.rb +0 -40
  45. data/lib/active_model/validations_repair_helper.rb +0 -35
@@ -2,8 +2,9 @@ module ActiveModel
2
2
  module VERSION #:nodoc:
3
3
  MAJOR = 3
4
4
  MINOR = 0
5
- TINY = "pre"
5
+ TINY = 0
6
+ BUILD = "rc"
6
7
 
7
- STRING = [MAJOR, MINOR, TINY].join('.')
8
+ STRING = [MAJOR, MINOR, TINY, BUILD].join('.')
8
9
  end
9
10
  end
metadata CHANGED
@@ -1,7 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activemodel
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.pre
4
+ hash: 7712042
5
+ prerelease: true
6
+ segments:
7
+ - 3
8
+ - 0
9
+ - 0
10
+ - rc
11
+ version: 3.0.0.rc
5
12
  platform: ruby
6
13
  authors:
7
14
  - David Heinemeier Hansson
@@ -9,20 +16,59 @@ autorequire:
9
16
  bindir: bin
10
17
  cert_chain: []
11
18
 
12
- date: 2009-10-16 00:00:00 -05:00
19
+ date: 2010-07-26 00:00:00 -05:00
13
20
  default_executable:
14
21
  dependencies:
15
22
  - !ruby/object:Gem::Dependency
16
23
  name: activesupport
17
- type: :runtime
18
- version_requirement:
19
- version_requirements: !ruby/object:Gem::Requirement
24
+ prerelease: false
25
+ requirement: &id001 !ruby/object:Gem::Requirement
26
+ none: false
20
27
  requirements:
21
28
  - - "="
22
29
  - !ruby/object:Gem::Version
23
- version: 3.0.pre
24
- version:
25
- description: Extracts common modeling concerns from ActiveRecord to share between similar frameworks like ActiveResource.
30
+ hash: 7712042
31
+ segments:
32
+ - 3
33
+ - 0
34
+ - 0
35
+ - rc
36
+ version: 3.0.0.rc
37
+ type: :runtime
38
+ version_requirements: *id001
39
+ - !ruby/object:Gem::Dependency
40
+ name: builder
41
+ prerelease: false
42
+ requirement: &id002 !ruby/object:Gem::Requirement
43
+ none: false
44
+ requirements:
45
+ - - ~>
46
+ - !ruby/object:Gem::Version
47
+ hash: 15
48
+ segments:
49
+ - 2
50
+ - 1
51
+ - 2
52
+ version: 2.1.2
53
+ type: :runtime
54
+ version_requirements: *id002
55
+ - !ruby/object:Gem::Dependency
56
+ name: i18n
57
+ prerelease: false
58
+ requirement: &id003 !ruby/object:Gem::Requirement
59
+ none: false
60
+ requirements:
61
+ - - ~>
62
+ - !ruby/object:Gem::Version
63
+ hash: 13
64
+ segments:
65
+ - 0
66
+ - 4
67
+ - 1
68
+ version: 0.4.1
69
+ type: :runtime
70
+ version_requirements: *id003
71
+ description: A toolkit for building modeling frameworks like Active Record and Active Resource. Rich support for attributes, callbacks, validations, observers, serialization, internationalization, and testing.
26
72
  email: david@loudthinking.com
27
73
  executables: []
28
74
 
@@ -33,26 +79,28 @@ extra_rdoc_files: []
33
79
  files:
34
80
  - CHANGELOG
35
81
  - MIT-LICENSE
36
- - README
82
+ - README.rdoc
37
83
  - lib/active_model/attribute_methods.rb
84
+ - lib/active_model/callbacks.rb
38
85
  - lib/active_model/conversion.rb
39
86
  - lib/active_model/deprecated_error_methods.rb
40
87
  - lib/active_model/dirty.rb
41
88
  - lib/active_model/errors.rb
42
89
  - lib/active_model/lint.rb
43
90
  - lib/active_model/locale/en.yml
91
+ - lib/active_model/mass_assignment_security/permission_set.rb
92
+ - lib/active_model/mass_assignment_security/sanitizer.rb
93
+ - lib/active_model/mass_assignment_security.rb
44
94
  - lib/active_model/naming.rb
45
95
  - lib/active_model/observing.rb
96
+ - lib/active_model/railtie.rb
46
97
  - lib/active_model/serialization.rb
47
98
  - lib/active_model/serializers/json.rb
48
99
  - lib/active_model/serializers/xml.rb
49
- - lib/active_model/state_machine/event.rb
50
- - lib/active_model/state_machine/machine.rb
51
- - lib/active_model/state_machine/state.rb
52
- - lib/active_model/state_machine/state_transition.rb
53
- - lib/active_model/state_machine.rb
54
100
  - lib/active_model/test_case.rb
101
+ - lib/active_model/translation.rb
55
102
  - lib/active_model/validations/acceptance.rb
103
+ - lib/active_model/validations/callbacks.rb
56
104
  - lib/active_model/validations/confirmation.rb
57
105
  - lib/active_model/validations/exclusion.rb
58
106
  - lib/active_model/validations/format.rb
@@ -60,9 +108,10 @@ files:
60
108
  - lib/active_model/validations/length.rb
61
109
  - lib/active_model/validations/numericality.rb
62
110
  - lib/active_model/validations/presence.rb
111
+ - lib/active_model/validations/validates.rb
63
112
  - lib/active_model/validations/with.rb
64
113
  - lib/active_model/validations.rb
65
- - lib/active_model/validations_repair_helper.rb
114
+ - lib/active_model/validator.rb
66
115
  - lib/active_model/version.rb
67
116
  - lib/active_model.rb
68
117
  has_rdoc: true
@@ -75,23 +124,33 @@ rdoc_options: []
75
124
  require_paths:
76
125
  - lib
77
126
  required_ruby_version: !ruby/object:Gem::Requirement
127
+ none: false
78
128
  requirements:
79
129
  - - ">="
80
130
  - !ruby/object:Gem::Version
81
- version: "0"
82
- version:
131
+ hash: 57
132
+ segments:
133
+ - 1
134
+ - 8
135
+ - 7
136
+ version: 1.8.7
83
137
  required_rubygems_version: !ruby/object:Gem::Requirement
138
+ none: false
84
139
  requirements:
85
140
  - - ">"
86
141
  - !ruby/object:Gem::Version
142
+ hash: 25
143
+ segments:
144
+ - 1
145
+ - 3
146
+ - 1
87
147
  version: 1.3.1
88
- version:
89
148
  requirements: []
90
149
 
91
150
  rubyforge_project: activemodel
92
- rubygems_version: 1.3.5
151
+ rubygems_version: 1.3.7
93
152
  signing_key:
94
153
  specification_version: 3
95
- summary: A toolkit for building other modeling frameworks like ActiveRecord
154
+ summary: A toolkit for building modeling frameworks (part of Rails).
96
155
  test_files: []
97
156
 
data/README DELETED
@@ -1,21 +0,0 @@
1
- Active Model
2
- ==============
3
-
4
- Totally experimental library that aims to extract common model mixins from
5
- ActiveRecord for use in ActiveResource (and other similar libraries).
6
- This is in a very rough state (no autotest or spec rake tasks set up yet),
7
- so please excuse the mess.
8
-
9
- Here's what I plan to extract:
10
- * ActiveModel::Observing
11
- * ActiveModel::Callbacks
12
- * ActiveModel::Validations
13
-
14
- # for ActiveResource params and ActiveRecord options
15
- * ActiveModel::Scoping
16
-
17
- # to_json, to_xml, etc
18
- * ActiveModel::Serialization
19
-
20
- I'm trying to keep ActiveRecord compatibility where possible, but I'm
21
- annotating the spots where I'm diverging a bit.
@@ -1,70 +0,0 @@
1
- module ActiveModel
2
- module StateMachine
3
- autoload :Event, 'active_model/state_machine/event'
4
- autoload :Machine, 'active_model/state_machine/machine'
5
- autoload :State, 'active_model/state_machine/state'
6
- autoload :StateTransition, 'active_model/state_machine/state_transition'
7
-
8
- extend ActiveSupport::Concern
9
-
10
- class InvalidTransition < Exception
11
- end
12
-
13
- module ClassMethods
14
- def inherited(klass)
15
- super
16
- klass.state_machines = state_machines
17
- end
18
-
19
- def state_machines
20
- @state_machines ||= {}
21
- end
22
-
23
- def state_machines=(value)
24
- @state_machines = value ? value.dup : nil
25
- end
26
-
27
- def state_machine(name = nil, options = {}, &block)
28
- if name.is_a?(Hash)
29
- options = name
30
- name = nil
31
- end
32
- name ||= :default
33
- state_machines[name] ||= Machine.new(self, name)
34
- block ? state_machines[name].update(options, &block) : state_machines[name]
35
- end
36
-
37
- def define_state_query_method(state_name)
38
- name = "#{state_name}?"
39
- undef_method(name) if method_defined?(name)
40
- class_eval "def #{name}; current_state.to_s == %(#{state_name}) end"
41
- end
42
- end
43
-
44
- def current_state(name = nil, new_state = nil, persist = false)
45
- sm = self.class.state_machine(name)
46
- ivar = sm.current_state_variable
47
- if name && new_state
48
- if persist && respond_to?(:write_state)
49
- write_state(sm, new_state)
50
- end
51
-
52
- if respond_to?(:write_state_without_persistence)
53
- write_state_without_persistence(sm, new_state)
54
- end
55
-
56
- instance_variable_set(ivar, new_state)
57
- else
58
- instance_variable_set(ivar, nil) unless instance_variable_defined?(ivar)
59
- value = instance_variable_get(ivar)
60
- return value if value
61
-
62
- if respond_to?(:read_state)
63
- value = instance_variable_set(ivar, read_state(sm))
64
- end
65
-
66
- value || sm.initial_state
67
- end
68
- end
69
- end
70
- end
@@ -1,62 +0,0 @@
1
- module ActiveModel
2
- module StateMachine
3
- class Event
4
- attr_reader :name, :success
5
-
6
- def initialize(machine, name, options = {}, &block)
7
- @machine, @name, @transitions = machine, name, []
8
- if machine
9
- machine.klass.send(:define_method, "#{name}!") do |*args|
10
- machine.fire_event(name, self, true, *args)
11
- end
12
-
13
- machine.klass.send(:define_method, name.to_s) do |*args|
14
- machine.fire_event(name, self, false, *args)
15
- end
16
- end
17
- update(options, &block)
18
- end
19
-
20
- def fire(obj, to_state = nil, *args)
21
- transitions = @transitions.select { |t| t.from == obj.current_state(@machine ? @machine.name : nil) }
22
- raise InvalidTransition if transitions.size == 0
23
-
24
- next_state = nil
25
- transitions.each do |transition|
26
- next if to_state && !Array(transition.to).include?(to_state)
27
- if transition.perform(obj)
28
- next_state = to_state || Array(transition.to).first
29
- transition.execute(obj, *args)
30
- break
31
- end
32
- end
33
- next_state
34
- end
35
-
36
- def transitions_from_state?(state)
37
- @transitions.any? { |t| t.from? state }
38
- end
39
-
40
- def ==(event)
41
- if event.is_a? Symbol
42
- name == event
43
- else
44
- name == event.name
45
- end
46
- end
47
-
48
- def update(options = {}, &block)
49
- if options.key?(:success) then @success = options[:success] end
50
- if block then instance_eval(&block) end
51
- self
52
- end
53
-
54
- private
55
- def transitions(trans_opts)
56
- Array(trans_opts[:from]).each do |s|
57
- @transitions << StateTransition.new(trans_opts.merge({:from => s.to_sym}))
58
- end
59
- end
60
- end
61
- end
62
- end
@@ -1,75 +0,0 @@
1
- module ActiveModel
2
- module StateMachine
3
- class Machine
4
- attr_writer :initial_state
5
- attr_accessor :states, :events, :state_index
6
- attr_reader :klass, :name
7
-
8
- def initialize(klass, name, options = {}, &block)
9
- @klass, @name, @states, @state_index, @events = klass, name, [], {}, {}
10
- update(options, &block)
11
- end
12
-
13
- def initial_state
14
- @initial_state ||= (states.first ? states.first.name : nil)
15
- end
16
-
17
- def update(options = {}, &block)
18
- if options.key?(:initial) then @initial_state = options[:initial] end
19
- if block then instance_eval(&block) end
20
- self
21
- end
22
-
23
- def fire_event(event, record, persist, *args)
24
- state_index[record.current_state(@name)].call_action(:exit, record)
25
- if new_state = @events[event].fire(record, *args)
26
- state_index[new_state].call_action(:enter, record)
27
-
28
- if record.respond_to?(event_fired_callback)
29
- record.send(event_fired_callback, record.current_state, new_state)
30
- end
31
-
32
- record.current_state(@name, new_state, persist)
33
- record.send(@events[event].success) if @events[event].success
34
- true
35
- else
36
- if record.respond_to?(event_failed_callback)
37
- record.send(event_failed_callback, event)
38
- end
39
-
40
- false
41
- end
42
- end
43
-
44
- def states_for_select
45
- states.map { |st| [st.display_name, st.name.to_s] }
46
- end
47
-
48
- def events_for(state)
49
- events = @events.values.select { |event| event.transitions_from_state?(state) }
50
- events.map! { |event| event.name }
51
- end
52
-
53
- def current_state_variable
54
- "@#{@name}_current_state"
55
- end
56
-
57
- private
58
- def state(name, options = {})
59
- @states << (state_index[name] ||= State.new(name, :machine => self)).update(options)
60
- end
61
-
62
- def event(name, options = {}, &block)
63
- (@events[name] ||= Event.new(self, name)).update(options, &block)
64
- end
65
-
66
- def event_fired_callback
67
- @event_fired_callback ||= (@name == :default ? '' : "#{@name}_") + 'event_fired'
68
- end
69
-
70
- def event_failed_callback
71
- @event_failed_callback ||= (@name == :default ? '' : "#{@name}_") + 'event_failed'
72
- end
73
- end
74
- end
75
- end
@@ -1,47 +0,0 @@
1
- module ActiveModel
2
- module StateMachine
3
- class State
4
- attr_reader :name, :options
5
-
6
- def initialize(name, options = {})
7
- @name = name
8
- if machine = options.delete(:machine)
9
- machine.klass.define_state_query_method(name)
10
- end
11
- update(options)
12
- end
13
-
14
- def ==(state)
15
- if state.is_a? Symbol
16
- name == state
17
- else
18
- name == state.name
19
- end
20
- end
21
-
22
- def call_action(action, record)
23
- action = @options[action]
24
- case action
25
- when Symbol, String
26
- record.send(action)
27
- when Proc
28
- action.call(record)
29
- end
30
- end
31
-
32
- def display_name
33
- @display_name ||= name.to_s.gsub(/_/, ' ').capitalize
34
- end
35
-
36
- def for_select
37
- [display_name, name.to_s]
38
- end
39
-
40
- def update(options = {})
41
- if options.key?(:display) then @display_name = options.delete(:display) end
42
- @options = options
43
- self
44
- end
45
- end
46
- end
47
- end