hoodie 0.5.5 → 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (41) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/Gemfile +19 -0
  4. data/Rakefile +8 -23
  5. data/hoodie.gemspec +0 -23
  6. data/lib/hoodie.rb +40 -48
  7. data/lib/hoodie/configuration.rb +39 -2
  8. data/lib/hoodie/core_ext/blank.rb +6 -6
  9. data/lib/hoodie/core_ext/hash.rb +108 -13
  10. data/lib/hoodie/core_ext/string.rb +5 -3
  11. data/lib/hoodie/core_ext/try.rb +4 -3
  12. data/lib/hoodie/inflections.rb +18 -0
  13. data/lib/hoodie/inflections/defaults.rb +17 -0
  14. data/lib/hoodie/inflections/inflections.rb +17 -0
  15. data/lib/hoodie/inflections/rules_collection.rb +17 -0
  16. data/lib/hoodie/logging.rb +22 -4
  17. data/lib/hoodie/stash.rb +83 -80
  18. data/lib/hoodie/stash/disk_store.rb +142 -118
  19. data/lib/hoodie/stash/mem_store.rb +10 -9
  20. data/lib/hoodie/stash/memoizable.rb +46 -0
  21. data/lib/hoodie/utils.rb +13 -183
  22. data/lib/hoodie/utils/ansi.rb +199 -0
  23. data/lib/hoodie/utils/crypto.rb +288 -0
  24. data/lib/hoodie/utils/equalizer.rb +146 -0
  25. data/lib/hoodie/utils/file_helper.rb +225 -0
  26. data/lib/hoodie/utils/konstruktor.rb +77 -0
  27. data/lib/hoodie/utils/machine.rb +83 -0
  28. data/lib/hoodie/utils/os.rb +56 -0
  29. data/lib/hoodie/utils/retry.rb +235 -0
  30. data/lib/hoodie/utils/timeout.rb +54 -0
  31. data/lib/hoodie/utils/url_helper.rb +104 -0
  32. data/lib/hoodie/version.rb +4 -4
  33. metadata +13 -234
  34. data/lib/hoodie/identity_map.rb +0 -96
  35. data/lib/hoodie/memoizable.rb +0 -43
  36. data/lib/hoodie/obfuscate.rb +0 -121
  37. data/lib/hoodie/observable.rb +0 -309
  38. data/lib/hoodie/os.rb +0 -43
  39. data/lib/hoodie/proxy.rb +0 -68
  40. data/lib/hoodie/rash.rb +0 -125
  41. data/lib/hoodie/timers.rb +0 -355
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ff2458695208711c724a6671388e22ecd83099e8
4
- data.tar.gz: 74ed7e3f9bb3872257bb65e3b5eaac1328feb91d
3
+ metadata.gz: cb724e1cb6507df195da226f792105ad37fc4431
4
+ data.tar.gz: ae69f0b9bad59fbe1b82c891a51d2bd2dcf304c9
5
5
  SHA512:
6
- metadata.gz: cd2fdfb5db788a96acd63ce7d060d44b7be78d78237d3cce3f25d80f2a0a9e4d7e01781264f386ee42ddae8ea59a9527e519141998f3fe63bfb6b419039e5d29
7
- data.tar.gz: 1b4f584e16a8a4aa27cfa10cc17f88cf3b20d2a8352e6e175e66e1a584f5c819719f8290b63c76f4378cc42db316f1a51c731d8a4a9b4e1654e59bf030a51564
6
+ metadata.gz: 68e2bfa7b4603de807849eb6ac65f95a256c2b4aad183d5f6390afe99422d306196e47da34914524bdb50c95c646b06ac55ad367277efcbd6efd5bff92370424
7
+ data.tar.gz: 2349207c4c7ddcf327dc8bafa1e666580b437b3df00b9bf62f71cb79242bf1dac9d731ad833f81cd57bc70ff2e7a028f4b62add255e99577d21a5d305e4360f8
data/.gitignore CHANGED
@@ -191,3 +191,4 @@ cscope.po.out
191
191
  vendor/bundle
192
192
  vendor/cache
193
193
  Gemfile.lock
194
+ repl.rb
data/Gemfile CHANGED
@@ -1,3 +1,22 @@
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
+
1
20
  source 'https://rubygems.org'
2
21
 
3
22
  gemspec
