auto_set 1.2.0

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: 9e494c395aca1b790701e5546cd7dfcdcd8469ab
4
+ data.tar.gz: 5af33c5e296b6819acaa5630001e5c777d949103
5
+ SHA512:
6
+ metadata.gz: 95c321680ec332d3c902215eaeaed6a3fa8e33ee063e352d8e2aa12879d22b8a77ca7fef3738bb755059d3c0d3d1b9f87e0a11cb1f75e7dad4166dafe7f79486
7
+ data.tar.gz: 01dcad5c85909ad2bfbae0f13ceb0b791112ccecd3b28f1af5cf4bba05c2d0447971fa9af17c1f8e693dc3eb39e5101d334c52445f19b70634acc966f67f1e30
data/.coveralls.yml ADDED
@@ -0,0 +1 @@
1
+ service_name: travis-ci
data/.gitignore ADDED
@@ -0,0 +1,35 @@
1
+ *.gem
2
+ *.rbc
3
+ /.config
4
+ /coverage/
5
+ /InstalledFiles
6
+ /pkg/
7
+ /spec/reports/
8
+ /test/tmp/
9
+ /test/version_tmp/
10
+ /tmp/
11
+
12
+ ## Specific to RubyMotion:
13
+ .dat*
14
+ .repl_history
15
+ build/
16
+
17
+ ## Documentation cache and generated files:
18
+ /.yardoc/
19
+ /_yardoc/
20
+ /doc/
21
+ /rdoc/
22
+
23
+ ## Environment normalisation:
24
+ /.bundle/
25
+ /vendor/bundle
26
+ /lib/bundler/man/
27
+
28
+ # for a library or gem, you might want to ignore these files since the code is
29
+ # intended to run in multiple environments; otherwise, check them in:
30
+ Gemfile.lock
31
+ .ruby-version
32
+ .ruby-gemset
33
+
34
+ # unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
35
+ .rvmrc
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --drb
2
+ --format Fuubar
3
+ --color
data/.travis.yml ADDED
@@ -0,0 +1,15 @@
1
+ language: ruby
2
+ cache: bundler
3
+
4
+ rvm:
5
+ - 2.0.0
6
+
7
+ script: 'bundle exec rake'
8
+
9
+ notifications:
10
+ email:
11
+ recipients:
12
+ - felipe@29sul.com.br
13
+ - elton@29sul.com.br
14
+ on_failure: change # [always|never|change]
15
+ on_success: change # [always|never|change]
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in auto_set.gemspec
4
+ gemspec
data/Guardfile ADDED
@@ -0,0 +1,5 @@
1
+ guard :rspec, cmd: 'bundle exec rspec' do
2
+ watch(%r{^spec/.+_spec\.rb$})
3
+ watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
4
+ watch('spec/spec_helper.rb') { "spec" }
5
+ end
data/README.md ADDED
@@ -0,0 +1,42 @@
1
+ # auto_set
2
+
3
+ [![Build Status](https://travis-ci.org/felipediesel/auto_set.svg?branch=master)](https://travis-ci.org/felipediesel/auto_set)
4
+ [![Coverage Status](https://coveralls.io/repos/felipediesel/auto_set/badge.svg?branch=master)](https://coveralls.io/r/felipediesel/auto_set?branch=master)
5
+ [![Code Climate](https://codeclimate.com/github/felipediesel/auto_set/badges/gpa.svg)](https://codeclimate.com/github/felipediesel/auto_set)
6
+
7
+ auto_set automatically update a column from a relationship in Rails.
8
+
9
+ ## Installation
10
+
11
+ You can use auto_set as a gem in Rails 4.
12
+
13
+ To use the gem version, put the following gem requirement in your `Gemfile`:
14
+
15
+ gem "auto_set"
16
+
17
+ ## Usage
18
+
19
+ Supposing you have 3 models: Project, Group and Task and when you create a task in a groupit need to be related also to project. So, to auto\_set update task.project_id with group.project.id, you do this:
20
+
21
+ auto_set :project, :group
22
+
23
+
24
+ The is also another case where you have a code that can be entered by the user and you want to relate it to an id. Let's assume that Group has a column project\_code and you want to set project_id with that project id:
25
+
26
+ auto_set :project, from: :code
27
+
28
+ ## Customizing
29
+
30
+ You can set different type of callback:
31
+
32
+ auto_set :column, :parent, before: :create
33
+
34
+ before can be used in both cases of use and it can be save (default), create or validation.
35
+
36
+ ## Compatibility
37
+
38
+ Tested with Rails 4.0.13 in Ruby 2.0.0
39
+
40
+ ## License
41
+
42
+ MIT License. Copyright 2011 29sul Tecnologia da Informação <http://www.29sul.com.br/>
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require 'rspec/core/rake_task'
2
+ require 'bundler/gem_tasks'
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task default: :spec
data/auto_set.gemspec ADDED
@@ -0,0 +1,37 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "auto_set/version"
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = "auto_set"
7
+ spec.version = AutoSet::VERSION
8
+ spec.licenses = %w(MIT)
9
+ spec.platform = Gem::Platform::RUBY
10
+ spec.authors = ["Felipe Diesel"]
11
+ spec.email = ["felipediesel@gmail.com"]
12
+ spec.homepage = "http://github.com/felipediesel/auto_set"
13
+ spec.summary = %q{automatically update a column from a relationship}
14
+ spec.description = %q{Automatically update a column from a relationship}
15
+
16
+ spec.rubyforge_project = "auto_set"
17
+
18
+ spec.files = `git ls-files`.split("\n")
19
+ spec.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
20
+ spec.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
21
+ spec.require_paths = ["lib"]
22
+
23
+ spec.add_dependency "activerecord", "~> 4.0"
24
+ spec.add_dependency "activesupport", "~> 4.0"
25
+
26
+ spec.add_development_dependency "bundler", "~> 1.3"
27
+ spec.add_development_dependency "rake"
28
+
29
+ spec.add_development_dependency "rspec"
30
+ spec.add_development_dependency "rspec-nc"
31
+ spec.add_development_dependency "guard"
32
+ spec.add_development_dependency "guard-rspec"
33
+ spec.add_development_dependency "fuubar"
34
+ spec.add_development_dependency "coveralls"
35
+
36
+ spec.add_development_dependency 'sqlite3'
37
+ end
data/lib/auto_set.rb ADDED
@@ -0,0 +1,10 @@
1
+ require "active_record"
2
+ require "active_support"
3
+ require "auto_set/version"
4
+
5
+ module AutoSet
6
+ autoload :SetColumn , "auto_set/set_column"
7
+ autoload :ActiveRecord , "auto_set/active_record"
8
+ end
9
+
10
+ ActiveRecord::Base.send :include, AutoSet::ActiveRecord
@@ -0,0 +1,15 @@
1
+ module AutoSet
2
+ module ActiveRecord
3
+ extend ActiveSupport::Concern
4
+
5
+ module ClassMethods
6
+ def auto_set(column, parents, options = {})
7
+ before = (parents.is_a?(Hash) ? parents : options).delete(:before)
8
+
9
+ callback = [:save, :create, :validation].include?(before) ? :"before_#{before}" : :before_save
10
+
11
+ self.send callback, SetColumn.new(column, parents, options)
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,73 @@
1
+ module AutoSet
2
+ class SetColumn
3
+ def initialize(column, parents, options = {})
4
+ @column = column
5
+
6
+ if parents.is_a? Hash
7
+ @options = parents.reverse_merge from: :code
8
+ else
9
+ @options = options || {}
10
+ @parents = parents
11
+ @parents = @parents.is_a?(Array) ? @parents : [ @parents ]
12
+ end
13
+ end
14
+
15
+ def before_save(record)
16
+ @record = record
17
+ if @parents.present?
18
+ direct
19
+ else
20
+ from_column
21
+ end
22
+ end
23
+
24
+ def before_create(record)
25
+ before_save record
26
+ end
27
+
28
+ def before_validation(record)
29
+ before_save record
30
+ end
31
+
32
+ private
33
+
34
+ def direct
35
+ if @record.send(@column).blank?
36
+ @record.send "#{@column}=", parent_object.send(@column)
37
+ end
38
+ end
39
+
40
+ def from_column
41
+ if @record.send("#{@column}_#{@options[:from]}_changed?")
42
+ from_column_changed
43
+ elsif @record.send("#{@column}_id_changed?")
44
+ from_column_id_changed
45
+ end
46
+ end
47
+
48
+ def parent_object
49
+ parent = @record
50
+ @parents.each do |parent_name|
51
+ parent = parent.send(parent_name) if parent.respond_to? parent_name
52
+ end
53
+
54
+ parent
55
+ end
56
+
57
+ def parent_from_column(column, from)
58
+ if @record.send("#{column}_#{from}").present?
59
+ reflection = @record.class.reflections[column.to_s]
60
+ reflection.klass.where(from => @record.send("#{column}_#{from}")).first if reflection.present?
61
+ end
62
+ end
63
+
64
+ def from_column_changed
65
+ @record.send "#{@column}=", parent_from_column(@column, @options[:from])
66
+ end
67
+
68
+ def from_column_id_changed
69
+ value = @record.send(@column).code if @record.send(@column).present?
70
+ @record.send "#{@column}_#{@options[:from]}=", value
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,3 @@
1
+ module AutoSet
2
+ VERSION = "1.2.0"
3
+ end
@@ -0,0 +1,29 @@
1
+ require 'spec_helper'
2
+ require 'models/project'
3
+ require 'models/group'
4
+ require 'models/task'
5
+
6
+ describe AutoSet do
7
+ before :all do
8
+ @project = Project.create title: 'My Awesome Project', code: 'proj1'
9
+ @group_1 = Group.create title: 'My Group', project_code: 'proj1'
10
+ @task = @group_1.tasks.create content: 'Write awesome documentation'
11
+
12
+ @group_2 = @project.groups.create title: 'Second Group'
13
+ end
14
+
15
+ describe 'parent' do
16
+ it { expect(@group_1.project_id).to eq 1 }
17
+ end
18
+
19
+ describe 'from' do
20
+ it { expect(@task.project_id).to eq 1 }
21
+ it { expect(@group_2.project_code).to eq 'proj1' }
22
+ it {
23
+ @group_2.project = nil
24
+ @group_2.save
25
+
26
+ expect(@group_2.project_code).to eq nil
27
+ }
28
+ end
29
+ end
@@ -0,0 +1,6 @@
1
+ class Group < ActiveRecord::Base
2
+ auto_set :project, from: :code, before: :validation
3
+
4
+ belongs_to :project
5
+ has_many :tasks
6
+ end
@@ -0,0 +1,3 @@
1
+ class Project < ActiveRecord::Base
2
+ has_many :groups
3
+ end
@@ -0,0 +1,6 @@
1
+ class Task < ActiveRecord::Base
2
+ auto_set :project, :group, before: :create
3
+
4
+ belongs_to :group
5
+ belongs_to :project
6
+ end
@@ -0,0 +1,9 @@
1
+ require 'coveralls'
2
+ Coveralls.wear!
3
+
4
+ require 'pry'
5
+ require 'auto_set'
6
+
7
+ ActiveRecord::Base.establish_connection adapter: "sqlite3", database: ":memory:"
8
+
9
+ require 'support/active_record'
@@ -0,0 +1,16 @@
1
+ ActiveRecord::Migration.create_table :projects do |t|
2
+ t.string :title
3
+ t.string :code
4
+ end
5
+
6
+ ActiveRecord::Migration.create_table :groups do |t|
7
+ t.string :title
8
+ t.references :project
9
+ t.string :project_code
10
+ end
11
+
12
+ ActiveRecord::Migration.create_table :tasks do |t|
13
+ t.string :content
14
+ t.references :group
15
+ t.references :project
16
+ end
metadata ADDED
@@ -0,0 +1,224 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: auto_set
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.2.0
5
+ platform: ruby
6
+ authors:
7
+ - Felipe Diesel
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-03-26 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activerecord
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: '4.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'
27
+ - !ruby/object:Gem::Dependency
28
+ name: activesupport
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ~>
32
+ - !ruby/object:Gem::Version
33
+ version: '4.0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ~>
39
+ - !ruby/object:Gem::Version
40
+ version: '4.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ~>
46
+ - !ruby/object:Gem::Version
47
+ version: '1.3'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: '1.3'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rspec-nc
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - '>='
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - '>='
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: guard
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - '>='
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - '>='
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: guard-rspec
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - '>='
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - '>='
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: fuubar
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - '>='
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - '>='
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: coveralls
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - '>='
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - '>='
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: sqlite3
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - '>='
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - '>='
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ description: Automatically update a column from a relationship
168
+ email:
169
+ - felipediesel@gmail.com
170
+ executables: []
171
+ extensions: []
172
+ extra_rdoc_files: []
173
+ files:
174
+ - .coveralls.yml
175
+ - .gitignore
176
+ - .rspec
177
+ - .travis.yml
178
+ - Gemfile
179
+ - Guardfile
180
+ - README.md
181
+ - Rakefile
182
+ - auto_set.gemspec
183
+ - lib/auto_set.rb
184
+ - lib/auto_set/active_record.rb
185
+ - lib/auto_set/set_column.rb
186
+ - lib/auto_set/version.rb
187
+ - spec/lib/active_record_spec.rb
188
+ - spec/models/group.rb
189
+ - spec/models/project.rb
190
+ - spec/models/task.rb
191
+ - spec/spec_helper.rb
192
+ - spec/support/active_record.rb
193
+ homepage: http://github.com/felipediesel/auto_set
194
+ licenses:
195
+ - MIT
196
+ metadata: {}
197
+ post_install_message:
198
+ rdoc_options: []
199
+ require_paths:
200
+ - lib
201
+ required_ruby_version: !ruby/object:Gem::Requirement
202
+ requirements:
203
+ - - '>='
204
+ - !ruby/object:Gem::Version
205
+ version: '0'
206
+ required_rubygems_version: !ruby/object:Gem::Requirement
207
+ requirements:
208
+ - - '>='
209
+ - !ruby/object:Gem::Version
210
+ version: '0'
211
+ requirements: []
212
+ rubyforge_project: auto_set
213
+ rubygems_version: 2.4.4
214
+ signing_key:
215
+ specification_version: 4
216
+ summary: automatically update a column from a relationship
217
+ test_files:
218
+ - spec/lib/active_record_spec.rb
219
+ - spec/models/group.rb
220
+ - spec/models/project.rb
221
+ - spec/models/task.rb
222
+ - spec/spec_helper.rb
223
+ - spec/support/active_record.rb
224
+ has_rdoc: