comply 1.2.0 → 1.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b662d78ac11be66ad06d3cb1b4e1bd733070f5bd
4
- data.tar.gz: 52d6cfcbbde33678af8a62c144cbc901098f30bc
3
+ metadata.gz: ee73736d6989d2b6f909ef8e39385d7cd8bf4d72
4
+ data.tar.gz: b22aacb5881c0bb6116e7d7b7122f392f8b821e1
5
5
  SHA512:
6
- metadata.gz: 2521a60c65b306b6b00263b7537b01d4e4e3d4d50584e0d3e7b7f383ea02847ac9aaca6c24b225fea5b042d3014cf98f5c744660029a00db1b9abdf9e123036b
7
- data.tar.gz: 7de391bee6898d2b714dfea02a053ed0883cf5d9e32bfc3e764f6a76cd190b2ca120eb91a03f7aa35a801b5d90dd785e6a8a6ba867cfffe0232d0ea444aa2250
6
+ metadata.gz: 277312618b13c1b4b648a6f10f2ae14a13a12c4c8ee73f6fb73771e9f5d1e4525bdebbd53e43f3cde0196f2bc4e51c2f2510362778af9b89e02dc462ca6dacff
7
+ data.tar.gz: 8bb27b8ea2a7cd92b88209980ea9222806c3f1704c1e5b90aee2d098c86836f285cd4281060feb23e3120de022fbe64e218847cdcd4d07b35f7480767019e0fe
@@ -0,0 +1,53 @@
1
+ class Comply.BaseValidatableForm
2
+ constructor: (@$form) ->
3
+ return if @$form.data('complied')
4
+ @$form.data('complied', true)
5
+ @inputs = @_inputs()
6
+ @model = @$form.data('validate-model')
7
+ @$button = @$form.find('[type=submit]')
8
+ @validationRoute = @$form.data('validate-route') or "/#{Comply.enginePath}/validations"
9
+ @$button.click @validateInputs
10
+ @$button.attr('disabled', false).removeClass('disabled')
11
+
12
+ validateInputs: (event) =>
13
+ event.preventDefault()
14
+ @validate inputs: @inputs, submit: true
15
+
16
+ validate: (options) ->
17
+ $.get @validationRoute, @_params(), (response) =>
18
+ @_onValidate(response, options)
19
+
20
+ if @_allSuccess(response)
21
+ if @_onValidationSuccess(response, options)
22
+ return @$form.submit() if options.submit
23
+ else
24
+ @_onValidationFailure(response, options)
25
+
26
+ if @_onValidationComplete(response, options)
27
+ @_setMessages(options.inputs, response)
28
+
29
+ # private
30
+
31
+ _onValidate: (response, options) ->
32
+ _onValidationSuccess: (response, options) -> true
33
+ _onValidationFailure: (response, options) -> true
34
+ _onValidationComplete: (response, options) -> true
35
+
36
+ _setMessages: (inputs, response) =>
37
+ for input in inputs
38
+ status = @_isSuccess(input, response)
39
+ input.setMessage status, @_responseValue(input, response, status)
40
+
41
+ _allSuccess: (response) -> not (err for field, err of response.error when err.length).length
42
+
43
+ _inputs: ->
44
+ for input in @$form.find('[data-validate][name]')
45
+ new Comply.ValidatableInput $(input), this
46
+
47
+ _isSuccess: (input, response) ->
48
+ if !!@_responseValue(input, response) then 'error' else 'success'
49
+
50
+ _params: -> "#{$.param(model: @model)}&#{@$form.serialize()}"
51
+
52
+ _responseValue: (input, response, status = 'error') ->
53
+ if response[status]? then response[status][input.attrName]
@@ -1,40 +1 @@
1
- class Comply.ValidatableForm
2
- constructor: (@$form) ->
3
- return if @$form.data('complied')
4
- @$form.data('complied', true)
5
- @inputs = @_inputs()
6
- @model = @$form.data('validate-model')
7
- @$button = @$form.find('[type=submit]')
8
- @validationRoute = @$form.data('validate-route') or "/#{Comply.enginePath}/validations"
9
- @$button.click @validateInputs
10
- @$button.attr('disabled', false).removeClass('disabled')
11
-
12
- validateInputs: (event) =>
13
- event.preventDefault()
14
- @validate inputs: @inputs, submit: true
15
-
16
- validate: (options) ->
17
- $.get @validationRoute, @_params(), (response) =>
18
- return @$form.submit() if options.submit and @_allSuccess(response)
19
- @_setMessages(options.inputs, response)
20
-
21
- # private
22
-
23
- _setMessages: (inputs, response) =>
24
- for input in inputs
25
- status = @_isSuccess(input, response)
26
- input.setMessage status, @_responseValue(input, response, status)
27
-
28
- _allSuccess: (response) -> not (err for field, err of response.error when err.length).length
29
-
30
- _inputs: ->
31
- for input in @$form.find('[data-validate][name]')
32
- new Comply.ValidatableInput $(input), this
33
-
34
- _isSuccess: (input, response) ->
35
- if !!@_responseValue(input, response) then 'error' else 'success'
36
-
37
- _params: -> "#{$.param(model: @model)}&#{@$form.serialize()}"
38
-
39
- _responseValue: (input, response, status = 'error') ->
40
- if response[status]? then response[status][input.attrName]
1
+ class Comply.ValidatableForm extends Comply.BaseValidatableForm
@@ -22,7 +22,10 @@ class Comply.ValidatableInput
22
22
  #private
