pencil_pusher 0.0.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 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: []