resource_has 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 +4 -0
- data/Gemfile +4 -0
- data/Rakefile +1 -0
- data/lib/resource_has.rb +72 -0
- data/lib/resource_has/version.rb +3 -0
- data/resource_has.gemspec +25 -0
- metadata +68 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
data/lib/resource_has.rb
ADDED
@@ -0,0 +1,72 @@
|
|
1
|
+
require 'resource_has/version'
|
2
|
+
|
3
|
+
module ResourceHas
|
4
|
+
|
5
|
+
def self.included(base)
|
6
|
+
base.extend(ClassMethods)
|
7
|
+
end
|
8
|
+
## Class methods
|
9
|
+
module ClassMethods
|
10
|
+
def resource_has(*args, &block)
|
11
|
+
options = args.pop if args.last.is_a? Hash
|
12
|
+
if args.length == 1
|
13
|
+
modifier = :at_most
|
14
|
+
amount = 1
|
15
|
+
else
|
16
|
+
modifier = args.shift() unless args[0].is_a? Integer
|
17
|
+
amount = args.shift()
|
18
|
+
end
|
19
|
+
relation_name = args.shift()
|
20
|
+
args = {
|
21
|
+
:modifier => modifier,
|
22
|
+
:amount => amount,
|
23
|
+
:block => block,
|
24
|
+
:options => { :increment_by => amount, :on => %w(edit) }.merge(options || {})
|
25
|
+
}
|
26
|
+
before_filter :only => (args[:options].delete(:only) || args[:options].delete(:on)) do |controller| controller.send('__build_relation', relation_name, args) end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
## Instance methods
|
30
|
+
protected
|
31
|
+
|
32
|
+
def __build_relation(relation_name, args)
|
33
|
+
__quantify(relation_name, args).times do
|
34
|
+
nested_resource = resource_method_chain __get_builder_method(relation_name)
|
35
|
+
args[:block].call(nested_resource) if args[:block]
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def __quantify(relation_name, args)
|
40
|
+
#args.merge!({ :modifier => :at_most, :amount => 1, :increment_by => 1 }) if __is_single_relation? relation_name
|
41
|
+
return args[:options][:increment_by] unless args[:modifier]
|
42
|
+
quantifier = args[:amount] - __get_existing_relation_length(relation_name)
|
43
|
+
if args[:modifier].to_sym === :at_least
|
44
|
+
return args[:options][:increment_by] if quantifier < args[:options][:increment_by]
|
45
|
+
quantifier
|
46
|
+
elsif args[:modifier].to_sym === :at_most
|
47
|
+
args[:options][:increment_by] < quantifier ? args[:options][:increment_by] : quantifier
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def __get_builder_method(relation_name)
|
52
|
+
return 'build_%s' % relation_name if __is_single_relation?(relation_name)
|
53
|
+
return '%s.build' % relation_name
|
54
|
+
end
|
55
|
+
|
56
|
+
def resource_method_chain(method_chain)
|
57
|
+
return resource if method_chain.empty?
|
58
|
+
method_chain.split('.').flatten.inject(self.resource){ |object, method| object.send(method.to_sym) }
|
59
|
+
end
|
60
|
+
|
61
|
+
def __is_single_relation? relation_name
|
62
|
+
[:has_one].include?(resource.class.reflect_on_association(relation_name).macro)
|
63
|
+
end
|
64
|
+
|
65
|
+
def __get_existing_relation_length(relation_name)
|
66
|
+
relation = resource.send(relation_name)
|
67
|
+
return relation.length.to_i if relation.respond_to?(:length)
|
68
|
+
relation.blank? ? 0 : 1
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
ActionController::Base.send(:include, ResourceHas)
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "resource_has/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "resource_has"
|
7
|
+
s.version = ResourceHas::VERSION
|
8
|
+
s.authors = ["Andy M. Holland"]
|
9
|
+
s.email = ["andyholland1991@aol.com"]
|
10
|
+
s.homepage = "http://rubygems.org/gems/resource_has"
|
11
|
+
s.summary = %q{Build resource dependencies in controllers that inherit from InheritedResources::Base}
|
12
|
+
s.description = %q{Adds the class method "resource_has" (for building dependencies) when included by a controller that inherits from InheritedResources::Base}
|
13
|
+
|
14
|
+
s.rubyforge_project = "resource_has"
|
15
|
+
|
16
|
+
s.files = `git ls-files`.split("\n")
|
17
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
18
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
19
|
+
s.require_paths = ["lib"]
|
20
|
+
|
21
|
+
# specify any dependencies here; for example:
|
22
|
+
# s.add_development_dependency "rspec"
|
23
|
+
|
24
|
+
s.add_dependency('inherited_resources')
|
25
|
+
end
|
metadata
ADDED
@@ -0,0 +1,68 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: resource_has
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.2
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Andy M. Holland
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2013-04-07 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: inherited_resources
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
30
|
+
description: Adds the class method "resource_has" (for building dependencies) when
|
31
|
+
included by a controller that inherits from InheritedResources::Base
|
32
|
+
email:
|
33
|
+
- andyholland1991@aol.com
|
34
|
+
executables: []
|
35
|
+
extensions: []
|
36
|
+
extra_rdoc_files: []
|
37
|
+
files:
|
38
|
+
- .gitignore
|
39
|
+
- Gemfile
|
40
|
+
- Rakefile
|
41
|
+
- lib/resource_has.rb
|
42
|
+
- lib/resource_has/version.rb
|
43
|
+
- resource_has.gemspec
|
44
|
+
homepage: http://rubygems.org/gems/resource_has
|
45
|
+
licenses: []
|
46
|
+
post_install_message:
|
47
|
+
rdoc_options: []
|
48
|
+
require_paths:
|
49
|
+
- lib
|
50
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
51
|
+
none: false
|
52
|
+
requirements:
|
53
|
+
- - ! '>='
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: '0'
|
56
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
requirements: []
|
63
|
+
rubyforge_project: resource_has
|
64
|
+
rubygems_version: 1.8.24
|
65
|
+
signing_key:
|
66
|
+
specification_version: 3
|
67
|
+
summary: Build resource dependencies in controllers that inherit from InheritedResources::Base
|
68
|
+
test_files: []
|