23
23
 
24
24
  _dependency: ->
25
- new Comply.ValidatableInput($("#{@$el.data('validate-with')}[name]"), @form) if @$el.data('validate-with')?
25
+ if @$el.data('validate-with')?
26
+ new Comply.ValidatableInput(
27
+ $("#{@$el.data('validate-with')}[name]"), @form
28
+ )
26
29
 
27
30
  _forceValidate: -> @forceValidate or= @$el.data('validate-force')
28
31
 
@@ -34,7 +37,8 @@ class Comply.ValidatableInput
34
37
  _$multiparamFields: ->
35
38
  @$multiparamFields or= $(field) for field in @_multiparamFields()
36
39
 
37
- _submitValidations: => @form.validate inputs: (el for el in [this, @dependency] when el)
40
+ _submitValidations: =>
41
+ @form.validate inputs: (el for el in [this, @dependency] when el)
38
42
 
39
43
  _validatable: ->
40
44
  return true if @_forceValidate() or not @_multiparam()
@@ -1,9 +1,19 @@
1
+ require 'comply/whitelist_constantize'
2
+ begin
3
+ require 'strong_parameters'
4
+ rescue LoadError
5
+ end
6
+
1
7
  module Comply
2
8
  class ValidationsController < Comply::ApplicationController
3
9
  ssl_allowed :show
4
10
 
5
11
  before_filter :require_model, :require_fields
6
12
 
13
+ if ActiveModel.const_defined?(:ForbiddenAttributesProtection)
14
+ include ActiveModel::ForbiddenAttributesProtection
15
+ end
16
+
7
17
  def show
8
18
  @instance = validation_instance
9
19
  @instance.valid?
@@ -26,8 +36,8 @@ module Comply
26
36
  end
27
37
 
28
38
  def require_model
29
- @model = params[:model].classify.constantize if params[:model].present?
30
- rescue NameError
39
+ @model = Comply::WhitelistConstantize.constantize(params[:model]) if params[:model].present?
40
+ rescue NameError, Comply::WhitelistConstantize::NotWhitelistedError
31
41
  @model = nil
32
42
  ensure
33
43
  render json: { error: 'Model not found' }, status: 500 unless @model
@@ -1,3 +1,3 @@
1
1
  module Comply
2
- VERSION = '1.2.0'
2
+ VERSION = '1.4.0'
3
3
  end
@@ -0,0 +1,62 @@
1
+ require 'active_model/validations'
2
+
3
+ module Comply
4
+ module WhitelistConstantize
5
+
6
+ class MatcherFactory
7
+ attr_reader :obj, :options
8
+ def initialize(obj, options = {})
9
+ @obj = obj
10
+ @options = options
11
+ end
12
+
13
+ def to_matcher
14
+ if obj.is_a?(Module) && options[:include_inheritance]
15
+ procify_module
16
+ else
17
+ obj
18
+ end
19
+ end
20
+
21
+ private
22
+
23
+ def procify_module
24
+ -> (klass) { klass <= obj }
25
+ end
26
+ end
27
+
28
+ class NotWhitelistedError < ArgumentError
29
+ end
30
+
31
+ class << self
32
+ DEFAULT_PROC = MatcherFactory.new(ActiveModel::Validations, include_inheritance: true).to_matcher
33
+
34
+ def constantize(str)
35
+ whitelist!(str.classify.constantize)
36
+ end
37
+
38
+ def whitelist
39
+ @whitelist ||= [DEFAULT_PROC]
40
+ end
41
+
42
+ # obj can be a Class, Module or Proc.
43
+ # For classes and modules, optionally add `include_inheritance: true` to
44
+ # also match subclasses.
45
+ # Procs should accept one argument.
46
+ def allow(obj, opts = {})
47
+ whitelist << MatcherFactory.new(obj, opts).to_matcher
48
+ end
49
+
50
+ private
51
+
52
+ def whitelist!(obj)
53
+ obj.tap do |klass|
54
+ whitelist.detect(-> { raise NotWhitelistedError }) do |matcher|
55
+ matcher === klass || matcher == klass
56
+ end
57
+ end
58
+ end
59
+ end
60
+
61
+ end
62
+ end
metadata CHANGED
@@ -1,129 +1,115 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: comply
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
4
+ version: 1.4.0
5
5
  platform: ruby
6
6
  authors:
7
- - '@jacobaweiss'
8
- - '@andyjbas'
9
- - '@azach'
10
- - '@linedotstar'
11
- - '@cfurrow'
7
+ - "@jacobaweiss"
8
+ - "@andyjbas"
9
+ - "@azach"
10
+ - "@linedotstar"
11
+ - "@cfurrow"
12
12
  autorequire:
13
13
  bindir: bin
14
14
  cert_chain: []
15
- date: 2014-10-06 00:00:00.000000000 Z
15
+ date: 2015-04-29 00:00:00.000000000 Z
16
16
  dependencies:
17
17
  - !ruby/object:Gem::Dependency
18
18
  name: coffee-rails
19
19
  requirement: !ruby/object:Gem::Requirement
20
20
  requirements:
21
- - - '>='
21
+ - - ">="
22
22
  - !ruby/object:Gem::Version
23
23
  version: '0'
24
24
  type: :runtime
25
25
  prerelease: false
26
26
  version_requirements: !ruby/object:Gem::Requirement
27
27
  requirements:
28
- - - '>='
28
+ - - ">="
29
29
  - !ruby/object:Gem::Version
30
30
  version: '0'
31
31
  - !ruby/object:Gem::Dependency
32
32
  name: bartt-ssl_requirement
33
33
  requirement: !ruby/object:Gem::Requirement
34
34
  requirements:
35
- - - ~>
35
+ - - "~>"
36
36
  - !ruby/object:Gem::Version
37
37
  version: 1.4.2
38
38
  type: :runtime
39
39
  prerelease: false
40
40
  version_requirements: !ruby/object:Gem::Requirement
41
41
  requirements:
42
- - - ~>
42
+ - - "~>"
43
43
  - !ruby/object:Gem::Version
44
44
  version: 1.4.2
45
45
  - !ruby/object:Gem::Dependency
46
46
  name: rails
47
47
  requirement: !ruby/object:Gem::Requirement
48
48
  requirements:
49
- - - '>='
49
+ - - "~>"
50
50
  - !ruby/object:Gem::Version
51
- version: '0'
51
+ version: 3.2.0
52
52
  type: :runtime
53
53
  prerelease: false
54
54
  version_requirements: !ruby/object:Gem::Requirement
55
55
  requirements:
56
- - - '>='
56
+ - - "~>"
57
57
  - !ruby/object:Gem::Version
58
- version: '0'
58
+ version: 3.2.0
59
59
  - !ruby/object:Gem::Dependency
60
- name: jasmine-rails
60
+ name: strong_parameters
61
61
  requirement: !ruby/object:Gem::Requirement
62
62
  requirements:
63
- - - '>='
63
+ - - "~>"
64
64
  - !ruby/object:Gem::Version
