syrup_form_object 0.0.1 → 0.0.2

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.
data/.gitignore ADDED
@@ -0,0 +1,3 @@
1
+ custom_plan.rb
2
+ Gemfile.lock
3
+ zeus.json
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --colour
2
+ --drb
data/Gemfile ADDED
@@ -0,0 +1,9 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
4
+
5
+ group :development do
6
+ gem 'rake', '~> 10.1.0'
7
+ gem 'rspec', '~> 2.14.1'
8
+ gem 'yard', '~> 0.8.7'
9
+ end
data/README.md CHANGED
@@ -0,0 +1,42 @@
1
+ ==Syrup::FormObject
2
+
3
+ This is a simple implementation of the FormObject... pattern?
4
+
5
+ ==Installation
6
+
7
+ gem install syrup_form_object
8
+
9
+ or in the *Gemfile*
10
+
11
+ gem 'syrup_form_object'
12
+
13
+ ==Examples
14
+
15
+ class EventCreateForm < Syrup::FormObject
16
+ attr_accessor :event
17
+ accepts_nested_attributes_for :event
18
+
19
+ attribute :length_of_the_event, Integer
20
+ validates :length_of_the_event, numericality:{greater_than: 0}
21
+
22
+ def save(params)
23
+ if self.valid?
24
+ end_date = event.start_date + length_of_the_event.hours
25
+ event_attributes = params[:event_attributes].merge(end_date: end_date)
26
+ event = Event.new(event_attributes)
27
+ event.save
28
+ else
29
+ false
30
+ end
31
+ end
32
+ end
33
+
34
+ ==Some sources for Form Objects
35
+
36
+ https://github.com/apotonick/reform An implementation of Form Objects
37
+
38
+ http://railscasts.com/episodes/416-form-objects
39
+
40
+ http://pivotallabs.com/form-backing-objects-for-fun-and-profit/
41
+
42
+ http://blog.codeclimate.com/blog/2012/10/17/7-ways-to-decompose-fat-activerecord-models/
data/lib/syrup.rb ADDED
@@ -0,0 +1,4 @@
1
+ module Syrup
2
+ end
3
+
4
+ require 'syrup/form_object'
@@ -0,0 +1,26 @@
1
+ require 'virtus'
2
+
3
+ class Syrup::FormObject
4
+ include Virtus
5
+
6
+ def self.accepts_nested_attributes_for(*relations)
7
+ relations.each do |relation|
8
+ module_eval "def #{relation}_attributes=(attributes); #{relation}.attributes=attributes; end"
9
+ end
10
+ end
11
+
12
+ def initialize(params={})
13
+ build
14
+ assign_parameters(params)
15
+ end
16
+
17
+ def assign_parameters(params)
18
+ @params = params
19
+ params.each do |key, value|
20
+ self.send "#{key}=", value
21
+ end
22
+ end
23
+
24
+ def build; end
25
+
26
+ end
@@ -0,0 +1,3 @@
1
+ module Syrup
2
+ VERSION = '0.0.2'
3
+ end
@@ -0,0 +1,55 @@
1
+ require 'spec_helper'
2
+
3
+ class TestItem
4
+ include Virtus
5
+ attribute :test_item_value, Integer
6
+ end
7
+
8
+ class TestSubclass < Syrup::FormObject
9
+ attribute :test_value, String
10
+ attr_accessor :test_item
11
+ accepts_nested_attributes_for :test_item
12
+
13
+ def build
14
+ @built = true
15
+ self.test_item = TestItem.new
16
+ end
17
+
18
+ def has_called_build?
19
+ @built
20
+ end
21
+
22
+ end
23
+
24
+ describe Syrup::FormObject do
25
+ subject { TestSubclass.new(params) }
26
+ let(:params) { {} }
27
+ context '#new' do
28
+ context 'with no attributes' do
29
+ it 'creates a new object' do
30
+ expect(subject).to be_a(Syrup::FormObject)
31
+ end
32
+ it 'calls the build method' do
33
+ expect(subject).to have_called_build
34
+ end
35
+ end
36
+ context 'with a params hash' do
37
+ let(:params) {{ test_value: 'a Test',
38
+ test_item_attributes: {
39
+ test_item_value: '2'}}}
40
+ it 'creates a new object' do
41
+ expect(subject).to be_a(Syrup::FormObject)
42
+ end
43
+ it 'assigns the parameters in the right places' do
44
+ expect(subject.test_value).to eq 'a Test'
45
+ end
46
+ it 'assigns the parameters in the nested attributes' do
47
+ expect(subject.test_item.test_item_value).to eq 2
48
+ end
49
+ end
50
+ end
51
+
52
+ pending '#save'
53
+ pending '::find'
54
+
55
+ end
@@ -0,0 +1,5 @@
1
+ require 'rspec'
2
+ require 'syrup'
3
+
4
+ RSpec.configure do |config|
5
+ end
@@ -0,0 +1,20 @@
1
+ require File.expand_path('../lib/syrup/version', __FILE__)
2
+
3
+ Gem::Specification.new do |gem|
4
+ gem.name = 'syrup_form_object'
5
+ gem.version = Syrup::VERSION
6
+ gem.summary = "Form Objects for ActiveRecord"
7
+ gem.description = gem.summary
8
+ gem.authors = [ "Alex Siri" ]
9
+ gem.email = [ 'alexsiri7@gmail.com' ]
10
+ gem.homepage = 'https://github.com/alexsiri7/syrup_form_object'
11
+ gem.license = 'MIT'
12
+
13
+
14
+ gem.require_paths = [ "lib" ]
15
+ gem.files = `git ls-files`.split("\n")
16
+ gem.test_files = `git ls-files -- {spec}/*`.split("\n")
17
+ gem.extra_rdoc_files = %w[LICENSE README.md]
18
+
19
+ gem.add_dependency('virtus', '~> 1.0.0')
20
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: syrup_form_object
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -36,8 +36,17 @@ extra_rdoc_files:
36
36
  - LICENSE
37
37
  - README.md
38
38
  files:
39
+ - .gitignore
40
+ - .rspec
41
+ - Gemfile
39
42
  - LICENSE
40
43
  - README.md
44
+ - lib/syrup.rb
45
+ - lib/syrup/form_object.rb
46
+ - lib/syrup/version.rb
47
+ - spec/lib/syrup/form_object.rb
48
+ - spec/spec_helper.rb
49
+ - syrum_form_object.gemspec
41
50
  homepage: https://github.com/alexsiri7/syrup_form_object
42
51
  licenses:
43
52
  - MIT
@@ -64,3 +73,4 @@ signing_key:
64
73
  specification_version: 3
65
74
  summary: Form Objects for ActiveRecord
66
75
  test_files: []
76
+ has_rdoc: