pr 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 +7 -0
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/.gitignore +5 -0
- data/.rspec +2 -0
- data/.travis.yml +10 -0
- data/Gemfile +4 -0
- data/README.md +52 -0
- data/Rakefile +39 -0
- data/features/active_model_compatibility.feature +20 -0
- data/features/step_definitions/active_model_steps.rb +27 -0
- data/features/support/aruba.rb +2 -0
- data/lib/pr.rb +8 -0
- data/lib/pr/active_form.rb +42 -0
- data/lib/pr/build_model.rb +24 -0
- data/lib/pr/define_field.rb +26 -0
- data/lib/pr/fields.rb +6 -0
- data/lib/pr/fields/boolean_field.rb +31 -0
- data/lib/pr/fields/date_field.rb +27 -0
- data/lib/pr/fields/float_field.rb +25 -0
- data/lib/pr/fields/generic_field.rb +23 -0
- data/lib/pr/fields/invalid_value.rb +6 -0
- data/lib/pr/fields/string_field.rb +23 -0
- data/lib/pr/form.rb +15 -0
- data/lib/pr/version.rb +3 -0
- data/pr.gemspec +25 -0
- data/spec/spec_helper.rb +4 -0
- data/spec/unit/pr/active_form_spec.rb +74 -0
- data/spec/unit/pr/build_model_spec.rb +31 -0
- data/spec/unit/pr/define_field_spec.rb +24 -0
- data/spec/unit/pr/fields/boolean_field_spec.rb +49 -0
- data/spec/unit/pr/fields/date_field_spec.rb +44 -0
- data/spec/unit/pr/fields/float_field_spec.rb +45 -0
- data/spec/unit/pr/fields/generic_field_spec.rb +31 -0
- data/spec/unit/pr/fields/string_field_spec.rb +32 -0
- data/spec/unit/pr/form_spec.rb +17 -0
- metadata +180 -0
- metadata.gz.sig +0 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 679887e96c55e4c6b5c183d1557cd1880c6fb9e2
|
4
|
+
data.tar.gz: baea6db819b904d1a60d32e3db9459a96b6d2211
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: deed03062a6e2b737c0c461cf0031f1b2eb849454038fc07b09eadbab8feac28f96d1e74c043e7d31d519bbcc0a090d0789aebcf5c5facf50140feae14241e89
|
7
|
+
data.tar.gz: 32df338de6e44e53fb6fdf5741c77dc8ff310c1a4ba81fc89047964c689e700afc64f2cdb78c7280b9303ac8c8ff63053427fc1734f27d9b9ae83c338fd0958d
|
checksums.yaml.gz.sig
ADDED
Binary file
|
data.tar.gz.sig
ADDED
Binary file
|
data/.rspec
ADDED
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
[](https://codeclimate.com/github/JonRowe/pr)
|
2
|
+
[](http://travis-ci.org/JonRowe/pr)
|
3
|
+
|
4
|
+
PR :: PublicRelations
|
5
|
+
======================
|
6
|
+
|
7
|
+
`PR` is a gem for handling user input with forms. The idea is to decouple
|
8
|
+
the logic of handling user input, the process of parsing what is
|
9
|
+
essentially raw string data into valid Ruby data, (via 'typecasting/parsing'
|
10
|
+
and validation), from the buisness logic and persistance of an application.
|
11
|
+
|
12
|
+
I am building it with the principle of seperating concerns and not mixing
|
13
|
+
things into the form objects as much as possible, I'd like the library to
|
14
|
+
be usuable without any mixins, but will also provide mixinable macros for
|
15
|
+
ease of usage.
|
16
|
+
|
17
|
+
## Installation
|
18
|
+
|
19
|
+
Add this line to your application's Gemfile:
|
20
|
+
|
21
|
+
gem 'pr'
|
22
|
+
|
23
|
+
And then execute:
|
24
|
+
|
25
|
+
$ bundle
|
26
|
+
|
27
|
+
Or install it yourself as:
|
28
|
+
|
29
|
+
$ gem install mongo_adaptor
|
30
|
+
|
31
|
+
## Usage
|
32
|
+
|
33
|
+
In general
|
34
|
+
|
35
|
+
require 'pr'
|
36
|
+
|
37
|
+
will require the form helper macros, field definitions and if `Rails` is
|
38
|
+
defined require the `ActiveForm` helper macro which allows the inclusion
|
39
|
+
of `ActiveModel` compliance into the forms you define.
|
40
|
+
|
41
|
+
You can also manually require the 3 main elements as you desire.
|
42
|
+
|
43
|
+
## Caveats
|
44
|
+
|
45
|
+
Work in progress.
|
46
|
+
|
47
|
+
## Contributing
|
48
|
+
|
49
|
+
1. Fork it
|
50
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
51
|
+
3. Commit your changes (`git commit -am 'Added some feature'`)
|
52
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
data/Rakefile
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
#!/usr/bin/env rake
|
2
|
+
# Add your own tasks in files placed in lib/tasks ending in .rake,
|
3
|
+
# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
|
4
|
+
|
5
|
+
$:.push File.expand_path("../lib", __FILE__)
|
6
|
+
|
7
|
+
begin
|
8
|
+
require 'bundler/gem_tasks'
|
9
|
+
rescue LoadError
|
10
|
+
warn "No Bundler, No Gem tasks"
|
11
|
+
end
|
12
|
+
|
13
|
+
begin
|
14
|
+
require 'rspec'
|
15
|
+
require 'rspec/core/rake_task'
|
16
|
+
|
17
|
+
desc "Run unit specs"
|
18
|
+
RSpec::Core::RakeTask.new :unit do |task|
|
19
|
+
task.pattern = 'spec/unit/**/*_spec.rb'
|
20
|
+
end
|
21
|
+
|
22
|
+
require 'cucumber'
|
23
|
+
require 'cucumber/rake/task'
|
24
|
+
|
25
|
+
desc "Run features"
|
26
|
+
Cucumber::Rake::Task.new(:features) do |t|
|
27
|
+
t.cucumber_opts = "features --format pretty"
|
28
|
+
end
|
29
|
+
|
30
|
+
rescue LoadError
|
31
|
+
%W[unit features].each do |task_name|
|
32
|
+
task task_name do
|
33
|
+
warn "Tests unavaiable without RSpec/Cucumber"
|
34
|
+
fail
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
task default: %w[unit features]
|
@@ -0,0 +1,20 @@
|
|
1
|
+
Feature: Active Model compatibility
|
2
|
+
In order to use forms with Rails
|
3
|
+
As a developer
|
4
|
+
I wish to use forms based on PR::Form that also comply with ActiveModel::Lint
|
5
|
+
|
6
|
+
@form @active-model
|
7
|
+
Scenario: Basic Active Model functionality
|
8
|
+
Given I have a form I wish to use with Rails
|
9
|
+
"""Ruby
|
10
|
+
require 'pr'
|
11
|
+
class MyForm
|
12
|
+
include PR::ActiveForm
|
13
|
+
end
|
14
|
+
"""
|
15
|
+
When I run the active model lint tests for
|
16
|
+
"""Ruby
|
17
|
+
MyForm.new
|
18
|
+
"""
|
19
|
+
|
20
|
+
Then it should pass
|
@@ -0,0 +1,27 @@
|
|
1
|
+
Given "I have a form I wish to use with Rails" do |file_content|
|
2
|
+
write_file 'my_form.rb', file_content
|
3
|
+
end
|
4
|
+
|
5
|
+
When "I run the active model lint tests for" do |instance|
|
6
|
+
write_file 'test_active_model_compliance.rb', <<-TEST
|
7
|
+
module Rails
|
8
|
+
end
|
9
|
+
|
10
|
+
require 'test/unit'
|
11
|
+
require '#{ File.expand_path "../../../" + dirs.join('/'), __FILE__ }/my_form'
|
12
|
+
|
13
|
+
class TestActiveModelCompliance < Test::Unit::TestCase
|
14
|
+
include ActiveModel::Lint::Tests
|
15
|
+
|
16
|
+
def model
|
17
|
+
#{ instance }
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
TEST
|
22
|
+
run_simple unescape 'ruby -Itest test_active_model_compliance.rb'
|
23
|
+
end
|
24
|
+
|
25
|
+
Then "it should pass" do
|
26
|
+
assert_partial_output '0 failures', all_output
|
27
|
+
end
|
data/lib/pr.rb
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'active_model'
|
2
|
+
require 'pr/form'
|
3
|
+
|
4
|
+
module PR
|
5
|
+
module ActiveForm
|
6
|
+
|
7
|
+
def self.included other
|
8
|
+
other.send :include, Form
|
9
|
+
other.send :include, ActiveModel::Validations
|
10
|
+
other.send :attr_accessor, :id
|
11
|
+
other.extend Compatibility
|
12
|
+
end
|
13
|
+
|
14
|
+
module Compatibility
|
15
|
+
def model_name
|
16
|
+
ActiveModel::Name.new self
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def to_partial_path
|
21
|
+
name = self.class.model_name.downcase
|
22
|
+
[name.pluralize,name].join '/'
|
23
|
+
end
|
24
|
+
|
25
|
+
def to_model
|
26
|
+
self
|
27
|
+
end
|
28
|
+
|
29
|
+
def persisted?
|
30
|
+
!(id.nil?)
|
31
|
+
end
|
32
|
+
|
33
|
+
def to_key
|
34
|
+
[:id] if persisted?
|
35
|
+
end
|
36
|
+
|
37
|
+
def to_param
|
38
|
+
id.to_s if persisted?
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
class BuildModel
|
2
|
+
def self.[] form, model
|
3
|
+
new(PR::FieldRegistry).for form, model
|
4
|
+
end
|
5
|
+
|
6
|
+
def initialize registry
|
7
|
+
@registry = registry
|
8
|
+
end
|
9
|
+
|
10
|
+
def for form, model
|
11
|
+
@registry.fields_for(form) do |field_name|
|
12
|
+
set model, field_name, value(form,field_name)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
def set thing, name, value
|
18
|
+
thing.send "#{name}=", value
|
19
|
+
end
|
20
|
+
def value thing, name
|
21
|
+
thing.send("__#{name}").convert
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
class DefineField
|
2
|
+
|
3
|
+
def on klass, field_name, field
|
4
|
+
var_name = "@field_#{field_name}"
|
5
|
+
field_setter = "#{field_name}="
|
6
|
+
actual_field = "__#{field_name}"
|
7
|
+
|
8
|
+
klass.class_eval do
|
9
|
+
define_method(actual_field) do
|
10
|
+
instance_variable_get(var_name) || send(field_setter,nil)
|
11
|
+
end
|
12
|
+
define_method(field_name) do
|
13
|
+
send(actual_field).raw
|
14
|
+
end
|
15
|
+
define_method(field_setter) do |value|
|
16
|
+
instance_variable_set var_name, field.new(*([value].compact))
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
def var name
|
23
|
+
"@field_#{name}"
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
data/lib/pr/fields.rb
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
module PR
|
2
|
+
module Fields
|
3
|
+
class BooleanField
|
4
|
+
TrueValues = [1,"1","true",true]
|
5
|
+
FalseValues = [0,"0","false",false, ""]
|
6
|
+
|
7
|
+
def initialize value = nil
|
8
|
+
@value = value
|
9
|
+
end
|
10
|
+
|
11
|
+
def populate value
|
12
|
+
@value = value
|
13
|
+
end
|
14
|
+
|
15
|
+
def raw
|
16
|
+
convert
|
17
|
+
end
|
18
|
+
|
19
|
+
def convert
|
20
|
+
if TrueValues.include? @value
|
21
|
+
return true
|
22
|
+
elsif FalseValues.include? @value
|
23
|
+
return false
|
24
|
+
else
|
25
|
+
@value ? true : false
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'date'
|
2
|
+
module PR
|
3
|
+
module Fields
|
4
|
+
class DateField
|
5
|
+
Format = '%d/%m/%Y'
|
6
|
+
|
7
|
+
def initialize value = ''
|
8
|
+
@value = value
|
9
|
+
end
|
10
|
+
|
11
|
+
def raw
|
12
|
+
@value
|
13
|
+
end
|
14
|
+
|
15
|
+
def populate date
|
16
|
+
@value = date.strftime Format
|
17
|
+
end
|
18
|
+
|
19
|
+
def convert
|
20
|
+
Date.strptime(@value,Format)
|
21
|
+
rescue ArgumentError
|
22
|
+
raise InvalidValue
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module PR
|
2
|
+
module Fields
|
3
|
+
class FloatField
|
4
|
+
|
5
|
+
def initialize value = ''
|
6
|
+
@value = value
|
7
|
+
end
|
8
|
+
|
9
|
+
def raw
|
10
|
+
@value
|
11
|
+
end
|
12
|
+
|
13
|
+
def populate float
|
14
|
+
@value = float.to_s
|
15
|
+
end
|
16
|
+
|
17
|
+
def convert
|
18
|
+
Float @value
|
19
|
+
rescue ArgumentError
|
20
|
+
raise InvalidValue
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module PR
|
2
|
+
module Fields
|
3
|
+
class GenericField
|
4
|
+
|
5
|
+
def initialize value = nil
|
6
|
+
@value = value
|
7
|
+
end
|
8
|
+
|
9
|
+
def raw
|
10
|
+
@value
|
11
|
+
end
|
12
|
+
|
13
|
+
def populate value
|
14
|
+
@value = value
|
15
|
+
end
|
16
|
+
|
17
|
+
def convert
|
18
|
+
@value
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module PR
|
2
|
+
module Fields
|
3
|
+
class StringField
|
4
|
+
|
5
|
+
def initialize value = ''
|
6
|
+
@value = value
|
7
|
+
end
|
8
|
+
|
9
|
+
def raw
|
10
|
+
@value
|
11
|
+
end
|
12
|
+
|
13
|
+
def populate value
|
14
|
+
@value = value
|
15
|
+
end
|
16
|
+
|
17
|
+
def convert
|
18
|
+
@value.to_s
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
data/lib/pr/form.rb
ADDED
data/lib/pr/version.rb
ADDED
data/pr.gemspec
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "pr/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "pr"
|
7
|
+
s.version = PR::VERSION
|
8
|
+
s.authors = ["Jon Rowe"]
|
9
|
+
s.email = ["hello@jonrowe.co.uk"]
|
10
|
+
s.homepage = "https://github.com/JonRowe/PR"
|
11
|
+
s.summary = %q{Public Relations tools for Rails}
|
12
|
+
s.description = %q{Form and Presenter libraries for interfacing the public with Rails}
|
13
|
+
|
14
|
+
s.files = `git ls-files`.split("\n")
|
15
|
+
s.test_files = `git ls-files -- {spec,features}/*`.split("\n")
|
16
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
17
|
+
s.require_paths = ["lib"]
|
18
|
+
|
19
|
+
s.add_development_dependency 'rake'
|
20
|
+
s.add_development_dependency 'rspec'
|
21
|
+
s.add_development_dependency 'cucumber'
|
22
|
+
s.add_development_dependency 'aruba'
|
23
|
+
s.add_development_dependency 'activemodel'
|
24
|
+
|
25
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,74 @@
|
|
1
|
+
require 'pr/active_form'
|
2
|
+
|
3
|
+
describe 'the PR Form' do
|
4
|
+
class TestForm
|
5
|
+
include PR::ActiveForm
|
6
|
+
end
|
7
|
+
let(:form_klass) { TestForm }
|
8
|
+
|
9
|
+
describe 'when included extends the other with its DSL' do
|
10
|
+
|
11
|
+
it 'sets up field to define fields' do
|
12
|
+
stub_const 'DefineAndRegister', double
|
13
|
+
DefineAndRegister.should_receive(:[]).with form_klass, :name, my: :options
|
14
|
+
form_klass.field :name, my: :options
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'sets up an id' do
|
18
|
+
form = form_klass.new
|
19
|
+
form.id = :my_id
|
20
|
+
expect(form.id).to eq :my_id
|
21
|
+
end
|
22
|
+
|
23
|
+
describe 'and makes the form ActiveModel compliant' do
|
24
|
+
let(:form) { form_klass.new }
|
25
|
+
subject { form }
|
26
|
+
|
27
|
+
it { should respond_to :id }
|
28
|
+
it { should respond_to :valid? }
|
29
|
+
it { should respond_to :errors }
|
30
|
+
|
31
|
+
it 'has a model name' do
|
32
|
+
expect(form_klass.model_name).to eq "TestForm"
|
33
|
+
expect(form_klass.model_name).to be_a ActiveModel::Name
|
34
|
+
end
|
35
|
+
|
36
|
+
its(:to_model) { should eq form }
|
37
|
+
its(:to_partial_path) { should eq 'testforms/testform' }
|
38
|
+
|
39
|
+
describe 'when not persisted' do
|
40
|
+
|
41
|
+
its(:persisted?) { should be_false }
|
42
|
+
its(:to_key) { should be_nil }
|
43
|
+
its(:to_param) { should be_nil }
|
44
|
+
end
|
45
|
+
|
46
|
+
describe 'when persisted' do
|
47
|
+
before do
|
48
|
+
form.id = 100
|
49
|
+
end
|
50
|
+
|
51
|
+
its(:persisted?) { should be_true }
|
52
|
+
its(:to_key) { should eq [:id] }
|
53
|
+
its(:to_param) { should == "100" }
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
describe 'and responds to ActiveModel errors' do
|
58
|
+
let(:errors) { double }
|
59
|
+
let(:form) { form_klass.new }
|
60
|
+
before { ActiveModel::Errors.stub(:new).and_return(errors) }
|
61
|
+
|
62
|
+
subject { form.errors }
|
63
|
+
|
64
|
+
it 'creates active model errors with itself' do
|
65
|
+
ActiveModel::Errors.should_receive(:new).with form
|
66
|
+
form.errors
|
67
|
+
end
|
68
|
+
it 'returns the errors object' do
|
69
|
+
expect(form.errors).to eq errors
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
74
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'pr/build_model'
|
2
|
+
|
3
|
+
describe 'building a model from a form' do
|
4
|
+
let(:model) { Struct.new(:a,:b).new }
|
5
|
+
let(:registry) { double }
|
6
|
+
|
7
|
+
let(:field_a) { double "field", convert: "a_value" }
|
8
|
+
let(:field_b) { double "field", convert: "b_value" }
|
9
|
+
let(:form) { double "form", __a: field_a, __b: field_b }
|
10
|
+
|
11
|
+
let(:builder) { BuildModel.new registry }
|
12
|
+
|
13
|
+
before do
|
14
|
+
registry.stub(:fields_for).and_yield(:a).and_yield(:b)
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'fetches fields from the registry' do
|
18
|
+
registry.should_receive(:fields_for).with(form)
|
19
|
+
builder.for form, model
|
20
|
+
end
|
21
|
+
it 'converts fields to values' do
|
22
|
+
field_a.should_receive(:convert)
|
23
|
+
field_b.should_receive(:convert)
|
24
|
+
builder.for form, model
|
25
|
+
end
|
26
|
+
it 'iterated over the fields and sets values' do
|
27
|
+
builder.for form, model
|
28
|
+
expect(model.a).to eq "a_value"
|
29
|
+
expect(model.b).to eq "b_value"
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'pr/fields/generic_field'
|
2
|
+
require 'pr/define_field'
|
3
|
+
|
4
|
+
describe 'defining a field on a form' do
|
5
|
+
let(:field) { PR::Fields::GenericField }
|
6
|
+
let(:form_klass) { Class.new }
|
7
|
+
let(:form) { form_klass.new }
|
8
|
+
let(:new_raw_value) { double "new raw field value" }
|
9
|
+
let(:define_field) { DefineField.new }
|
10
|
+
|
11
|
+
it 'defines a reader to return the raw value of the field' do
|
12
|
+
define_field.on form_klass, :name, field
|
13
|
+
expect(form.name).to eq field.new.raw
|
14
|
+
end
|
15
|
+
it 'defines a writer which will set the field value' do
|
16
|
+
define_field.on form_klass, :name, field
|
17
|
+
form.name = new_raw_value
|
18
|
+
expect(form.name).to eq new_raw_value
|
19
|
+
end
|
20
|
+
it 'defines a reader to return the actual field' do
|
21
|
+
define_field.on form_klass, :name, field
|
22
|
+
expect(form.__name).to be_a field
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'pr/fields/boolean_field'
|
2
|
+
|
3
|
+
describe 'a boolean field' do
|
4
|
+
let(:klass) { PR::Fields::BooleanField }
|
5
|
+
let(:value) { double "value" }
|
6
|
+
let(:field) { klass.new value }
|
7
|
+
|
8
|
+
describe "default value" do
|
9
|
+
subject { klass.new }
|
10
|
+
|
11
|
+
its(:raw) { should equal(false) }
|
12
|
+
its(:convert) { should equal(false) }
|
13
|
+
end
|
14
|
+
|
15
|
+
describe :raw do
|
16
|
+
let(:converted_value) { double "converted_value" }
|
17
|
+
|
18
|
+
it "should return the converted value" do
|
19
|
+
field.should_receive(:convert).and_return(converted_value)
|
20
|
+
field.raw.should == converted_value
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
describe "#populate" do
|
25
|
+
specify { field.populate(true); expect(field.raw).to equal true }
|
26
|
+
specify { field.populate(false); expect(field.raw).to equal false }
|
27
|
+
end
|
28
|
+
|
29
|
+
describe :convert do
|
30
|
+
let(:comparison_result) { double "true" }
|
31
|
+
|
32
|
+
context "true values" do
|
33
|
+
specify { expect( klass.new("1").convert ).to equal true }
|
34
|
+
specify { expect( klass.new(1).convert ).to equal true }
|
35
|
+
specify { expect( klass.new("true").convert ).to equal true }
|
36
|
+
specify { expect( klass.new(true).convert ).to equal true }
|
37
|
+
specify { expect( klass.new("something that will evaluate to true").convert ).to equal true }
|
38
|
+
end
|
39
|
+
|
40
|
+
context "false values" do
|
41
|
+
specify { expect( klass.new("0").convert ).to equal false }
|
42
|
+
specify { expect( klass.new(0).convert ).to equal false }
|
43
|
+
specify { expect( klass.new("false").convert ).to equal false }
|
44
|
+
specify { expect( klass.new(false).convert ).to equal false }
|
45
|
+
specify { expect( klass.new(nil).convert ).to equal false }
|
46
|
+
specify { expect( klass.new("").convert ).to equal false }
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'pr/fields/invalid_value'
|
2
|
+
require 'pr/fields/date_field'
|
3
|
+
|
4
|
+
describe 'a date field' do
|
5
|
+
let(:klass) { PR::Fields::DateField }
|
6
|
+
let(:value) { double "value" }
|
7
|
+
let(:field) { klass.new value }
|
8
|
+
|
9
|
+
describe "default value" do
|
10
|
+
subject { klass.new }
|
11
|
+
|
12
|
+
its(:raw) { should == '' }
|
13
|
+
specify { expect { subject.convert }.to raise_error PR::Fields::InvalidValue }
|
14
|
+
end
|
15
|
+
|
16
|
+
describe "raw" do
|
17
|
+
it "returns the value the field was initialized with" do
|
18
|
+
field.raw.should == value
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
describe "#populate" do
|
23
|
+
let(:value) { Date.civil 2011, 6, 1 }
|
24
|
+
|
25
|
+
subject { field.populate value }
|
26
|
+
specify { subject; field.raw.should == '01/06/2011' }
|
27
|
+
end
|
28
|
+
|
29
|
+
describe "convert" do
|
30
|
+
|
31
|
+
it "should attempt to parse the value as a uk formatted date" do
|
32
|
+
Date.should_receive(:strptime).with(value,'%d/%m/%Y')
|
33
|
+
field.convert
|
34
|
+
end
|
35
|
+
|
36
|
+
context "where value is not a valid date" do
|
37
|
+
it "should raise an InvalidFieldValueError" do
|
38
|
+
Date.should_receive(:strptime).and_raise(ArgumentError)
|
39
|
+
expect { field.convert }.to raise_error PR::Fields::InvalidValue
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'pr/fields/invalid_value'
|
2
|
+
require 'pr/fields/float_field'
|
3
|
+
|
4
|
+
describe 'a float field' do
|
5
|
+
let(:klass) { PR::Fields::FloatField }
|
6
|
+
let(:value) { double "value" }
|
7
|
+
let(:field) { klass.new value }
|
8
|
+
|
9
|
+
describe "default value" do
|
10
|
+
subject { klass.new }
|
11
|
+
its(:raw) { should == '' }
|
12
|
+
end
|
13
|
+
|
14
|
+
describe "#raw" do
|
15
|
+
it 'returns the raw value' do
|
16
|
+
expect(field.raw).to eq value
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
describe "#populate" do
|
21
|
+
let(:value) { 3.141 }
|
22
|
+
let(:field) { klass.new }
|
23
|
+
|
24
|
+
subject { field.populate value }
|
25
|
+
|
26
|
+
specify { subject; field.raw.should == "3.141" }
|
27
|
+
end
|
28
|
+
|
29
|
+
describe "#convert" do
|
30
|
+
|
31
|
+
context "where passed a stringified float value" do
|
32
|
+
let(:value) { "3.4" }
|
33
|
+
|
34
|
+
it "should return the float intepretation" do
|
35
|
+
field.convert.should == 3.4
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
context "where passed a string not containing a float value" do
|
40
|
+
let(:value) { "One Point Oh" }
|
41
|
+
|
42
|
+
specify { expect { field.convert }.to raise_error PR::Fields::InvalidValue }
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'pr/fields/generic_field'
|
2
|
+
|
3
|
+
describe 'a generic field' do
|
4
|
+
let(:klass) { PR::Fields::GenericField }
|
5
|
+
let(:value) { double "value" }
|
6
|
+
let(:field) { klass.new value }
|
7
|
+
|
8
|
+
describe "default value" do
|
9
|
+
subject { klass.new }
|
10
|
+
|
11
|
+
its(:raw) { should == nil }
|
12
|
+
its(:convert) { should == nil }
|
13
|
+
end
|
14
|
+
|
15
|
+
describe :raw do
|
16
|
+
it "should return the value the field was initialized with" do
|
17
|
+
field.raw.should == value
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
describe "#populate" do
|
22
|
+
subject { field.populate value }
|
23
|
+
specify { field.raw.should == value }
|
24
|
+
end
|
25
|
+
|
26
|
+
describe :convert do
|
27
|
+
it "should return the raw value" do
|
28
|
+
field.convert.should == value
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'pr/fields/string_field'
|
2
|
+
|
3
|
+
describe 'a string field' do
|
4
|
+
let(:klass) { PR::Fields::StringField }
|
5
|
+
let(:value) { double "value" }
|
6
|
+
let(:field) { klass.new value }
|
7
|
+
|
8
|
+
describe "default value" do
|
9
|
+
subject { klass.new }
|
10
|
+
|
11
|
+
its(:raw) { should == '' }
|
12
|
+
its(:convert) { should == '' }
|
13
|
+
end
|
14
|
+
|
15
|
+
describe "#populate" do
|
16
|
+
subject { field.populate value }
|
17
|
+
specify { field.raw.should == value }
|
18
|
+
end
|
19
|
+
|
20
|
+
describe :raw do
|
21
|
+
it "should return the value the field was initialized with" do
|
22
|
+
field.raw.should == value
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
describe :convert do
|
27
|
+
it "should return the string version of value" do
|
28
|
+
value.should_receive(:to_s).and_return "string value"
|
29
|
+
field.convert.should == "string value"
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'pr/form'
|
2
|
+
|
3
|
+
describe 'the PR Form' do
|
4
|
+
let(:form_klass) do
|
5
|
+
Class.new do
|
6
|
+
include PR::Form
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
describe 'when included extends the other with its DSL' do
|
11
|
+
it 'sets up field to define fields' do
|
12
|
+
stub_const 'DefineAndRegister', double
|
13
|
+
DefineAndRegister.should_receive(:[]).with form_klass, :name, my: :options
|
14
|
+
form_klass.field :name, my: :options
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
metadata
ADDED
@@ -0,0 +1,180 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: pr
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Jon Rowe
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain:
|
11
|
+
- |
|
12
|
+
-----BEGIN CERTIFICATE-----
|
13
|
+
MIIDVjCCAj6gAwIBAgIBADANBgkqhkiG9w0BAQUFADBRMQ4wDAYDVQQDDAVoZWxs
|
14
|
+
bzEXMBUGCgmSJomT8ixkARkWB2pvbnJvd2UxEjAQBgoJkiaJk/IsZAEZFgJjbzES
|
15
|
+
MBAGCgmSJomT8ixkARkWAnVrMB4XDTEzMDIwMzA4MTgwNloXDTE0MDIwMzA4MTgw
|
16
|
+
NlowUTEOMAwGA1UEAwwFaGVsbG8xFzAVBgoJkiaJk/IsZAEZFgdqb25yb3dlMRIw
|
17
|
+
EAYKCZImiZPyLGQBGRYCY28xEjAQBgoJkiaJk/IsZAEZFgJ1azCCASIwDQYJKoZI
|
18
|
+
hvcNAQEBBQADggEPADCCAQoCggEBAMhs6ng/SRrYfG7RtQx8liJTZs8tpz7PBnlH
|
19
|
+
qyOwuU0weJc7nh6C9C8LGyJzpkbjJJo1rfTMg7huDyL14Py82dfMDomApif8jNNI
|
20
|
+
8KtviAgB1DrWq0fCDLtu/M77+yuVV3OhDdrAFaBkT/euvdJ8cAKrLxbJ+klgvrcB
|
21
|
+
FK+c4PUV3/zBKghe0l7FuDhyQCsuLNDbWyFvDS97tPjeN6yWuszwg22vZMDdsuzN
|
22
|
+
Cj3M4LLSkbrt+AOUcysEJxI4t6uv2U1bRzHsDfAF0RI/Q7OMtUr+Dtz/2YJ47KKs
|
23
|
+
51ZRjLLGHd10XrIfFSfGyJj1dMbDgLsEBj1sFH4e6dy7gau8TaUCAwEAAaM5MDcw
|
24
|
+
CQYDVR0TBAIwADAdBgNVHQ4EFgQULu5JH2g7RAjoXaZt+fbrfNDI9IkwCwYDVR0P
|
25
|
+
BAQDAgSwMA0GCSqGSIb3DQEBBQUAA4IBAQAf5A4kB769DPKGjPZ++v42FwVi7X7v
|
26
|
+
RpufPs6R4YHyzHXaJmAqnhleZhVJijBgsdb2SigNRbg+IK8XYHg7jkonMgO8OS3D
|
27
|
+
C6w8VB5bI0PqyDOwCGcQkYHYlZZWCghAyBTSBowHAekMb9V3QjJtJ8XkizjshETO
|
28
|
+
ZCVI2AObjlJi8I10aK2tSo9sv2riCKZ92BVSM13zYWn+C/eCP/m9BDiw37UQtuQq
|
29
|
+
2feWfO4gCNmvfFjULOAYHq9JHEjN5SLSXvj5HdSnDcCyIfJKn5Ya3JahWQaWIsXf
|
30
|
+
/NPE/mB57TOwj+d7XUa2NC4HUadF8R51IYEcIB0PpIEzJlKtfXFcOZxO
|
31
|
+
-----END CERTIFICATE-----
|
32
|
+
date: 2013-03-31 00:00:00.000000000 Z
|
33
|
+
dependencies:
|
34
|
+
- !ruby/object:Gem::Dependency
|
35
|
+
name: rake
|
36
|
+
requirement: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
type: :development
|
42
|
+
prerelease: false
|
43
|
+
version_requirements: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - '>='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
- !ruby/object:Gem::Dependency
|
49
|
+
name: rspec
|
50
|
+
requirement: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
type: :development
|
56
|
+
prerelease: false
|
57
|
+
version_requirements: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: cucumber
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - '>='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
type: :development
|
70
|
+
prerelease: false
|
71
|
+
version_requirements: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - '>='
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
- !ruby/object:Gem::Dependency
|
77
|
+
name: aruba
|
78
|
+
requirement: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - '>='
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
type: :development
|
84
|
+
prerelease: false
|
85
|
+
version_requirements: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - '>='
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
- !ruby/object:Gem::Dependency
|
91
|
+
name: activemodel
|
92
|
+
requirement: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - '>='
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
type: :development
|
98
|
+
prerelease: false
|
99
|
+
version_requirements: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - '>='
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
description: Form and Presenter libraries for interfacing the public with Rails
|
105
|
+
email:
|
106
|
+
- hello@jonrowe.co.uk
|
107
|
+
executables: []
|
108
|
+
extensions: []
|
109
|
+
extra_rdoc_files: []
|
110
|
+
files:
|
111
|
+
- .gitignore
|
112
|
+
- .rspec
|
113
|
+
- .travis.yml
|
114
|
+
- Gemfile
|
115
|
+
- README.md
|
116
|
+
- Rakefile
|
117
|
+
- features/active_model_compatibility.feature
|
118
|
+
- features/step_definitions/active_model_steps.rb
|
119
|
+
- features/support/aruba.rb
|
120
|
+
- lib/pr.rb
|
121
|
+
- lib/pr/active_form.rb
|
122
|
+
- lib/pr/build_model.rb
|
123
|
+
- lib/pr/define_field.rb
|
124
|
+
- lib/pr/fields.rb
|
125
|
+
- lib/pr/fields/boolean_field.rb
|
126
|
+
- lib/pr/fields/date_field.rb
|
127
|
+
- lib/pr/fields/float_field.rb
|
128
|
+
- lib/pr/fields/generic_field.rb
|
129
|
+
- lib/pr/fields/invalid_value.rb
|
130
|
+
- lib/pr/fields/string_field.rb
|
131
|
+
- lib/pr/form.rb
|
132
|
+
- lib/pr/version.rb
|
133
|
+
- pr.gemspec
|
134
|
+
- spec/spec_helper.rb
|
135
|
+
- spec/unit/pr/active_form_spec.rb
|
136
|
+
- spec/unit/pr/build_model_spec.rb
|
137
|
+
- spec/unit/pr/define_field_spec.rb
|
138
|
+
- spec/unit/pr/fields/boolean_field_spec.rb
|
139
|
+
- spec/unit/pr/fields/date_field_spec.rb
|
140
|
+
- spec/unit/pr/fields/float_field_spec.rb
|
141
|
+
- spec/unit/pr/fields/generic_field_spec.rb
|
142
|
+
- spec/unit/pr/fields/string_field_spec.rb
|
143
|
+
- spec/unit/pr/form_spec.rb
|
144
|
+
homepage: https://github.com/JonRowe/PR
|
145
|
+
licenses: []
|
146
|
+
metadata: {}
|
147
|
+
post_install_message:
|
148
|
+
rdoc_options: []
|
149
|
+
require_paths:
|
150
|
+
- lib
|
151
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
152
|
+
requirements:
|
153
|
+
- - '>='
|
154
|
+
- !ruby/object:Gem::Version
|
155
|
+
version: '0'
|
156
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
157
|
+
requirements:
|
158
|
+
- - '>='
|
159
|
+
- !ruby/object:Gem::Version
|
160
|
+
version: '0'
|
161
|
+
requirements: []
|
162
|
+
rubyforge_project:
|
163
|
+
rubygems_version: 2.0.3
|
164
|
+
signing_key:
|
165
|
+
specification_version: 4
|
166
|
+
summary: Public Relations tools for Rails
|
167
|
+
test_files:
|
168
|
+
- features/active_model_compatibility.feature
|
169
|
+
- features/step_definitions/active_model_steps.rb
|
170
|
+
- features/support/aruba.rb
|
171
|
+
- spec/spec_helper.rb
|
172
|
+
- spec/unit/pr/active_form_spec.rb
|
173
|
+
- spec/unit/pr/build_model_spec.rb
|
174
|
+
- spec/unit/pr/define_field_spec.rb
|
175
|
+
- spec/unit/pr/fields/boolean_field_spec.rb
|
176
|
+
- spec/unit/pr/fields/date_field_spec.rb
|
177
|
+
- spec/unit/pr/fields/float_field_spec.rb
|
178
|
+
- spec/unit/pr/fields/generic_field_spec.rb
|
179
|
+
- spec/unit/pr/fields/string_field_spec.rb
|
180
|
+
- spec/unit/pr/form_spec.rb
|
metadata.gz.sig
ADDED
Binary file
|