pencil_pusher 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: b2804c9da0b757d0e9c1413c8b8c7655f96d3e49
4
+ data.tar.gz: 13e875e6a7d5007dffc91eb64ac35528c49b57b5
5
+ SHA512:
6
+ metadata.gz: 84f00e531874c7c38ca2b8ca265eda39d86beac36cbce26917ed4132a3c0a9a8ef102130d7d99ebd4d2fd9ca84d041006d6a380961f1cfe698264782746338e5
7
+ data.tar.gz: c618e5d6eff8f22fce9b4f9244c1428ec02530c66ced1be523a44d0d664500aac80f98d67168911222828f0f53dbac64d0ca16f0b69b8cce8526cbc0cf9ca45a
@@ -0,0 +1,66 @@
1
+ require 'active_model'
2
+ require 'virtus'
3
+
4
+ module PencilPusher
5
+ class Form
6
+ include ActiveModel::Validations
7
+ include ActiveModel::Validations::Callbacks
8
+ include Virtus.model
9
+
10
+ attr_reader :data
11
+
12
+ def initialize(data)
13
+ super(data)
14
+ if data.nil?
15
+ @validated = true
16
+ @bound = false
17
+ @data = {}
18
+ else
19
+ @validated = false
20
+ @bound = true
21
+ @data = data
22
+ end
23
+ errors.clear
24
+ end
25
+
26
+ after_validation :notify_validated
27
+
28
+ def valid?
29
+ @_valid ||= (
30
+ if bound?
31
+ super
32
+ else
33
+ true
34
+ end
35
+ )
36
+ end
37
+
38
+ def error_messages
39
+ @_error_messages ||= errors.messages
40
+ end
41
+
42
+ def cleaned_data
43
+ attributes.reject { |key, value| value.nil? }
44
+ end
45
+
46
+ def recognized_data
47
+ data.slice(*attributes.keys)
48
+ end
49
+
50
+ private :attributes
51
+ private
52
+
53
+ def bound?
54
+ @bound
55
+ end
56
+
57
+ def validated?
58
+ @validated
59
+ end
60
+
61
+ def notify_validated
62
+ @validated = true
63
+ end
64
+
65
+ end
66
+ end
@@ -0,0 +1,25 @@
1
+ module PencilPusher
2
+ module FormBuilder
3
+ def self.form(builder, data)
4
+ case
5
+ when builder.is_a?(Proc)
6
+ builder.call(data)
7
+ when builder.is_a?(Class)
8
+ builder.new(data)
9
+ else
10
+ raise 'wat'
11
+ end
12
+ end
13
+
14
+ def self.builder(form)
15
+ case
16
+ when form.is_a?(Proc)
17
+ form
18
+ when form.is_a?(Class)
19
+ ->(data) {form.new(data)}
20
+ else
21
+ raise 'wat'
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,38 @@
1
+ module PencilPusher
2
+ class HaveErrors
3
+ def initialize(field_name, expected_errors=[])
4
+ @field_name = field_name
5
+ @expected_errors = expected_errors
6
+ end
7
+
8
+ def matches?(form)
9
+ @actual = form
10
+ valid = form.valid?
11
+ if expected_errors.present?
12
+ form.error_messages[field_name] == expected_errors
13
+ else
14
+ form.error_messages[field_name].present?
15
+ end
16
+ end
17
+
18
+ def failure_message_for_should
19
+ if errors = actual.error_messages[field_name].presence
20
+ "expected field #{field_name} to have errors #{expected_errors} but had errors #{errors}"
21
+ else
22
+ "expected field #{field_name} to have errors #{expected_errors} but had no errors"
23
+ end
24
+ end
25
+
26
+ def failure_message_for_should_not
27
+ "expected no errors for field #{field_name} but found #{actual.error_messages[field_name]}"
28
+ end
29
+
30
+ def description
31
+ "have errors for #{field_name}"
32
+ end
33
+
34
+ private
35
+
36
+ attr_reader :field_name, :expected_errors, :actual
37
+ end
38
+ end
@@ -0,0 +1,39 @@
1
+ module PencilPusher
2
+ class HaveIntField
3
+ include PencilPusher::Matchers
4
+
5
+ def initialize(field_name, valid_value, error)
6
+ @field_name = field_name
7
+ @valid_value = valid_value
8
+ @error = error
9
+ end
10
+
11
+ def matches?(builder)
12
+ begin
13
+ FormBuilder.form(builder, {field_name => 'here'}).should have_errors(field_name, [error])
14
+ FormBuilder.form(builder, field_name => valid_value).should_not have_errors(field_name)
15
+ rescue => e
16
+ @error = e.message
17
+ raise e
18
+ end
19
+ true
20
+ end
21
+
22
+ def failure_message_for_should(actual, two)
23
+ @error
24
+ end
25
+
26
+ def failure_message_for_should_not(actual)
27
+ "expected #{actual} to not have int field #{field_name} but did"
28
+ end
29
+
30
+ def description
31
+ "have int field #{field_name}"
32
+ end
33
+
34
+ private
35
+
36
+ attr_reader :field_name, :valid_value, :error
37
+
38
+ end
39
+ end
@@ -0,0 +1,43 @@
1
+ module PencilPusher
2
+ class HaveRequiredChoiceField
3
+ include PencilPusher::Matchers
4
+
5
+ def initialize(field_name, valid_values, blank_error, invalid_error)
6
+ @field_name = field_name
7
+ @valid_values = valid_values
8
+ @blank_error = blank_error
9
+ @invalid_error = invalid_error
10
+ end
11
+
12
+ def matches?(form)
13
+ begin
14
+ form.should have_required_field(field_name, blank_error)
15
+ builder = FormBuilder.builder(form)
16
+ builder.call(field_name => 'invalid_value').should have_errors(field_name, [invalid_error])
17
+ valid_values.each do |valid_value|
18
+ builder.call(field_name => valid_value.to_s).should_not have_errors(field_name)
19
+ end
20
+ rescue => e
21
+ @error = e.message
22
+ raise e
23
+ end
24
+ true
25
+ end
26
+
27
+ def failure_message_for_should(actual, two)
28
+ @error
29
+ end
30
+
31
+ def failure_message_for_should_not(actual)
32
+ "expected #{actual} to not have required choice field #{field_name} but did"
33
+ end
34
+
35
+ def description
36
+ "have required choice field #{field_name}"
37
+ end
38
+
39
+ private
40
+
41
+ attr_reader :field_name, :blank_error, :invalid_error, :valid_values
42
+ end
43
+ end
@@ -0,0 +1,37 @@
1
+ module PencilPusher
2
+ class HaveRequiredField
3
+ include PencilPusher::Matchers
4
+
5
+ def initialize(field_name, error)
6
+ @field_name = field_name
7
+ @error = error
8
+ end
9
+
10
+ def matches?(form)
11
+ begin
12
+ builder = FormBuilder.builder(form)
13
+ builder.call(field_name => '').should have_errors(field_name, [error])
14
+ rescue => e
15
+ @error = e.message
16
+ raise e
17
+ end
18
+ true
19
+ end
20
+
21
+ def failure_message_for_should(actual, two)
22
+ @error
23
+ end
24
+
25
+ def failure_message_for_should_not(actual)
26
+ "expected #{actual} to not have required field #{field_name} but did"
27
+ end
28
+
29
+ def description
30
+ "have required field #{field_name}"
31
+ end
32
+
33
+ private
34
+
35
+ attr_reader :field_name, :error
36
+ end
37
+ end
@@ -0,0 +1,40 @@
1
+ module PencilPusher
2
+ class HaveRequiredFloatField
3
+ include PencilPusher::Matchers
4
+
5
+ def initialize(field_name, valid_value, blank_error, invalid_error)
6
+ @field_name = field_name
7
+ @valid_value = valid_value
8
+ @blank_error = blank_error
9
+ @invalid_error = invalid_error
10
+ end
11
+
12
+ def matches?(builder)
13
+ begin
14
+ builder.should have_required_field(field_name, blank_error)
15
+ FormBuilder.form(builder, {field_name => 'here'}).should have_errors(field_name, [invalid_error])
16
+ FormBuilder.form(builder, field_name => valid_value).should_not have_errors(field_name)
17
+ rescue => e
18
+ @error = e.message
19
+ raise e
20
+ end
21
+ true
22
+ end
23
+
24
+ def failure_message_for_should(actual, two)
25
+ @error
26
+ end
27
+
28
+ def failure_message_for_should_not(actual)
29
+ "expected #{actual} to not have required float field #{field_name} but did"
30
+ end
31
+
32
+ def description
33
+ "have required float field #{field_name}"
34
+ end
35
+
36
+ private
37
+
38
+ attr_reader :field_name, :valid_value, :blank_error, :invalid_error
39
+ end
40
+ end
@@ -0,0 +1,39 @@
1
+ module PencilPusher
2
+ class HaveRequiredIntField
3
+ include PencilPusher::Matchers
4
+
5
+ def initialize(field_name, valid_value, blank_error, invalid_error)
6
+ @field_name = field_name
7
+ @valid_value = valid_value
8
+ @blank_error = blank_error
9
+ @invalid_error = invalid_error
10
+ end
11
+
12
+ def matches?(builder)
13
+ begin
14
+ builder.should have_required_field(field_name, blank_error)
15
+ builder.should have_int_field(field_name, valid_value, invalid_error)
16
+ rescue => e
17
+ @error = e.message
18
+ raise e
19
+ end
20
+ true
21
+ end
22
+
23
+ def failure_message_for_should(actual, two)
24
+ @error
25
+ end
26
+
27
+ def failure_message_for_should_not(actual)
28
+ "expected #{actual} to not have required int field #{field_name} but did"
29
+ end
30
+
31
+ def description
32
+ "have required int field #{field_name}"
33
+ end
34
+
35
+ private
36
+
37
+ attr_reader :field_name, :valid_value, :blank_error, :invalid_error
38
+ end
39
+ end
@@ -0,0 +1,38 @@
1
+ module PencilPusher
2
+ class HaveRequiredTextField
3
+ include PencilPusher::Matchers
4
+
5
+ def initialize(field_name, valid_value, error)
6
+ @field_name = field_name
7
+ @valid_value = valid_value
8
+ @error = error
9
+ end
10
+
11
+ def matches?(builder)
12
+ begin
13
+ builder.should have_required_field(field_name, error)
14
+ builder.should have_text_field(field_name, valid_value)
15
+ rescue => e
16
+ @error = e.message
17
+ raise e
18
+ end
19
+ true
20
+ end
21
+
22
+ def failure_message_for_should(actual, two)
23
+ @error
24
+ end
25
+
26
+ def failure_message_for_should_not(actual)
27
+ "expected #{actual} to not have required text field #{field_name} but did"
28
+ end
29
+
30
+ def description
31
+ "have required text field #{field_name}"
32
+ end
33
+
34
+ private
35
+
36
+ attr_reader :field_name, :valid_value, :error
37
+ end
38
+ end
@@ -0,0 +1,36 @@
1
+ module PencilPusher
2
+ class HaveTextField
3
+ include PencilPusher::Matchers
4
+
5
+ def initialize(field_name, valid_value)
6
+ @field_name = field_name
7
+ @valid_value = valid_value
8
+ end
9
+
10
+ def matches?(builder)
11
+ begin
12
+ FormBuilder.form(builder, field_name => valid_value).should_not have_errors(field_name)
13
+ rescue => e
14
+ @error = e.message
15
+ raise e
16
+ end
17
+ true
18
+ end
19
+
20
+ def failure_message_for_should(actual, two)
21
+ @error
22
+ end
23
+
24
+ def failure_message_for_should_not(actual)
25
+ "expected #{actual} to not have text field #{field_name} but did"
26
+ end
27
+
28
+ def description
29
+ "have text field #{field_name}"
30
+ end
31
+
32
+ private
33
+
34
+ attr_reader :field_name, :valid_value
35
+ end
36
+ end
@@ -0,0 +1,37 @@
1
+ module PencilPusher
2
+ module Matchers
3
+
4
+ def have_errors(field_name, expected_errors=[])
5
+ HaveErrors.new(field_name, expected_errors)
6
+ end
7
+
8
+ def have_required_field(field_name, error)
9
+ HaveRequiredField.new(field_name, error)
10
+ end
11
+
12
+ def have_required_choice_field(field_name, valid_values, blank_error, invalid_error)
13
+ HaveRequiredChoiceField.new(field_name, valid_values, blank_error, invalid_error)
14
+ end
15
+
16
+ def have_required_float_field(field_name, valid_value, blank_error, invalid_error)
17
+ HaveRequiredFloatField.new(field_name, valid_value, blank_error, invalid_error)
18
+ end
19
+
20
+ def have_required_int_field(field_name, valid_value, blank_error, invalid_error)
21
+ HaveRequiredIntField.new(field_name, valid_value, blank_error, invalid_error)
22
+ end
23
+
24
+ def have_int_field(field_name, valid_value, invalid_error)
25
+ HaveIntField.new(field_name, valid_value, invalid_error)
26
+ end
27
+
28
+ def have_text_field(field_name, valid_value)
29
+ HaveTextField.new(field_name, valid_value)
30
+ end
31
+
32
+ def have_required_text_field(field_name, valid_value, error)
33
+ HaveRequiredTextField.new(field_name, valid_value, error)
34
+ end
35
+
36
+ end
37
+ end
@@ -0,0 +1,15 @@
1
+ module PencilPusher
2
+ module SharedFields
3
+
4
+ def required_int_field(field_name, blank_message, invalid_message)
5
+ attribute field_name, Integer
6
+
7
+ validates field_name,
8
+ presence: {message: blank_message},
9
+ numericality: {allow_blank: true,
10
+ only_integer: true,
11
+ message: invalid_message}
12
+ end
13
+
14
+ end
15
+ end
@@ -0,0 +1,16 @@
1
+ require 'pencil_pusher/form_builder'
2
+ require 'pencil_pusher/matchers'
3
+ require 'pencil_pusher/have_errors'
4
+ require 'pencil_pusher/have_int_field'
5
+ require 'pencil_pusher/have_required_choice_field'
6
+ require 'pencil_pusher/have_required_field'
7
+ require 'pencil_pusher/have_required_float_field'
8
+ require 'pencil_pusher/have_required_int_field'
9
+ require 'pencil_pusher/have_required_text_field'
10
+ require 'pencil_pusher/have_text_field'
11
+
12
+ module PencilPusher
13
+ module SpecHelpers
14
+ include PencilPusher::Matchers
15
+ end
16
+ end
metadata ADDED
@@ -0,0 +1,112 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: pencil_pusher
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Myles Megyesi
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-09-25 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activemodel
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: 4.0.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: 4.0.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: virtus
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ~>
32
+ - !ruby/object:Gem::Version
33
+ version: 1.0.0beta6
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ~>
39
+ - !ruby/object:Gem::Version
40
+ version: 1.0.0beta6
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ~>
46
+ - !ruby/object:Gem::Version
47
+ version: 10.1.0
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: 10.1.0
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: 2.14.1
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ~>
67
+ - !ruby/object:Gem::Version
68
+ version: 2.14.1
69
+ description: Form builder and validator
70
+ email:
71
+ - myles.megyesi@gmail.com
72
+ executables: []
73
+ extensions: []
74
+ extra_rdoc_files: []
75
+ files:
76
+ - lib/pencil_pusher/have_errors.rb
77
+ - lib/pencil_pusher/form_builder.rb
78
+ - lib/pencil_pusher/have_text_field.rb
79
+ - lib/pencil_pusher/have_int_field.rb
80
+ - lib/pencil_pusher/matchers.rb
81
+ - lib/pencil_pusher/spec_helpers.rb
82
+ - lib/pencil_pusher/have_required_choice_field.rb
83
+ - lib/pencil_pusher/have_required_field.rb
84
+ - lib/pencil_pusher/have_required_text_field.rb
85
+ - lib/pencil_pusher/shared_fields.rb
86
+ - lib/pencil_pusher/have_required_float_field.rb
87
+ - lib/pencil_pusher/form.rb
88
+ - lib/pencil_pusher/have_required_int_field.rb
89
+ homepage:
90
+ licenses: []
91
+ metadata: {}
92
+ post_install_message:
93
+ rdoc_options: []
94
+ require_paths:
95
+ - lib
96
+ required_ruby_version: !ruby/object:Gem::Requirement
97
+ requirements:
98
+ - - '>='
99
+ - !ruby/object:Gem::Version
100
+ version: '0'
101
+ required_rubygems_version: !ruby/object:Gem::Requirement
102
+ requirements:
103
+ - - '>='
104
+ - !ruby/object:Gem::Version
105
+ version: '0'
106
+ requirements: []
107
+ rubyforge_project:
108
+ rubygems_version: 2.0.3
109
+ signing_key:
110
+ specification_version: 4
111
+ summary: Form builder and validator
112
+ test_files: []