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.
@@ -0,0 +1,4 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in resource_has.gemspec
4
+ gemspec
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -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,3 @@
1
+ module ResourceHas
2
+ VERSION = "0.0.2"
3
+ end
@@ -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: []