data/Rakefile CHANGED
@@ -19,28 +19,13 @@
19
19
 
20
20
  require 'bundler/gem_tasks'
21
21
 
22
- task default: 'test'
23
-
24
- desc 'Run all tests except `kitchen`'
25
- task test: [:yard, :rubocop, :spec]
26
-
27
- desc 'Run all tasks'
28
- task all: [:yard, :rubocop, :spec]
29
-
30
- desc 'Build documentation'
31
- task doc: [:yard]
32
-
33
- require 'yard'
34
- YARD::Config.load_plugin 'redcarpet-ext'
35
- YARD::Rake::YardocTask.new do |t|
36
- t.files = ['**/*.rb', '-', 'README.md', 'CHANGELOG.md', 'LICENSE']
37
- t.options = ['--markup-provider=redcarpet', '--markup=markdown']
22
+ desc 'Generate Ruby documentation'
23
+ task :yard do
24
+ require 'yard'
25
+ YARD::Rake::YardocTask.new do |t|
26
+ t.files = ['**/*.rb', '-', 'README.md', 'LICENSE']
27
+ t.stats_options = %w(--list-undoc)
28
+ end
38
29
  end
39
30
 
40
- require 'rubocop/rake_task'
41
- RuboCop::RakeTask.new
42
-
43
- require 'rspec/core/rake_task'
44
- RSpec::Core::RakeTask.new(:chefspec) do |t|
45
- t.rspec_opts = '--color --format progress'
46
- end
31
+ task doc: %w(yard)
@@ -37,33 +37,10 @@ Gem::Specification.new do |gem|
37
37
  gem.test_files = `git ls-files -- {spec}/*`.split("\n")
38
38
  gem.extra_rdoc_files = %w[LICENSE README.md]
39
39
 
40
- gem.add_runtime_dependency 'anemone', '>= 0.7.2'
41
- gem.add_runtime_dependency 'hitimes'
42
-
43
40
  # Development gems
44
41
  gem.add_development_dependency 'rake', '~> 10.4'
45
42
  gem.add_development_dependency 'yard', '~> 0.8'
46
43
  gem.add_development_dependency 'pry'
47
-
48
- # Test gems
49
- gem.add_development_dependency 'rspec', '~> 3.2'
50
- gem.add_development_dependency 'fuubar', '~> 2.0'
51
- gem.add_development_dependency 'simplecov', '~> 0.9'
52
44
  gem.add_development_dependency 'inch'
53
45
  gem.add_development_dependency 'yardstick'
54
- gem.add_development_dependency 'guard'
55
- gem.add_development_dependency 'guard-shell'
56
- gem.add_development_dependency 'guard-yard'
57
- gem.add_development_dependency 'guard-rubocop'
58
- gem.add_development_dependency 'guard-rspec'
59
- gem.add_development_dependency 'ruby_gntp'
60
-
61
- # Integration gems
62
- gem.add_development_dependency 'rubocop'
63
- gem.add_development_dependency 'geminabox-rake'
64
-
65
- # Versioning
66
- gem.add_development_dependency 'version'
67
- gem.add_development_dependency 'thor-scmversion'
68
- gem.add_development_dependency 'semverse'
69
46
  end
@@ -1,8 +1,8 @@
1
1
  # encoding: UTF-8
2
2
  #
3
- # Author: Stefano Harding <riddopic@gmail.com>
4
- #
5
- # Copyright (C) 2014-2015 Stefano Harding
3
+ # Author: Stefano Harding <riddopic@gmail.com>
4
+ # License: Apache License, Version 2.0
5
+ # Copyright: (C) 2014-2015 Stefano Harding
6
6
  #
7
7
  # Licensed under the Apache License, Version 2.0 (the "License");
8
8
  # you may not use this file except in compliance with the License.
@@ -17,7 +17,11 @@
17
17
  # limitations under the License.
18
18
  #
19
19
 
20
+ require 'hoodie/core_ext/string'
21
+ require 'hoodie/core_ext/blank'
20
22
  require 'hoodie/configuration'
23
+ require 'hoodie/core_ext/hash'
24
+ require 'hoodie/core_ext/try'
21
25
 
22
26
  module Hoodie
23
27
 
@@ -31,59 +35,47 @@ module Hoodie
31
35
  # Raised when an operation times out.
