pr 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
+
[![Code Climate](https://codeclimate.com/github/JonRowe/pr.png)](https://codeclimate.com/github/JonRowe/pr)
|
2
|
+
[![Build Status](https://secure.travis-ci.org/JonRowe/pr.png)](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
|