ruby-development-toolbox 1.0.3 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: eb8812228dbf4c77838554d27566cae8f832ab53
4
- data.tar.gz: f9e5833f6ab5c4e33585e880fb44be462fc3e7af
3
+ metadata.gz: 664d3ef4c0c0e9946f9d2d2ea0cdc16a20174beb
4
+ data.tar.gz: 04c4ae771e114310d5ec10c23111033ef91497d9
5
5
  SHA512:
6
- metadata.gz: 419279191eebfe1310d442fc74ebc7168db049b7c6e4bc09fd26cf29b4b206f30792df7afe94c30fa46d02b3836eb12d6c16443710352b805814d90f95f70cef
7
- data.tar.gz: ee1167210568156f1be94755a83dd21b3968280a7a3d8566a0547b40defd61a925e14f9c21e9df3984efdf53e931057208e8e665d599683a287e997210ca143b
6
+ metadata.gz: ce2305afc283e4d452f37af764a6db03fd2ac9db3b39401d329a79c0b5c33e15f2a4ab9d355b13ef72b72a78503e80c47cd7dfd6f3cba6d9bab2b60a636a5574
7
+ data.tar.gz: a0012109a92a998c685b046318cf66d15c514b96cfc7ec50031e845ae4e500c8d2a563a6d34333805f42836013dd5b97e279701e33acb1143f41866ab6691c4c
data/README.md CHANGED
@@ -40,7 +40,7 @@ The projects homepage can be found [here](https://github.com/gradeawarrior/ruby-
40
40
 
41
41
  # Development
42
42
 
43
- The project is built by [jeweler](https://github.com/technicalpickles/jeweler). See the project's page for more details about how to manage this gem. However, I will list out quick quidance on a typical release.
43
+ The project is built by [jeweler](https://github.com/technicalpickles/jeweler). See the project's page for more details about how to manage this gem. However, I will list out quick guidance on a typical release.
44
44
 
45
45
  ## Active Gem Development
46
46
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.0.3
1
+ 1.1.0
@@ -0,0 +1,153 @@
1
+ ##
2
+ # Extends the functionality of a Hash to be able to perform (i) diff and (ii) similarity operations
3
+ #
4
+ class Hash
5
+
6
+ ##
7
+ # Provides diff capabilities on a Hash. This implementation is slightly customized for
8
+ # Proofpoint Prism service-records, but otherwise should work on any Hash
9
+ #
10
+ def diff(other, svc_record_map = nil)
11
+ svc_record_map = {} unless svc_record_map.kind_of?(Hash)
12
+ (self.keys + other.keys).uniq.inject({}) do |memo, key|
13
+ rkeys = svc_record_map[key] || [key]
14
+ rkeys.each do |rkey|
15
+ diff_key = (rkeys.size > 1 || (key != rkey)) ? "#{key} --> #{rkey}" : rkey
16
+ if self[key].kind_of?(Hash) && other[rkey].kind_of?(Hash)
17
+ memo[diff_key] = self[key].diff(other[rkey])
18
+ elsif self[rkey] != other[rkey]
19
+ memo[diff_key] = [self[key], other[rkey]]
20
+ end
21
+ end
22
+ memo
23
+ end
24
+ end
25
+
26
+ ##
27
+ # Provides similarity capabilities on a Hash. This implementation is slightly optimized for
28
+ # Proofpoint Prism service-records, but otherwise should work on any Hash
29
+ #
30
+ # == Parameters
31
+ #
32
+ # other
33
+ #
34
+ def similarity(other, svc_record_map = nil)
35
+ svc_record_map = {} unless svc_record_map.kind_of?(Hash)
36
+ (self.keys + other.keys).uniq.inject({}) do |memo, key|
37
+ rkeys = svc_record_map.has_key?(key) ? svc_record_map[key] : [key]
38
+ rkeys.each do |rkey|
39
+ diff_key = (rkeys.size > 1 || (key != rkey)) ? "#{key} --> #{rkey}" : rkey
40
+ if self[key].kind_of?(Hash) && other[rkey].kind_of?(Hash)
41
+ memo[diff_key] = self[key].similarity(other[rkey])
42
+ elsif self[key] == other[rkey]
43
+ memo[diff_key] = self[key]
44
+ end
45
+ end
46
+ memo
47
+ end
48
+ end
49
+
50
+ ##
51
+ # Utility for deleting any Prism service-record keys that I don't want to do a diff/similarity on
52
+ #
53
+ def clean
54
+ ['svc_id', 'name', 'environment_name', 'type', 'subtype', 'note'].each { |k| self.delete k }
55
+ self.keys.each do |svc_record_name|
56
+ self[svc_record_name].clean() if self[svc_record_name].kind_of?(Hash)
57
+ end
58
+ self.keys.each do |key|
59
+ if self[key].kind_of?(Hash) && self[key].empty?
60
+ self.delete(key)
61
+ elsif self[key].kind_of?(Hash)
62
+ self[key].clean
63
+ self.delete(key) if self[key].empty?
64
+ end
65
+ end
66
+ self
67
+ end
68
+
69
+ ##
70
+ # Utility for counting the number of leaf nodes in a Hash-Array structure. A leaf node is determined
71
+ # to be anything that is a non-Hash
72
+ #
73
+ def count_leafs
74
+ self.keys.inject(0) do |result, element|
75
+ if self[element].kind_of?(Hash)
76
+ result+=self[element].count_leafs
77
+ else
78
+ result+=1
79
+ end
80
+ end
81
+ end
82
+
83
+ ##
84
+ # Return only the List of Prism service-records; if the List is empty, then return the original Hash with no filters
85
+ # applied.
86
+ #
87
+ # == Parameters
88
+ #
89
+ # filter_keys : an array of keys to exclude
90
+ # filter_values : an array of values to exclude
91
+ #
92
+ def filter(filter_keys = nil, filter_values = nil)
93
+ filter_keys = Array.new unless filter_keys.kind_of?(Array)
94
+ filter_values = Array.new unless filter_values.kind_of?(Array)
95
+ result = filter_keys.empty? ? self : Hash.new
96
+ filter_keys.each do |key|
97
+ self.keys.each do |svc_record|
98
+ if svc_record.match(/^#{key}$/)
99
+ result[svc_record] = self[svc_record]
100
+ elsif svc_record.match(/^#{key} -->/)
101
+ result[svc_record] = self[svc_record]
102
+ end
103
+ end
104
+ end
105
+ filter_values.each do |filter_value|
106
+ result.keys.each do |key|
107
+ if result[key].kind_of?(Hash)
108
+ result[key] = result[key].filter(nil, filter_values)
109
+ result.delete(key) if result[key].keys.empty?
110
+ elsif result[key].kind_of?(Array) && key.match(/version/).nil?
111
+ filter_triggered = false
112
+ result[key].each do |diff_value|
113
+ filter_triggered = diff_value =~ /#{filter_value}/
114
+ break if filter_triggered
115
+ end
116
+ result.delete(key) if filter_triggered
117
+ end
118
+ end
119
+ end
120
+ result
121
+ end
122
+ end
123
+
124
+ ##
125
+ # Extends the functionality of a Hash to be able to perform (i) diff and (ii) similarity operations
126
+ # For implementation details, see the Hash class for the extended functions
127
+ #
128
+ # == Usage
129
+ #
130
+ # Working with HashDiff module can be very simple, for example:
131
+ #
132
+ # require 'toolbox/hash_diff'
133
+ # require 'yaml'
134
+ #
135
+ # hash1 = {
136
+ # :foo => 'bar',
137
+ # :bar => 'hello',
138
+ # :hello => 'world',
139
+ # :this => { :exists => 'yay!' }
140
+ # }
141
+ #
142
+ # hash2 = {
143
+ # :foo => 'bar',
144
+ # :hello => 'Hi',
145
+ # :this => { :exists => 'yay!' },
146
+ # :hey => { :this => "Doesn't exist", :but => "oh well" }
147
+ # }
148
+ #
149
+ # puts hash1.diff(hash2).to_yaml
150
+ # puts hash1.similarity(hash2).to_yaml
151
+ #
152
+ module HashDiff
153
+ end
@@ -0,0 +1,38 @@
1
+ ##
2
+ # A generic UUID class
3
+ #
4
+ # == Usage
5
+ #
6
+ # $ irb
7
+ # require 'toolbox/uuid'
8
+ # => true
9
+ # UUID.generate
10
+ # => "0a391631-22ba-40ea-af2e-65a64de4a42b"
11
+ # UUID.generate
12
+ # => "092516ba-a2f4-45cf-9e1d-c5e63342aaa4"
13
+ #
14
+ class UUID
15
+
16
+ ##
17
+ # Generate a random UUID.
18
+ #
19
+ # Attempts a few different ways, hopefully one of them work. If all fails, die.
20
+ #
21
+ def self.generate
22
+ begin
23
+ require 'securerandom'
24
+ return SecureRandom.uuid()
25
+
26
+ rescue Exception => e
27
+ if (File.exist?("/usr/bin/uuidgen")) # Centos e2fsprogs package
28
+ uuid = `/usr/bin/uuidgen`
29
+ return uuid.chomp
30
+ elsif (File.exist?("/usr/bin/uuid")) # Debian uuid package
31
+ uuid = `/usr/bin/uuid`
32
+ return uuid.chomp
33
+ end
34
+ end
35
+ abort("Unable to generate UUIDs")
36
+ end
37
+
38
+ end
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "ruby-development-toolbox"
8
- s.version = "1.0.3"
8
+ s.version = "1.1.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Peter Salas"]
12
- s.date = "2014-02-20"
12
+ s.date = "2014-02-21"
13
13
  s.description = "A collection of useful utilities and libraries for Ruby development (not Rails)"
14
14
  s.email = "psalas+github@gmail.com"
15
15
  s.extra_rdoc_files = [
@@ -28,6 +28,8 @@ Gem::Specification.new do |s|
28
28
  "VERSION",
29
29
  "lib/ruby-development-toolbox.rb",
30
30
  "lib/toolbox/boolean.rb",
31
+ "lib/toolbox/hash_diff.rb",
32
+ "lib/toolbox/uuid.rb",
31
33
  "ruby-development-toolbox.gemspec",
32
34
  "test/helper.rb",
33
35
  "test/test_ruby-development-toolbox.rb"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby-development-toolbox
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.3
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter Salas
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-02-20 00:00:00.000000000 Z
11
+ date: 2014-02-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: shoulda
@@ -114,6 +114,8 @@ files:
114
114
  - VERSION
115
115
  - lib/ruby-development-toolbox.rb
116
116
  - lib/toolbox/boolean.rb
117
+ - lib/toolbox/hash_diff.rb
118
+ - lib/toolbox/uuid.rb
117
119
  - ruby-development-toolbox.gemspec
118
120
  - test/helper.rb
119
121
  - test/test_ruby-development-toolbox.rb