garcun 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.
Files changed (139) hide show
  1. checksums.yaml +7 -0
  2. data/.gitattributes +17 -0
  3. data/.gitignore +197 -0
  4. data/.rspec +2 -0
  5. data/Gemfile +22 -0
  6. data/LICENSE +201 -0
  7. data/README.md +521 -0
  8. data/Rakefile +47 -0
  9. data/garcun.gemspec +83 -0
  10. data/lib/garcon.rb +290 -0
  11. data/lib/garcon/chef/chef_helpers.rb +343 -0
  12. data/lib/garcon/chef/coerce/coercer.rb +134 -0
  13. data/lib/garcon/chef/coerce/coercions/boolean_definitions.rb +34 -0
  14. data/lib/garcon/chef/coerce/coercions/date_definitions.rb +32 -0
  15. data/lib/garcon/chef/coerce/coercions/date_time_definitions.rb +32 -0
  16. data/lib/garcon/chef/coerce/coercions/fixnum_definitions.rb +34 -0
  17. data/lib/garcon/chef/coerce/coercions/float_definitions.rb +32 -0
  18. data/lib/garcon/chef/coerce/coercions/hash_definitions.rb +29 -0
  19. data/lib/garcon/chef/coerce/coercions/integer_definitions.rb +31 -0
  20. data/lib/garcon/chef/coerce/coercions/string_definitions.rb +45 -0
  21. data/lib/garcon/chef/coerce/coercions/time_definitions.rb +32 -0
  22. data/lib/garcon/chef/handler/devreporter.rb +127 -0
  23. data/lib/garcon/chef/log.rb +64 -0
  24. data/lib/garcon/chef/node.rb +100 -0
  25. data/lib/garcon/chef/provider/civilize.rb +209 -0
  26. data/lib/garcon/chef/provider/development.rb +159 -0
  27. data/lib/garcon/chef/provider/download.rb +420 -0
  28. data/lib/garcon/chef/provider/house_keeping.rb +265 -0
  29. data/lib/garcon/chef/provider/node_cache.rb +31 -0
  30. data/lib/garcon/chef/provider/partial.rb +183 -0
  31. data/lib/garcon/chef/provider/recovery.rb +80 -0
  32. data/lib/garcon/chef/provider/zip_file.rb +271 -0
  33. data/lib/garcon/chef/resource/attribute.rb +52 -0
  34. data/lib/garcon/chef/resource/base_dsl.rb +174 -0
  35. data/lib/garcon/chef/resource/blender.rb +140 -0
  36. data/lib/garcon/chef/resource/lazy_eval.rb +66 -0
  37. data/lib/garcon/chef/resource/resource_name.rb +109 -0
  38. data/lib/garcon/chef/secret_bag.rb +204 -0
  39. data/lib/garcon/chef/validations.rb +76 -0
  40. data/lib/garcon/chef_inclusions.rb +151 -0
  41. data/lib/garcon/configuration.rb +138 -0
  42. data/lib/garcon/core_ext.rb +39 -0
  43. data/lib/garcon/core_ext/array.rb +27 -0
  44. data/lib/garcon/core_ext/binding.rb +64 -0
  45. data/lib/garcon/core_ext/boolean.rb +66 -0
  46. data/lib/garcon/core_ext/duration.rb +271 -0
  47. data/lib/garcon/core_ext/enumerable.rb +34 -0
  48. data/lib/garcon/core_ext/file.rb +127 -0
  49. data/lib/garcon/core_ext/filetest.rb +62 -0
  50. data/lib/garcon/core_ext/hash.rb +279 -0
  51. data/lib/garcon/core_ext/kernel.rb +159 -0
  52. data/lib/garcon/core_ext/lazy.rb +222 -0
  53. data/lib/garcon/core_ext/method_access.rb +243 -0
  54. data/lib/garcon/core_ext/module.rb +92 -0
  55. data/lib/garcon/core_ext/nil.rb +53 -0
  56. data/lib/garcon/core_ext/numeric.rb +44 -0
  57. data/lib/garcon/core_ext/object.rb +342 -0
  58. data/lib/garcon/core_ext/pathname.rb +152 -0
  59. data/lib/garcon/core_ext/process.rb +41 -0
  60. data/lib/garcon/core_ext/random.rb +497 -0
  61. data/lib/garcon/core_ext/string.rb +312 -0
  62. data/lib/garcon/core_ext/struct.rb +49 -0
  63. data/lib/garcon/core_ext/symbol.rb +170 -0
  64. data/lib/garcon/core_ext/time.rb +234 -0
  65. data/lib/garcon/exceptions.rb +101 -0
  66. data/lib/garcon/inflections.rb +237 -0
  67. data/lib/garcon/inflections/defaults.rb +79 -0
  68. data/lib/garcon/inflections/inflections.rb +182 -0
  69. data/lib/garcon/inflections/rules_collection.rb +37 -0
  70. data/lib/garcon/secret.rb +271 -0
  71. data/lib/garcon/stash/format.rb +114 -0
  72. data/lib/garcon/stash/journal.rb +226 -0
  73. data/lib/garcon/stash/queue.rb +83 -0
  74. data/lib/garcon/stash/serializer.rb +86 -0
  75. data/lib/garcon/stash/store.rb +435 -0
  76. data/lib/garcon/task.rb +31 -0
  77. data/lib/garcon/task/atomic.rb +151 -0
  78. data/lib/garcon/task/atomic_boolean.rb +127 -0
  79. data/lib/garcon/task/condition.rb +99 -0
  80. data/lib/garcon/task/copy_on_notify_observer_set.rb +154 -0
  81. data/lib/garcon/task/copy_on_write_observer_set.rb +153 -0
  82. data/lib/garcon/task/count_down_latch.rb +92 -0
  83. data/lib/garcon/task/delay.rb +196 -0
  84. data/lib/garcon/task/dereferenceable.rb +144 -0
  85. data/lib/garcon/task/event.rb +119 -0
  86. data/lib/garcon/task/executor.rb +275 -0
  87. data/lib/garcon/task/executor_options.rb +59 -0
  88. data/lib/garcon/task/future.rb +107 -0
  89. data/lib/garcon/task/immediate_executor.rb +84 -0
  90. data/lib/garcon/task/ivar.rb +171 -0
  91. data/lib/garcon/task/lazy_reference.rb +74 -0
  92. data/lib/garcon/task/monotonic_time.rb +69 -0
  93. data/lib/garcon/task/obligation.rb +256 -0
  94. data/lib/garcon/task/observable.rb +101 -0
  95. data/lib/garcon/task/priority_queue.rb +234 -0
  96. data/lib/garcon/task/processor_count.rb +128 -0
  97. data/lib/garcon/task/read_write_lock.rb +304 -0
  98. data/lib/garcon/task/safe_task_executor.rb +58 -0
  99. data/lib/garcon/task/single_thread_executor.rb +97 -0
  100. data/lib/garcon/task/thread_pool/cached.rb +71 -0
  101. data/lib/garcon/task/thread_pool/executor.rb +294 -0
  102. data/lib/garcon/task/thread_pool/fixed.rb +61 -0
  103. data/lib/garcon/task/thread_pool/worker.rb +90 -0
  104. data/lib/garcon/task/timer.rb +44 -0
  105. data/lib/garcon/task/timer_set.rb +194 -0
  106. data/lib/garcon/task/timer_task.rb +377 -0
  107. data/lib/garcon/task/waitable_list.rb +58 -0
  108. data/lib/garcon/utility/ansi.rb +199 -0
  109. data/lib/garcon/utility/at_random.rb +77 -0
  110. data/lib/garcon/utility/crypto.rb +292 -0
  111. data/lib/garcon/utility/equalizer.rb +146 -0
  112. data/lib/garcon/utility/faker/extensions/array.rb +22 -0
  113. data/lib/garcon/utility/faker/extensions/symbol.rb +9 -0
  114. data/lib/garcon/utility/faker/faker.rb +164 -0
  115. data/lib/garcon/utility/faker/faker/company.rb +17 -0
  116. data/lib/garcon/utility/faker/faker/hacker.rb +30 -0
  117. data/lib/garcon/utility/faker/faker/version.rb +3 -0
  118. data/lib/garcon/utility/faker/locales/en-US.yml +83 -0
  119. data/lib/garcon/utility/faker/locales/en.yml +21 -0
  120. data/lib/garcon/utility/file_helper.rb +170 -0
  121. data/lib/garcon/utility/hookers.rb +178 -0
  122. data/lib/garcon/utility/interpolation.rb +90 -0
  123. data/lib/garcon/utility/memstash.rb +364 -0
  124. data/lib/garcon/utility/misc.rb +54 -0
  125. data/lib/garcon/utility/msg_from_god.rb +62 -0
  126. data/lib/garcon/utility/retry.rb +238 -0
  127. data/lib/garcon/utility/timeout.rb +58 -0
  128. data/lib/garcon/utility/uber/builder.rb +91 -0
  129. data/lib/garcon/utility/uber/callable.rb +7 -0
  130. data/lib/garcon/utility/uber/delegates.rb +13 -0
  131. data/lib/garcon/utility/uber/inheritable_attr.rb +37 -0
  132. data/lib/garcon/utility/uber/options.rb +101 -0
  133. data/lib/garcon/utility/uber/uber_version.rb +3 -0
  134. data/lib/garcon/utility/uber/version.rb +33 -0
  135. data/lib/garcon/utility/url_helper.rb +100 -0
  136. data/lib/garcon/utils.rb +29 -0
  137. data/lib/garcon/version.rb +62 -0
  138. data/lib/garcun.rb +24 -0
  139. metadata +680 -0
@@ -0,0 +1,21 @@
1
+ en:
2
+ faker:
3
+ separator: ' & '
4
+ company:
5
+ # Buzzword wordlist from http://www.1728.com/buzzword.htm
6
+ buzzwords:
7
+ - ["Adaptive", "Advanced", "Ameliorated", "Assimilated", "Automated", "Balanced", "Business-focused", "Centralized", "Cloned", "Compatible", "Configurable", "Cross-group", "Cross-platform", "Customer-focused", "Customizable", "Decentralized", "De-engineered", "Devolved", "Digitized", "Distributed", "Diverse", "Down-sized", "Enhanced", "Enterprise-wide", "Ergonomic", "Exclusive", "Expanded", "Extended", "Face to face", "Focused", "Front-line", "Fully-configurable", "Function-based", "Fundamental", "Future-proofed", "Grass-roots", "Horizontal", "Implemented", "Innovative", "Integrated", "Intuitive", "Inverse", "Managed", "Mandatory", "Monitored", "Multi-channelled", "Multi-lateral", "Multi-layered", "Multi-tiered", "Networked", "Object-based", "Open-architected", "Open-source", "Operative", "Optimized", "Optional", "Organic", "Organized", "Persevering", "Persistent", "Phased", "Polarised", "Pre-emptive", "Proactive", "Profit-focused", "Profound", "Programmable", "Progressive", "Public-key", "Quality-focused", "Reactive", "Realigned", "Re-contextualized", "Re-engineered", "Reduced", "Reverse-engineered", "Right-sized", "Robust", "Seamless", "Secured", "Self-enabling", "Sharable", "Stand-alone", "Streamlined", "Switchable", "Synchronised", "Synergistic", "Synergized", "Team-oriented", "Total", "Triple-buffered", "Universal", "Up-sized", "Upgradable", "User-centric", "User-friendly", "Versatile", "Virtual", "Visionary", "Vision-oriented"]
8
+ - ["24 hour", "24/7", "3rd generation", "4th generation", "5th generation", "6th generation", "actuating", "analyzing", "asymmetric", "asynchronous", "attitude-oriented", "background", "bandwidth-monitored", "bi-directional", "bifurcated", "bottom-line", "clear-thinking", "client-driven", "client-server", "coherent", "cohesive", "composite", "context-sensitive", "contextually-based", "content-based", "dedicated", "demand-driven", "didactic", "directional", "discrete", "disintermediate", "dynamic", "eco-centric", "empowering", "encompassing", "even-keeled", "executive", "explicit", "exuding", "fault-tolerant", "foreground", "fresh-thinking", "full-range", "global", "grid-enabled", "heuristic", "high-level", "holistic", "homogeneous", "human-resource", "hybrid", "impactful", "incremental", "intangible", "interactive", "intermediate", "leading edge", "local", "logistical", "maximized", "methodical", "mission-critical", "mobile", "modular", "motivating", "multimedia", "multi-state", "multi-tasking", "national", "needs-based", "neutral", "next generation", "non-volatile", "object-oriented", "optimal", "optimizing", "radical", "real-time", "reciprocal", "regional", "responsive", "scalable", "secondary", "solution-oriented", "stable", "static", "systematic", "systemic", "system-worthy", "tangible", "tertiary", "transitional", "uniform", "upward-trending", "user-facing", "value-added", "web-enabled", "well-modulated", "zero administration", "zero defect", "zero tolerance"]
9
+ - ["ability", "access", "adapter", "algorithm", "alliance", "analyzer", "application", "approach", "architecture", "archive", "artificial intelligence", "array", "attitude", "benchmark", "budgetary management", "capability", "capacity", "challenge", "circuit", "collaboration", "complexity", "concept", "conglomeration", "contingency", "core", "customer loyalty", "database", "data-warehouse", "definition", "emulation", "encoding", "encryption", "extranet", "firmware", "flexibility", "focus group", "forecast", "frame", "framework", "function", "functionalities", "Graphic Interface", "groupware", "Graphical User Interface", "hardware", "help-desk", "hierarchy", "hub", "implementation", "info-mediaries", "infrastructure", "initiative", "installation", "instruction set", "interface", "internet solution", "intranet", "knowledge user", "knowledge base", "local area network", "leverage", "matrices", "matrix", "methodology", "middleware", "migration", "model", "moderator", "monitoring", "moratorium", "neural-net", "open architecture", "open system", "orchestration", "paradigm", "parallelism", "policy", "portal", "pricing structure", "process improvement", "product", "productivity", "project", "projection", "protocol", "secured line", "service-desk", "software", "solution", "standardization", "strategy", "structure", "success", "superstructure", "support", "synergy", "system engine", "task-force", "throughput", "time-frame", "toolset", "utilisation", "website", "workforce"]
10
+ # BS wordlist from http://dack.com/web/bullshit.html
11
+ bs:
12
+ - ["implement", "utilize", "integrate", "streamline", "optimize", "evolve", "transform", "embrace", "enable", "orchestrate", "leverage", "reinvent", "aggregate", "architect", "enhance", "incentivize", "morph", "empower", "envisioneer", "monetize", "harness", "facilitate", "seize", "disintermediate", "synergize", "strategize", "deploy", "brand", "grow", "target", "syndicate", "synthesize", "deliver", "mesh", "incubate", "engage", "maximize", "benchmark", "expedite", "reintermediate", "whiteboard", "visualize", "repurpose", "innovate", "scale", "unleash", "drive", "extend", "engineer", "revolutionize", "generate", "exploit", "transition", "e-enable", "iterate", "cultivate", "matrix", "productize", "redefine", "recontextualize"]
13
+ - ["clicks-and-mortar", "value-added", "vertical", "proactive", "robust", "revolutionary", "scalable", "leading-edge", "innovative", "intuitive", "strategic", "e-business", "mission-critical", "sticky", "one-to-one", "24/7", "end-to-end", "global", "B2B", "B2C", "granular", "frictionless", "virtual", "viral", "dynamic", "24/365", "best-of-breed", "killer", "magnetic", "bleeding-edge", "web-enabled", "interactive", "dot-com", "sexy", "back-end", "real-time", "efficient", "front-end", "distributed", "seamless", "extensible", "turn-key", "world-class", "open-source", "cross-platform", "cross-media", "synergistic", "bricks-and-clicks", "out-of-the-box", "enterprise", "integrated", "impactful", "wireless", "transparent", "next-generation", "cutting-edge", "user-centric", "visionary", "customized", "ubiquitous", "plug-and-play", "collaborative", "compelling", "holistic", "rich"]
14
+ - ["synergies", "web-readiness", "paradigms", "markets", "partnerships", "infrastructures", "platforms", "initiatives", "channels", "eyeballs", "communities", "ROI", "solutions", "e-tailers", "e-services", "action-items", "portals", "niches", "technologies", "content", "vortals", "supply-chains", "convergence", "relationships", "architectures", "interfaces", "e-markets", "e-commerce", "systems", "bandwidth", "infomediaries", "models", "mindshare", "deliverables", "users", "schemas", "networks", "applications", "metrics", "e-business", "functionalities", "experiences", "web services", "methodologies"]
15
+
16
+ hacker:
17
+ abbreviation: [TCP,HTTP,SDD,RAM,GB,CSS,SSL,AGP,SQL,FTP,PCI,AI,ADP,RSS,XML,EXE,COM,HDD,THX,SMTP,SMS,USB,PNG,SAS,IB,SCSI,JSON,XSS,JBOD]
18
+ adjective: [auxiliary,primary,back-end,digital,open-source,virtual,cross-platform,redundant,online,haptic,multi-byte,bluetooth,wireless,1080p,neural, optical,solid state,mobile]
19
+ noun: [driver,protocol,bandwidth,panel,microchip,program,port,card,array, interface,system,sensor,firewall,hard drive,pixel,alarm,feed,monitor,application,transmitter,bus,circuit,capacitor,matrix]
20
+ verb: [back up,bypass,hack,override,compress,copy,navigate,index,connect,generate,quantify,calculate,synthesize,input,transmit,program,reboot,parse]
21
+ ingverb: [backing up,bypassing,hacking,overriding,compressing,copying, navigating,indexing,connecting,generating,quantifying,calculating, synthesizing,transmitting,programming,parsing]
@@ -0,0 +1,170 @@
1
+ # encoding: UTF-8
2
+ #
3
+ # Author: Stefano Harding <riddopic@gmail.com>
4
+ # License: Apache License, Version 2.0
5
+ # Copyright: (C) 2014-2015 Stefano Harding
6
+ #
7
+ # Licensed under the Apache License, Version 2.0 (the "License");
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+ #
19
+
20
+ module Garcon
21
+ # Class methods that are added when you include Garcon
22
+ #
23
+ module FileHelper
24
+ # Methods are also available as module-level methods as well as a mixin.
25
+ extend self
26
+
27
+ # Checks in PATH returns true if the command is found.
28
+ #
29
+ # @param [String] command
30
+ # The name of the command to look for.
31
+ #
32
+ # @return [Boolean]
33
+ # True if the command is found in the path.
34
+ #
35
+ def command_in_path?(command)
36
+ found = ENV['PATH'].split(File::PATH_SEPARATOR).map do |p|
37
+ File.exist?(File.join(p, command))
38
+ end
39
+ found.include?(true)
40
+ end
41
+
42
+ # Looks for the first occurrence of program within path.
43
+ #
44
+ # @param [String] cmd
45
+ # The name of the command to find.
46
+ #
47
+ # @param [String] path
48
+ # The path to search for the command.
49
+ #
50
+ # @return [String, NilClass]
51
+ #
52
+ # @api public
53
+ def which(prog, path = ENV['PATH'])
54
+ path.split(File::PATH_SEPARATOR).each do |dir|
55
+ file = File.join(dir, prog)
56
+ return file if File.executable?(file) && !File.directory?(file)
57
+ end
58
+
59
+ nil
60
+ end
61
+
62
+ # In block form, yields each program within path. In non-block form,
63
+ # returns an array of each program within path. Returns nil if not found
64
+ # found.
65
+ #
66
+ # @example
67
+ # whereis('ruby')
68
+ # # => [
69
+ # [0] "/opt/chefdk/embedded/bin/ruby",
70
+ # [1] "/usr/bin/ruby",
71
+ # [2] "/Users/sharding/.rvm/rubies/ruby-2.2.0/bin/ruby",
72
+ # [3] "/usr/bin/ruby"
73
+ # ]
74
+ #
75
+ # @param [String] cmd
76
+ # The name of the command to find.
77
+ #
78
+ # @param [String] path
79
+ # The path to search for the command.
80
+ #
81
+ # @return [String, Array, NilClass]
82
+ #
83
+ # @api public
84
+ def whereis(prog, path = ENV['PATH'])
85
+ dirs = []
86
+ path.split(File::PATH_SEPARATOR).each do |dir|
87
+ f = File.join(dir,prog)
88
+ if File.executable?(f) && !File.directory?(f)
89
+ if block_given?
90
+ yield f
91
+ else
92
+ dirs << f
93
+ end
94
+ end
95
+ end
96
+
97
+ dirs.empty? ? nil : dirs
98
+ end
99
+
100
+ # Get a recusive list of files inside a path.
101
+ #
102
+ # @param [String] path
103
+ # some path string or Pathname
104
+ # @param [Block] ignore
105
+ # a proc/block that returns true if a given path should be ignored, if a
106
+ # path is ignored, nothing below it will be searched either.
107
+ #
108
+ # @return [Array<Pathname>]
109
+ # array of Pathnames for each file (no directories)
110
+ #
111
+ def all_files_under(path, &ignore)
112
+ path = Pathname(path)
113
+
114
+ if path.directory?
115
+ path.children.flat_map do |child|
116
+ all_files_under(child, &ignore)
117
+ end.compact
118
+ elsif path.file?
119
+ if block_given? && ignore.call(path)
120
+ []
121
+ else
122
+ [path]
123
+ end
124
+ else
125
+ []
126
+ end
127
+ end
128
+
129
+ # Takes an object, which can be a literal string or a string containing
130
+ # glob expressions, or a regexp, or a proc, or anything else that responds
131
+ # to #match or #call, and returns whether or not the given path matches
132
+ # that matcher.
133
+ #
134
+ # @param [String, #match, #call] matcher
135
+ # a matcher String, RegExp, Proc, etc.
136
+ #
137
+ # @param [String] path
138
+ # a path as a string
139
+ #
140
+ # @return [Boolean]
141
+ # whether the path matches the matcher
142
+ #
143
+ def path_match(matcher, path)
144
+ case
145
+ when matcher.is_a?(String)
146
+ if matcher.include? '*'
147
+ File.fnmatch(matcher, path)
148
+ else
149
+ path == matcher
150
+ end
151
+ when matcher.respond_to?(:match)
152
+ !matcher.match(path).nil?
153
+ when matcher.respond_to?(:call)
154
+ matcher.call(path)
155
+ else
156
+ File.fnmatch(matcher.to_s, path)
157
+ end
158
+ end
159
+
160
+ # Normalize a path to not include a leading slash
161
+ #
162
+ # @param [String] path
163
+ #
164
+ # @return [String]
165
+ #
166
+ def normalize_path(path)
167
+ path.sub(%r{^/}, '').tr('', '')
168
+ end
169
+ end
170
+ end
@@ -0,0 +1,178 @@
1
+ # encoding: UTF-8
2
+ #
3
+ # Author: Stefano Harding <riddopic@gmail.com>
4
+ # License: Apache License, Version 2.0
5
+ # Copyright: (C) 2014-2015 Stefano Harding
6
+ #
7
+ # Licensed under the Apache License, Version 2.0 (the "License");
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+ #
19
+
20
+ require_relative 'uber/options'
21
+ require_relative 'uber/inheritable_attr'
22
+
23
+ # No not that kind! callback hooks.
24
+ #
25
+ module Garcon
26
+ module Hookers
27
+ module ClassMethods
28
+ def define_hookers(*names)
29
+ options = extract_options!(names)
30
+ names.each { |name| setup_hooker(name, options) }
31
+ end
32
+ alias_method :define_hooker, :define_hookers
33
+
34
+ def run_hooker(name, *args)
35
+ run_hooker_for(name, self, *args)
36
+ end
37
+
38
+ def run_hooker_for(name, scope, *args)
39
+ _hookers[name].run(scope, *args)
40
+ end
41
+
42
+ def callbacks_for_hooker(name)
43
+ _hookers[name]
44
+ end
45
+
46
+ private # P R O P R I E T À P R I V A T A Vietato L'accesso
47
+
48
+ def setup_hooker(name, options)
49
+ _hookers[name] = Hooker.new(options)
50
+ define_hooker_writer(name)
51
+ end
52
+
53
+ def define_hooker_writer(name)
54
+ instance_eval(*hooker_writer_args(name))
55
+ end
56
+
57
+ def hooker_writer_args(name)
58
+ str = <<-RUBY_EVAL
59
+ def #{name}(method=nil, &block)
60
+ _hookers[:#{name}] << (block || method)
61
+ end
62
+ RUBY_EVAL
63
+
64
+ [str, __FILE__, __LINE__ + 1]
65
+ end
66
+
67
+ def extract_options!(args)
68
+ args.last.is_a?(Hash) ? args.pop : {}
69
+ end
70
+
71
+ def included(descendant)
72
+ descendant.class_eval do
73
+ extend Uber::InheritableAttr
74
+ extend ClassMethods
75
+ inheritable_attr :_hookers
76
+ self._hookers = BunchOfHookers.new
77
+ end
78
+ end
79
+ end
80
+
81
+ extend ClassMethods
82
+
83
+ def run_hooker(name, *args)
84
+ self.class.run_hooker_for(name, self, *args)
85
+ end
86
+
87
+ class BunchOfHookers < Hash
88
+ def [](name)
89
+ super(name.to_sym)
90
+ end
91
+
92
+ def []=(name, values)
93
+ super(name.to_sym, values)
94
+ end
95
+
96
+ def clone
97
+ super.tap do |cloned|
98
+ each { |name, callbacks| cloned[name] = callbacks.clone }
99
+ end
100
+ end
101
+ end
102
+
103
+ class Hooker < Array
104
+ def initialize(options)
105
+ super()
106
+ @options = options
107
+ end
108
+
109
+ def run(scope, *args)
110
+ inject(Results.new) do |results, callback|
111
+ executed = execute_callback(scope, callback, *args)
112
+
113
+ return results.halted! unless continue_execution?(executed)
114
+ results << executed
115
+ end
116
+ end
117
+
118
+ def <<(callback)
119
+ super Uber::Options::Value.new(callback, dynamic: true)
120
+ end
121
+
122
+ private # P R O P R I E T À P R I V A T A Vietato L'accesso
123
+
124
+ def execute_callback(scope, callback, *args)
125
+ callback.evaluate(scope, *args)
126
+ end
127
+
128
+ def continue_execution?(result)
129
+ @options[:halts_on_falsey] ? result : true
130
+ end
131
+
132
+ class Results < Array
133
+ def initialize(*)
134
+ super
135
+ @halted = false
136
+ end
137
+
138
+ def halted!
139
+ @halted = true
140
+ self
141
+ end
142
+
143
+ def halted?
144
+ @halted
145
+ end
146
+
147
+ def not_halted?
148
+ not @halted
149
+ end
150
+ end
151
+ end
152
+
153
+ module InstanceHookers
154
+ include ClassMethods
155
+
156
+ def run_hooker(name, *args)
157
+ run_hooker_for(name, self, *args)
158
+ end
159
+
160
+ private # P R O P R I E T À P R I V A T A Vietato L'accesso
161
+
162
+ def _hookers
163
+ @_hookers ||= self.class._hookers.clone
164
+ end
165
+
166
+ module ClassMethods
167
+ def define_hooker_writer(name)
168
+ super
169
+ class_eval(*hooker_writer_args(name))
170
+ end
171
+ end
172
+
173
+ def self.included(descendant)
174
+ descendant.extend(ClassMethods)
175
+ end
176
+ end
177
+ end
178
+ end
@@ -0,0 +1,90 @@
1
+ # encoding: UTF-8
2
+ #
3
+ # Author: Stefano Harding <riddopic@gmail.com>
4
+ # License: Apache License, Version 2.0
5
+ # Copyright: (C) 2014-2015 Stefano Harding
6
+ #
7
+ # Licensed under the Apache License, Version 2.0 (the "License");
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+ #
19
+
20
+ module Garcon
21
+ module Interpolation
22
+ # Methods are also available as module-level methods as well as a mixin.
23
+ extend self
24
+
25
+ # Interpolate provides a means of externally using Ruby string
26
+ # interpolation mechinism.
27
+ #
28
+ # @example
29
+ # node[:ldap][:basedir] = '/opt'
30
+ # node[:ldap][:homedir] = '%{basedir}/openldap/slap/happy'
31
+ #
32
+ # interpolate(node[:ldap])[:homedir] # => "/opt/openldap/slap/happy"
33
+ #
34
+ # @param [String] item
35
+ # The string to interpolate.
36
+ #
37
+ # @param [String, Hash] parent
38
+ # The string used for substitution.
39
+ #
40
+ # @return [String]
41
+ # The interpolated string.
42
+ #
43
+ # @api public
44
+ def interpolate(item = self, parent = nil)
45
+ item = render item, parent
46
+ item.is_a?(Hash) ? ::Mash.new(item) : item
47
+ end
48
+
49
+ private # P R O P R I E T À P R I V A T A Vietato L'accesso
50
+
51
+ # Return a symbol if key is a symbol using duck quacking.
52
+ #
53
+ # @param [Object] key
54
+ # The object to duck quack for a :to_sym method.
55
+ #
56
+ # @return [Boolean]
57
+ # True if object reponds to :to_sym quack duck, else false.
58
+ #
59
+ # @api private
60
+ def sym(key)
61
+ key.respond_to?(:to_sym) ? key.to_sym : key
62
+ end
63
+
64
+ # Provides recursive interpolation of node objects, using standard
65
+ # string interpolation methods.
66
+ #
67
+ # @param [String] item
68
+ # The string to interpolate.
69
+ #
70
+ # @param [String, Hash] parent
71
+ # The string used for substitution.
72
+ #
73
+ # @return [String]
74
+ #
75
+ # @api private
76
+ def render(item, parent = nil)
77
+ item = item.to_hash if item.respond_to?(:to_hash)
78
+ if item.is_a?(Hash)
79
+ item = item.inject({}) { |memo, (k,v)| memo[sym(k)] = v; memo }
80
+ item.inject({}) {|memo, (k,v)| memo[sym(k)] = render(v, item); memo}
81
+ elsif item.is_a?(Array)
82
+ item.map { |i| render(i, parent) }
83
+ elsif item.is_a?(String)
84
+ item % parent rescue item
85
+ else
86
+ item
87
+ end
88
+ end
89
+ end
90
+ end