activerecord_json_validator 0.1 → 0.1.1

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e29421d6ac9835c09df419b687bdc6b018314d7c
4
- data.tar.gz: 7aa8a0cb8c45e9869a245b3db8da51df08e28393
3
+ metadata.gz: 21b3da5123efa04feb0b954cb2300a241de8f091
4
+ data.tar.gz: ce13d50fd4ef460f12ed57ab732834133425e254
5
5
  SHA512:
6
- metadata.gz: 43bc39dab8b9630be6bbfbf242b1e71374a51e59a192597b81eabe3751633c4b7f15f164f4bf728bee99aa3c1d376b6b40a6e6f913d2b393798efa97f3bedbcd
7
- data.tar.gz: 97ca990aeb1785b15e0ce2db84b9301e26dea7267680f140dd2e22ddb2aab7e3bf0c7984dfae7947bf2e1cea5fad051bdbbfb621f6a64647e59620a5486bf9b9
6
+ metadata.gz: b47ebab5fb3d2d4575d2c659201d83e300d7627ece382276429bc0eb7e37a0c104976578a645e74c1a2eaf80a017dbc1de78f2f2dd5f9f38e8bc7989fb91756c
7
+ data.tar.gz: fd32b8a98506390f1fae3b3acb8dd4f073edf4c7ec60f3aaad8d1bd5703e1547c006f3cc4363ba3080facbf20f1383a16005a02b9764eb73e8fcc767eaea662b
data/Rakefile CHANGED
@@ -9,3 +9,13 @@ desc 'Run all specs'
9
9
  RSpec::Core::RakeTask.new(:spec) do |task|
10
10
  task.pattern = 'spec/**/*_spec.rb'
11
11
  end
12
+
13
+ desc 'Start an IRB session with the gem'
14
+ task :console do
15
+ $:.unshift File.expand_path('..', __FILE__)
16
+ require 'activerecord_json_validator'
17
+ require 'irb'
18
+
19
+ ARGV.clear
20
+ IRB.start
21
+ end
@@ -2,15 +2,40 @@ class JsonValidator < ActiveModel::EachValidator
2
2
  def initialize(options)
3
3
  options.reverse_merge!(message: :invalid_json)
4
4
  options.reverse_merge!(schema: nil)
5
+ @attributes = options[:attributes]
5
6
 
6
7
  super
7
8
  end
8
9
 
10
+ # Redefine the setter method for the attributes, since we want to
11
+ # catch any MultiJson::LoadError errors.
12
+ def setup(model)
13
+ @attributes.each do |attribute|
14
+ model.class_eval <<-RUBY, __FILE__, __LINE__ + 1
15
+ define_method "#{attribute}=" do |args|
16
+ begin
17
+ @_#{attribute}_sane_json = true
18
+ super(args)
19
+ rescue MultiJson::LoadError
20
+ @_#{attribute}_sane_json = false
21
+ super({})
22
+ end
23
+ end
24
+ RUBY
25
+ end
26
+ end
27
+
28
+ # Validate the JSON value with a JSON schema path or String
9
29
  def validate_each(record, attribute, value)
10
- json_value = JSON.dump(value)
30
+ begin
31
+ json_value = JSON.dump(value)
32
+ rescue JSON::GeneratorError
33
+ json_value = ''
34
+ end
35
+
11
36
  errors = ::JSON::Validator.fully_validate(options.fetch(:schema), json_value)
12
37
 
13
- if errors.any?
38
+ if errors.any? || instance_variable_get(:"@_#{attribute}_sane_json") == false
14
39
  record.errors.add(attribute, options.fetch(:message), value: value)
15
40
  end
16
41
  end
@@ -1,5 +1,5 @@
1
1
  module ActiveRecord
2
2
  module JSONValidator
3
- VERSION = '0.1'
3
+ VERSION = '0.1.1'
4
4
  end
5
5
  end
@@ -5,7 +5,7 @@ describe JsonValidator do
5
5
  run_migration do
6
6
  create_table(:users, force: true) do |t|
7
7
  t.string :name
8
- t.text :profile
8
+ t.text :profile # Change this to `t.json` when Travis supports PostgreSQL 9.2+
9
9
  end
10
10
  end
11
11
 
@@ -39,4 +39,9 @@ describe JsonValidator do
39
39
  let(:attributes) { { name: 'Samuel Garneau', profile: { country: 'CA' } } }
40
40
  it { expect(User.new(attributes)).to be_valid }
41
41
  end
42
+
43
+ context 'with malformed JSON value' do
44
+ let(:attributes) { { name: 'Samuel Garneau', profile: 'foo:}bar' } }
45
+ it { expect(User.new(attributes)).to_not be_valid }
46
+ end
42
47
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activerecord_json_validator
3
3
  version: !ruby/object:Gem::Version
4
- version: '0.1'
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rémi Prévost
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-11-15 00:00:00.000000000 Z
11
+ date: 2013-11-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler