needs_resources 0.1.0 → 0.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.
- data/lib/needs_resources/required_attribute_error.rb +2 -2
- data/lib/needs_resources/resource_container.rb +3 -3
- data/lib/needs_resources/resource_type.rb +23 -7
- data/lib/needs_resources/top_level_resources.rb +26 -9
- data/lib/needs_resources/version.rb +1 -1
- data/lib/needs_resources.rb +3 -5
- data/needs_resources.gemspec +0 -2
- metadata +3 -19
@@ -1,8 +1,8 @@
|
|
1
1
|
module NeedsResources
|
2
2
|
class RequiredAttributeError < StandardError
|
3
3
|
|
4
|
-
def initialize(
|
5
|
-
super "Missing resource in config file: #{
|
4
|
+
def initialize(obj, name)
|
5
|
+
super "Missing resource in config file: #{name} (in #{obj.respond_to?(:name) ? obj.name : obj.to_s})"
|
6
6
|
end
|
7
7
|
|
8
8
|
end
|
@@ -2,7 +2,7 @@ module NeedsResources
|
|
2
2
|
module ResourceContainer
|
3
3
|
|
4
4
|
def [](name)
|
5
|
-
resources[name] or raise MissingResourceError.new(child_resource_name name)
|
5
|
+
resources[name.to_sym] or raise MissingResourceError.new(child_resource_name name)
|
6
6
|
end
|
7
7
|
|
8
8
|
def child_resource_name(child_name)
|
@@ -14,7 +14,7 @@ module NeedsResources
|
|
14
14
|
end
|
15
15
|
|
16
16
|
def resources
|
17
|
-
@resources ||= {}
|
17
|
+
@resources ||= {}
|
18
18
|
end
|
19
19
|
|
20
20
|
def resources_needed
|
@@ -39,4 +39,4 @@ module NeedsResources
|
|
39
39
|
end
|
40
40
|
|
41
41
|
end
|
42
|
-
end
|
42
|
+
end
|
@@ -2,35 +2,51 @@ module NeedsResources
|
|
2
2
|
module ResourceType
|
3
3
|
|
4
4
|
def self.included(base)
|
5
|
-
children[base.name
|
5
|
+
children[underscore(base.name)] = base
|
6
|
+
|
6
7
|
base.instance_eval do
|
7
8
|
def attr(*names)
|
8
9
|
options = names.last.is_a?(Hash) ? names.pop : {}
|
9
10
|
names.flatten.each do |n|
|
10
|
-
attributes[n] = options
|
11
|
+
attributes[n.to_sym] = options
|
11
12
|
attr_reader n
|
12
13
|
end
|
13
14
|
end
|
14
15
|
|
16
|
+
def provide_top_level_instance(name=nil, args={})
|
17
|
+
name ||= ResourceType.underscore(self.name)
|
18
|
+
TopLevelResources.instance.add_default(name, args)
|
19
|
+
end
|
20
|
+
|
15
21
|
def attributes
|
16
|
-
@attributes ||= {}
|
22
|
+
@attributes ||= {}
|
17
23
|
end
|
18
24
|
end
|
25
|
+
|
19
26
|
base.attr :name, :required => true
|
20
27
|
end
|
21
28
|
|
29
|
+
def self.underscore(name)
|
30
|
+
name = name.to_s.dup
|
31
|
+
name.gsub!(/^.*::/, '')
|
32
|
+
name.gsub!(/([A-Z]+)([A-Z][a-z])/,'\1_\2')
|
33
|
+
name.gsub!(/([a-z\d])([A-Z])/,'\1_\2')
|
34
|
+
name.tr!("-", "_")
|
35
|
+
name.downcase!
|
36
|
+
name
|
37
|
+
end
|
38
|
+
|
22
39
|
def self.children
|
23
40
|
@children ||= {}
|
24
41
|
end
|
25
42
|
|
26
43
|
def initialize(args={})
|
27
|
-
args = args.
|
44
|
+
args = args.dup
|
28
45
|
self.class.attributes.each do |name, options|
|
29
|
-
value = args.delete(name) || options[:default]
|
46
|
+
value = args.delete(name.to_s) || args.delete(name.to_sym) || options[:default]
|
30
47
|
if options[:required] && value.nil?
|
31
48
|
raise RequiredAttributeError.new(self, name)
|
32
49
|
end
|
33
|
-
value = value.with_indifferent_access if value.is_a? Hash
|
34
50
|
instance_variable_set "@#{name}", value
|
35
51
|
end
|
36
52
|
args.each do |k, v|
|
@@ -39,4 +55,4 @@ module NeedsResources
|
|
39
55
|
end
|
40
56
|
|
41
57
|
end
|
42
|
-
end
|
58
|
+
end
|
@@ -7,10 +7,18 @@ module NeedsResources
|
|
7
7
|
include Singleton
|
8
8
|
include ResourceContainer
|
9
9
|
|
10
|
+
def add_default(name, args={})
|
11
|
+
defaults[name.to_sym] = args
|
12
|
+
end
|
13
|
+
|
10
14
|
private
|
11
15
|
|
16
|
+
def defaults
|
17
|
+
@defaults ||= {}
|
18
|
+
end
|
19
|
+
|
12
20
|
def resources
|
13
|
-
@resources ||= parse(resource_config_file)
|
21
|
+
@resources ||= parse_resources(defaults).merge parse(resource_config_file)
|
14
22
|
end
|
15
23
|
|
16
24
|
def resource_config_file
|
@@ -18,21 +26,26 @@ module NeedsResources
|
|
18
26
|
end
|
19
27
|
|
20
28
|
def parse(file)
|
21
|
-
|
22
|
-
return resources unless File.exist? file
|
29
|
+
return {} unless File.exist? file
|
23
30
|
|
24
31
|
yaml = YAML.load_file(file)
|
25
32
|
raise InvalidOrCorruptedResources unless yaml.is_a? Hash
|
26
33
|
|
27
|
-
yaml
|
34
|
+
parse_resources(yaml)
|
35
|
+
end
|
36
|
+
|
37
|
+
def parse_resources(hash)
|
38
|
+
resources = {}
|
39
|
+
|
40
|
+
hash.each do |name, value|
|
28
41
|
prefix, type = parse_resource_name(name)
|
29
|
-
resources[name] = parse_resource_value(name, type, value)
|
42
|
+
resources[name.to_sym] = parse_resource_value(name, type, value)
|
30
43
|
|
31
44
|
# Make sure both default_xyz and xyz are aliases
|
32
45
|
if prefix == 'default_'
|
33
|
-
resources[type] ||= name.to_sym
|
46
|
+
resources[type.to_sym] ||= name.to_sym
|
34
47
|
elsif prefix.nil?
|
35
|
-
resources[type] ||= "default_#{type}".to_sym
|
48
|
+
resources[type.to_sym] ||= "default_#{type}".to_sym
|
36
49
|
end
|
37
50
|
end
|
38
51
|
|
@@ -58,9 +71,13 @@ module NeedsResources
|
|
58
71
|
|
59
72
|
def parse_resource_value(name, type, value)
|
60
73
|
case value
|
61
|
-
when Symbol
|
74
|
+
when Symbol, String, Fixnum
|
62
75
|
value
|
63
76
|
when Hash
|
77
|
+
if value.has_key?("resources")
|
78
|
+
raise InvalidResourceValueError.new(name, value) unless value.is_a? Hash
|
79
|
+
value["resources"] = parse_resources value["resources"]
|
80
|
+
end
|
64
81
|
ResourceType.children[type].new(value.merge :name => name)
|
65
82
|
else
|
66
83
|
raise InvalidResourceValueError.new(name, value)
|
@@ -82,4 +99,4 @@ module NeedsResources
|
|
82
99
|
end
|
83
100
|
|
84
101
|
end
|
85
|
-
end
|
102
|
+
end
|
data/lib/needs_resources.rb
CHANGED
@@ -1,6 +1,4 @@
|
|
1
1
|
require 'set'
|
2
|
-
require 'active_support'
|
3
|
-
require 'active_support/core_ext'
|
4
2
|
|
5
3
|
module NeedsResources
|
6
4
|
|
@@ -18,7 +16,7 @@ module NeedsResources
|
|
18
16
|
alias :needs_resource :needs_resources
|
19
17
|
|
20
18
|
def self.ensure_resources
|
21
|
-
if (missing = missing_resources).
|
19
|
+
if (missing = missing_resources).any?
|
22
20
|
# TODO: maybe prompt user if missing?
|
23
21
|
raise MissingResourceError.new(*missing)
|
24
22
|
end
|
@@ -31,5 +29,5 @@ module NeedsResources
|
|
31
29
|
end
|
32
30
|
|
33
31
|
Dir[File.expand_path('../needs_resources/**/*.rb', __FILE__)].sort.each do |f|
|
34
|
-
|
35
|
-
end
|
32
|
+
load f
|
33
|
+
end
|
data/needs_resources.gemspec
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: needs_resources
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,24 +9,8 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-10-
|
13
|
-
dependencies:
|
14
|
-
- !ruby/object:Gem::Dependency
|
15
|
-
name: active_support
|
16
|
-
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
|
-
requirements:
|
19
|
-
- - ! '>'
|
20
|
-
- !ruby/object:Gem::Version
|
21
|
-
version: '2.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: '2.0'
|
12
|
+
date: 2013-10-29 00:00:00.000000000 Z
|
13
|
+
dependencies: []
|
30
14
|
description: Ruby gem to provide lightweight inversion of control type resources for
|
31
15
|
an application
|
32
16
|
email:
|