32
36
  TimeoutError = Class.new(StandardError)
33
37
 
34
- class << self
35
- # @param [TrueClass, FalseClass] sets the global logging configuration.
36
- # @return [Hoodie]
37
- # @api public
38
- def logging=(value)
39
- configuration.logging = value
40
- self
41
- end
38
+ # @param [Boolean] value
39
+ # Sets the global logging configuration.
40
+ #
41
+ # @return [Hoodie]
42
+ #
43
+ def self.logging=(value)
44
+ configuration.logging = value
45
+ self
46
+ end
42
47
 
43
- # @return [TrueClass, FalseClass] the global logging setting.
44
- # @api public
45
- def logging
46
- configuration.logging
47
- end
48
+ # @return [Boolean]
49
+ # The global logging setting.
50
+ #
51
+ def self.logging
52
+ configuration.logging
53
+ end
48
54
 
49
- # Provides access to the global configuration.
50
- #
51
- # @example
52
- # Hoodie.config do |config|
53
- # config.logging = true
54
- # end
55
- #
56
- # @return [Configuration]
57
- #
58
- # @api public
59
- def config(&block)
60
- yield configuration if block_given?
61
- configuration
62
- end
55
+ # Provides access to the global configuration.
56
+ #
57
+ # @example
58
+ # Hoodie.config do |config|
59
+ # config.logging = true
60
+ # end
61
+ #
62
+ # @return [Configuration]
63
+ #
64
+ def self.config(&block)
65
+ yield configuration if block_given?
66
+ configuration
67
+ end
63
68
 
64
- # @return [Configuration] global configuration instance.
65
- # @api private
66
- def configuration
67
- @configuration ||= Configuration.new
68
- end
69
+ # @return [Configuration]
70
+ # The global configuration instance.
71
+ #
72
+ def self.configuration
73
+ @configuration ||= Configuration.new
69
74
  end
70
75
  end
71
76
 
72
- require 'hoodie/core_ext/string'
73
- require 'hoodie/core_ext/blank'
74
- require 'hoodie/core_ext/hash'
75
- require 'hoodie/core_ext/try'
76
-
77
- require 'hoodie/stash/mem_store'
78
- require 'hoodie/stash/disk_store'
79
- require 'hoodie/identity_map'
80
77
  require 'hoodie/inflections'
81
- require 'hoodie/memoizable'
82
- require 'hoodie/obfuscate'
83
78
  require 'hoodie/logging'
84
79
  require 'hoodie/version'
85
- require 'hoodie/timers'
86
80
  require 'hoodie/utils'
87
- require 'hoodie/proxy'
88
81
  require 'hoodie/stash'
89
- require 'hoodie/os'
@@ -1,14 +1,33 @@
1
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
+ #
2
19
 
3
20
  module Hoodie
4
21
 
5
22
  # A Configuration instance
6
23
  class Configuration
7
24
 
8
- # Access the logging setting for this instance
25
+ # @!attribute [rw] logging
26
+ # @return [Boolean] Enable or disable logging.
9
27
  attr_accessor :logging
10
28
 
11
- # Access to the logging level for this instance
29
+ # @!attribute [rw] level
30
+ # @return [Symbol] Set the desired loging level.
12
31
  attr_accessor :level
13
32
 
14
33
  # Initialized a configuration instance
@@ -19,10 +38,28 @@ module Hoodie
19
38
  def initialize(options={})
20
39
  @logging = options.fetch(:logging, false)
21
40
  @level = options.fetch(:level, :info)
41
+ @crypto = Crypto::Configuration.new
22
42
 
23
43
  yield self if block_given?
24
44
  end
25
45
 
46
+ # Access the crypto for this instance and optional configure a
47
+ # new crypto with the passed block.
48
+ #
49
+ # @example
50
+ # Garcon.config do |c|
51
+ # c.crypto.password = "!mWh0!s@y!m"
52
+ # c.crypto.salt = "9e5f851900cad8892ac8b737b7370cbe"
53
+ # end
54
+ #
55
+ # @return [Crypto]
56
+ #
57
+ # @api private
58
+ def crypto(&block)
59
+ @crypto = Crypto::Configuration.new(&block) if block_given?
60
+ @crypto
61
+ end
62
+
26
63
  # @api private
27
64
  def to_h