65
- version: '0'
66
- type: :development
67
- prerelease: false
68
- version_requirements: !ruby/object:Gem::Requirement
69
- requirements:
70
- - - '>='
71
- - !ruby/object:Gem::Version
72
- version: '0'
73
- - !ruby/object:Gem::Dependency
74
- name: sinon-rails
75
- requirement: !ruby/object:Gem::Requirement
76
- requirements:
77
- - - '>='
78
- - !ruby/object:Gem::Version
79
- version: '0'
80
- type: :development
65
+ version: 0.2.0
66
+ type: :runtime
81
67
  prerelease: false
82
68
  version_requirements: !ruby/object:Gem::Requirement
83
69
  requirements:
84
- - - '>='
70
+ - - "~>"
85
71
  - !ruby/object:Gem::Version
86
- version: '0'
72
+ version: 0.2.0
87
73
  - !ruby/object:Gem::Dependency
88
- name: pry
74
+ name: pry-nav
89
75
  requirement: !ruby/object:Gem::Requirement
90
76
  requirements:
91
- - - '>='
77
+ - - ">="
92
78
  - !ruby/object:Gem::Version
93
79
  version: '0'
94
80
  type: :development
95
81
  prerelease: false
96
82
  version_requirements: !ruby/object:Gem::Requirement
97
83
  requirements:
98
- - - '>='
84
+ - - ">="
99
85
  - !ruby/object:Gem::Version
100
86
  version: '0'
101
87
  - !ruby/object:Gem::Dependency
102
88
  name: rspec-rails
103
89
  requirement: !ruby/object:Gem::Requirement
104
90
  requirements:
105
- - - ~>
91
+ - - "~>"
106
92
  - !ruby/object:Gem::Version
107
- version: '2.14'
93
+ version: 3.2.0
108
94
  type: :development
109
95
  prerelease: false
110
96
  version_requirements: !ruby/object:Gem::Requirement
111
97
  requirements:
112
- - - ~>
98
+ - - "~>"
113
99
  - !ruby/object:Gem::Version
114
- version: '2.14'
100
+ version: 3.2.0
115
101
  - !ruby/object:Gem::Dependency
116
102
  name: sqlite3
117
103
  requirement: !ruby/object:Gem::Requirement
118
104
  requirements:
119
- - - '>='
105
+ - - ">="
120
106
  - !ruby/object:Gem::Version
121
107
  version: '0'
122
108
  type: :development
123
109
  prerelease: false
124
110
  version_requirements: !ruby/object:Gem::Requirement
125
111
  requirements:
126
- - - '>='
112
+ - - ">="
127
113
  - !ruby/object:Gem::Version
128
114
  version: '0'
129
115
  description: Validate your ActiveRecord models on the client, showing their error
@@ -137,6 +123,7 @@ files:
137
123
  - MIT-LICENSE
138
124
  - README.md
139
125
  - Rakefile
126
+ - app/assets/javascripts/comply/base_validatable_form.js.coffee
140
127
  - app/assets/javascripts/comply/base_validation_message.js.coffee
141
128
  - app/assets/javascripts/comply/config.js.coffee
142
129
  - app/assets/javascripts/comply/index.js.coffee
@@ -149,6 +136,7 @@ files:
149
136
  - lib/comply.rb
150
137
  - lib/comply/engine.rb
151
138
  - lib/comply/version.rb
139
+ - lib/comply/whitelist_constantize.rb
152
140
  homepage: http://www.github.com/lumoslabs/comply
153
141
  licenses: []
154
142
  metadata: {}
@@ -158,19 +146,18 @@ require_paths:
158
146
  - lib
159
147
  required_ruby_version: !ruby/object:Gem::Requirement
160
148
  requirements:
161
- - - '>='
149
+ - - ">="
162
150
  - !ruby/object:Gem::Version
163
151
  version: '0'
164
152
  required_rubygems_version: !ruby/object:Gem::Requirement
165
153
  requirements:
166
- - - '>='
154
+ - - ">="
167
155
  - !ruby/object:Gem::Version
168
156
  version: '0'
169
157
  requirements: []
170
158
  rubyforge_project:
171
- rubygems_version: 2.4.1
159
+ rubygems_version: 2.2.3
172
160
  signing_key:
173
161
  specification_version: 4
174
162
  summary: Inline validation of your ActiveRecord models via the AJAX internets
175
163
  test_files: []
176
- has_rdoc: