dactyl_form 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.
Files changed (3) hide show
  1. checksums.yaml +7 -0
  2. data/lib/dactyl_form.rb +125 -0
  3. metadata +58 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: a44f1d9c24004102f0bc0d6a68831b987c7aec02
4
+ data.tar.gz: c31179eaa53da893629af033d57708e2e717bf74
5
+ SHA512:
6
+ metadata.gz: 45b2c5baedd05621ca90e9913ba14a9944d5eb66c6aedca8124c0629230f2a2eb4664b0a9c8eeddabeb9fac197186a24b5216c0a16330e4c2422c76fb0670fb7
7
+ data.tar.gz: 83280bee850af5d07d034edd69ecc9a292f42806e573675be4a3469c359f000e6bdb16718d1a538f0623d696c9ecf13fc87fe4207f91ae1d47cc99b6a14f7920
@@ -0,0 +1,125 @@
1
+ # TODO Thread safety
2
+ # TODO Raise exceptions on invalid input
3
+ # TODO Possible normalizations infinite loop
4
+ # TODO Comments
5
+ # TODO (attribute)_change inspection and handling
6
+ # TODO Readme file
7
+ # TODO License file
8
+
9
+ class DactylForm
10
+
11
+ include ActiveModel::Validations
12
+
13
+ attr_reader :object
14
+
15
+ def initialize(object, params = nil)
16
+ @object = object
17
+ @params = params
18
+ @attribute_cache = {}
19
+ @persisted = object.persisted?
20
+ self.class.define_getters unless self.class.getters_defined?
21
+ end
22
+
23
+ def http_method
24
+ updating? ? :put : :post
25
+ end
26
+
27
+ def updating?
28
+ persisted?
29
+ end
30
+
31
+ def creating?
32
+ !updating?
33
+ end
34
+
35
+ def process
36
+ if valid?
37
+ save_object
38
+ true
39
+ else
40
+ restore_params
41
+ false
42
+ end
43
+ end
44
+
45
+ private
46
+
47
+ def self.object(name)
48
+ define_method(name) { @object }
49
+ end
50
+
51
+ def self.attributes(*attributes)
52
+ @attributes ||= []
53
+ @attributes += attributes
54
+ end
55
+
56
+ def self.define_getters
57
+ raise 'No attributes specified' if @attributes.blank?
58
+ @attributes.uniq.each { |attribute| define_getter(attribute) }
59
+ @getters_defined = true
60
+ end
61
+
62
+ def self.define_getter(attribute)
63
+ define_method(attribute) do
64
+ @attribute_cache.fetch(attribute) do
65
+
66
+ if params_provided?
67
+ value = read_from_params(attribute)
68
+ elsif persisted?
69
+ value = read_from_object(attribute)
70
+ else
71
+ value = read_from_default(attribute)
72
+ end
73
+ @attribute_cache[attribute] = value
74
+ end
75
+ end
76
+ end
77
+
78
+ def self.getters_defined?
79
+ !!@getters_defined
80
+ end
81
+
82
+ def params_provided?
83
+ !!@params
84
+ end
85
+
86
+ def persisted?
87
+ @persisted
88
+ end
89
+
90
+ def assign_attributes
91
+ raise "Form object should implement 'assign_attributes'"
92
+ end
93
+
94
+ def read_from_object(attribute)
95
+ getter = "#{attribute}_from_object"
96
+ respond_to?(getter) ? send(getter) : @object.send(attribute)
97
+ end
98
+
99
+ def read_from_default(attribute)
100
+ getter = "#{attribute}_from_default"
101
+ respond_to?(getter) ? send(getter) : nil
102
+ end
103
+
104
+ def read_from_params(attribute)
105
+ getter = "#{attribute}_from_params"
106
+ return @params[attribute] unless respond_to?(getter)
107
+
108
+ arity = method(getter).arity
109
+ arity == 0 ? send(getter) : send(getter, @params[attribute])
110
+ end
111
+
112
+ def save_object
113
+ assign_attributes
114
+ ActiveRecord::Base.transaction do
115
+ @object.save!
116
+ updating? ? try(:after_update) : try(:after_create)
117
+ end
118
+ end
119
+
120
+ def restore_params
121
+ @attribute_cache.each_key do |attribute|
122
+ @attribute_cache[attribute] = @params[attribute]
123
+ end
124
+ end
125
+ end
metadata ADDED
@@ -0,0 +1,58 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: dactyl_form
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Dmitry Gubitskiy
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-10-19 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rails
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '4.1'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '4.1'
27
+ description: Form objects made easy
28
+ email: d.gubitskiy@gmail.com
29
+ executables: []
30
+ extensions: []
31
+ extra_rdoc_files: []
32
+ files:
33
+ - lib/dactyl_form.rb
34
+ homepage: https://github.com/enthrops/dactyl_form
35
+ licenses:
36
+ - MIT
37
+ metadata: {}
38
+ post_install_message:
39
+ rdoc_options: []
40
+ require_paths:
41
+ - lib
42
+ required_ruby_version: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
47
+ required_rubygems_version: !ruby/object:Gem::Requirement
48
+ requirements:
49
+ - - ">="
50
+ - !ruby/object:Gem::Version
51
+ version: '0'
52
+ requirements: []
53
+ rubyforge_project:
54
+ rubygems_version: 2.4.2
55
+ signing_key:
56
+ specification_version: 4
57
+ summary: Form objects made easy
58
+ test_files: []