28
65
  { logging: logging,
@@ -1,8 +1,8 @@
1
1
  # encoding: UTF-8
2
2
  #
3
- # Author: Stefano Harding <riddopic@gmail.com>
4
- #
5
- # Copyright (C) 2014-2015 Stefano Harding
3
+ # Author: Stefano Harding <riddopic@gmail.com>
4
+ # License: Apache License, Version 2.0
5
+ # Copyright: (C) 2014-2015 Stefano Harding
6
6
  #
7
7
  # Licensed under the Apache License, Version 2.0 (the "License");
8
8
  # you may not use this file except in compliance with the License.
@@ -25,7 +25,7 @@ class Object
25
25
  # [1].blank? #=> false
26
26
  # [nil].blank? #=> false
27
27
  #
28
- # @return [TrueClass, FalseClass]
28
+ # @return [Boolean]
29
29
  #
30
30
  def blank?
31
31
  nil? || (respond_to?(:empty?) && empty?)
@@ -37,7 +37,7 @@ class Object
37
37
  # [1].present? #=> true
38
38
  # [nil].present? #=> true
39
39
  #
40
- # @return [TrueClass, FalseClass]
40
+ # @return [Boolean]
41
41
  #
42
42
  def present?
43
43
  !blank?
@@ -100,7 +100,7 @@ class String
100
100
  # " ".blank? #=> true
101
101
  # " hey ho ".blank? #=> false
102
102
  #
103
- # @return [TrueClass, FalseClass]
103
+ # @return [Boolean]
104
104
  #
105
105
  def blank?
106
106
  strip.empty?
@@ -1,8 +1,8 @@
1
1
  # encoding: UTF-8
2
2
  #
3
- # Author: Stefano Harding <riddopic@gmail.com>
4
- #
5
- # Copyright (C) 2014-2015 Stefano Harding
3
+ # Author: Stefano Harding <riddopic@gmail.com>
4
+ # License: Apache License, Version 2.0
5
+ # Copyright: (C) 2014-2015 Stefano Harding
6
6
  #
7
7
  # Licensed under the Apache License, Version 2.0 (the "License");
8
8
  # you may not use this file except in compliance with the License.
@@ -17,17 +17,69 @@
17
17
  # limitations under the License.
18
18
  #
19
19
 
20
+
20
21
  class Hash
22
+
23
+ # Turn a hash into a method arguments.
24
+ #
25
+ # h = { :list => [1,2], :base => "HI" }
26
+ #
27
+ # Without an argument field.
28
+ #
29
+ # h.argumentize #=> [ { :list => [1,2], :base => "HI" } ]
30
+ #
31
+ # With an argument field.
32
+ #
33
+ # h.argumentize(:list) #=> [ 1, 2, { :base => "HI" } ]
34
+ # h.argumentize(:base) #=> [ "HI", { :list => [1,2] } ]
35
+ #
36
+ def argumentize(args_field = nil)
37
+ config = dup
38
+ if args_field
39
+ args = [config.delete(args_field)].flatten.compact
40
+ else
41
+ args = []
42
+ end
43
+ args << config
44
+ return args
45
+ end
46
+
47
+ # A method to convert a Hash into a Struct.
48
+ #
49
+ # h = { :name => "Earl", "age" => 20, "sex" => "lots", "worries" => "none" }
50
+ # s = h.to_struct("Foo")
51
+ #
52
+ def to_struct(struct_name)
53
+ Struct.new(struct_name,*keys).new(*values)
54
+ end
55
+
56
+ # Get or set state of object. You can think of #object_state as an in-code
57
+ # form of marshalling.
58
+ #
59
+ def object_state(data=nil)
60
+ data ? replace(data) : dup
61
+ end
62
+
63
+ # A hash is blank if it's empty:
64
+ #
65
+ # @example
66
+ # {}.blank? # => true
67
+ # { key: 'value' }.blank? # => false
68
+ #
69
+ # @api public
70
+ alias_method :blank?, :empty?
71
+
21
72
  # Returns a compacted copy (contains no key/value pairs having
22
73
  # nil? values)
23
74
  #
24
75
  # @example
25
- # hash = { a: 100, b: nil, c: false, d: '' }
26
- # hash.compact # => { a: 100, c: false, d: '' }
27
- # hash # => { a: 100, b: nil, c: false, d: '' }
76
+ # hash = { a: 100, b: nil, c: false, d: '' }
77
+ # hash.compact # => { a: 100, c: false, d: '' }
78
+ # hash # => { a: 100, b: nil, c: false, d: '' }
28
79
  #
29
80
  # @return [Hash]
30
81
  #
82
+ # @api public
31
83
  def compact
32
84
  select { |_, value| !value.nil? }
33
85
  end
@@ -35,13 +87,13 @@ class Hash
35
87
  # Returns a new hash with all keys converted using the block operation.
36
88
  #
37
89
  # @example
38
- # hash = { name: 'Tiggy', age: '15' }
39
- #
40
- # hash.transform_keys{ |key| key.to_s.upcase }
41
- # # => { "AGE" => "15", "NAME" => "Tiggy" }
90
+ # hash = { name: 'Tiggy', age: '15' }
91
+ # hash.transform_keys{ |key| key.to_s.upcase }
92
+ # # => { "AGE" => "15", "NAME" => "Tiggy" }
42
93
  #
43
94
  # @return [Hash]
44
95
  #
96
+ # @api public
45
97
  def transform_keys
46
98
  enum_for(:transform_keys) unless block_given?
47
99
  result = self.class.new
@@ -128,6 +180,48 @@ class Hash
128
180
  recursively_transform_keys { |key| key.to_s.capitalize rescue key }
129
181
  end
130
182
 
183
+ # Creates a new hash from two separate arrays, a +keys+ array and
184
+ # a +values+ array.
185
+ #
186
+ # @example
187
+ # Hash.zip(['a','b','c'], [1,2,3])
188
+ # # => { "a"=>1, "b"=>2, "c"=>3 }
189
+ #
190
+ def zip(col1, col2)
191
+ col1.zip(col2).inject({}) { |r, i| r[i[0]] = i[1]; r }
192
+ end
193
+
194
+ # Create a hash with *only* key/value pairs in receiver and +allowed+
195
+ #
196
+ # { :one => 1, :two => 2, :three => 3 }.only(:one) # => { :one => 1 }
197
+ #
198
+ # @param [Array[String, Symbol]] *allowed The hash keys to include.
199
+ #
200
+ # @return [Hash] A new hash with only the selected keys.
201
+ #
202
+ # @api public
203
+ def only(*allowed)
204
+ hash = {}
205
+ allowed.each {|k| hash[k] = self[k] if self.has_key?(k) }
206
+ hash
207
+ end
208
+
209
+ # Create a hash with all key/value pairs in receiver *except* +rejected+
210
+ #
211
+ # { :one => 1, :two => 2, :three => 3 }.except(:one)
212
+ # # => { :two => 2, :three => 3 }
213
+ #
214
+ # @param [Array[String, Symbol]] *rejected The hash keys to exclude.
215
+ #
216
+ # @return [Hash] A new hash without the selected keys.
217
+ #
218
+ # @api public
219
+ def except(*rejected)
220
+ hash = self.dup
221
+ rejected.each {|k| hash.delete(k) }
222
+ hash
223
+ end
224
+
131
225
  class UndefinedPathError < StandardError; end
132
226
  # Recursively searchs a nested datastructure for a key and returns
133
227
  # the value. If a block is provided its value will be returned if
@@ -149,7 +243,8 @@ class Hash
149
243
  obj.fetch(arg)
150
244
  rescue ArgumentError, IndexError, NoMethodError => e
151
245
  break block.call(arg) if block
152
- raise UndefinedPathError, "Could not fetch path (#{args.join(' > ')}) at #{arg}", e.backtrace
246
+ raise UndefinedPathError,
247
+ "Could not fetch path (#{args.join(' > ')}) at #{arg}", e.backtrace
153
248
  end
154
249
  end
155
250
  end
@@ -173,8 +268,8 @@ class Hash
173
268
  def _recursively_transform_keys_in_object(object, &block)
174
269
  case object
175
270
  when Hash
176
- object.each_with_object({}) do |(key, value), result|
177
- result[yield(key)] = _recursively_transform_keys_in_object(value, &block)
271
+ object.each_with_object({}) do |(key, val), result|
272
+ result[yield(key)] = _recursively_transform_keys_in_object(val, &block)
178
273
  end
179
274
  when Array
180
275
  object.map { |e| _recursively_transform_keys_in_object(e, &block) }