auto_set 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
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: