d2e 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +125 -17
- data/lib/d2e.rb +35 -15
- data/lib/d2e/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: db5e19dcaada1ee97b3d8b8b946da212d55f4205
|
4
|
+
data.tar.gz: accd01fc39e29419877ea3c960b73629d5bf39d3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6fcd3df8538f7cff766ba4c4e27ed40c0abb844f8e49166a9f75c33f8d9903a19876ba7ca41b6e7579c9f492ac214102e5a303c27e014431b3908c05b9abff0c
|
7
|
+
data.tar.gz: 4004690f7443b32516399c2e4a91abd3a62812840fe083cfebe20f2645868f1213b18f5726984e824d50f83bd3ba01f58e4aeae80a48613fb9ccc9f7b1a84620
|
data/README.md
CHANGED
@@ -2,22 +2,10 @@
|
|
2
2
|
|
3
3
|
Utility for converting diff to events.
|
4
4
|
|
5
|
-
## Installation
|
6
|
-
|
7
|
-
Add this line to your application's Gemfile:
|
8
|
-
|
9
|
-
gem 'd2e'
|
10
|
-
|
11
|
-
And then execute:
|
12
|
-
|
13
|
-
$ bundle
|
14
|
-
|
15
|
-
Or install it yourself as:
|
16
|
-
|
17
|
-
$ gem install d2e
|
18
|
-
|
19
5
|
## Usage
|
20
6
|
|
7
|
+
### Basic
|
8
|
+
|
21
9
|
```
|
22
10
|
require 'd2e'
|
23
11
|
require 'json'
|
@@ -35,8 +23,8 @@ curr = [
|
|
35
23
|
{'id' => 6, 'name' => 'Biggie', 'description' => 'Rap'},
|
36
24
|
]
|
37
25
|
|
38
|
-
d2e = D2E.new(
|
39
|
-
events = d2e.
|
26
|
+
d2e = D2E.new(id: 'id')
|
27
|
+
events = d2e.d2e(prev, curr)
|
40
28
|
puts JSON.pretty_generate(events)
|
41
29
|
```
|
42
30
|
|
@@ -78,7 +66,9 @@ output:
|
|
78
66
|
},
|
79
67
|
{
|
80
68
|
"type": "update",
|
81
|
-
"id":
|
69
|
+
"id": {
|
70
|
+
"id": 2
|
71
|
+
},
|
82
72
|
"diff": {
|
83
73
|
"description": [
|
84
74
|
"Bass",
|
@@ -89,6 +79,124 @@ output:
|
|
89
79
|
]
|
90
80
|
```
|
91
81
|
|
82
|
+
### Multiple Primary Keys
|
83
|
+
|
84
|
+
```
|
85
|
+
prev = [
|
86
|
+
{'groupName' => 'web', 'ipProtocol' => 'TCP', 'inOut' => 'IN', 'fromPort' => 80, 'toPort' => 80, 'ipRange' => '0.0.0.0/0'},
|
87
|
+
{'groupName' => 'web', 'ipProtocol' => 'TCP', 'inOut' => 'IN', 'fromPort' => 443, 'toPort' => 443, 'ipRange' => '0.0.0.0/0'},
|
88
|
+
{'groupName' => 'mon', 'ipProtocol' => 'ICMP', 'inOut' => 'OUT', 'group' => 'web'},
|
89
|
+
]
|
90
|
+
curr = [
|
91
|
+
{'groupName' => 'web', 'ipProtocol' => 'TCP', 'inOut' => 'IN', 'fromPort' => 443, 'toPort' => 443, 'ipRange' => '0.0.0.0/0'},
|
92
|
+
{'groupName' => 'mon', 'ipProtocol' => 'ICMP', 'inOut' => 'OUT', 'group' => 'web', 'description' => 'for ping monitoring'},
|
93
|
+
{'groupName' => 'app', 'ipProtocol' => 'TCP', 'inOut' => 'IN', 'fromPort' => 8080, 'toPort' => 8080, 'group' => 'web'},
|
94
|
+
]
|
95
|
+
|
96
|
+
d2e = D2E.new(id: ['groupName', 'ipProtocol', 'inOut', 'fromPort', 'toPort', 'ipRange', 'group'])
|
97
|
+
events = d2e.d2e(prev, curr)
|
98
|
+
puts JSON.pretty_generate(events)
|
99
|
+
```
|
100
|
+
|
101
|
+
output:
|
102
|
+
|
103
|
+
```
|
104
|
+
[
|
105
|
+
{
|
106
|
+
"type": "create",
|
107
|
+
"item": {
|
108
|
+
"groupName": "app",
|
109
|
+
"ipProtocol": "TCP",
|
110
|
+
"inOut": "IN",
|
111
|
+
"fromPort": 8080,
|
112
|
+
"toPort": 8080,
|
113
|
+
"group": "web"
|
114
|
+
}
|
115
|
+
},
|
116
|
+
{
|
117
|
+
"type": "delete",
|
118
|
+
"item": {
|
119
|
+
"groupName": "web",
|
120
|
+
"ipProtocol": "TCP",
|
121
|
+
"inOut": "IN",
|
122
|
+
"fromPort": 80,
|
123
|
+
"toPort": 80,
|
124
|
+
"ipRange": "0.0.0.0/0"
|
125
|
+
}
|
126
|
+
},
|
127
|
+
{
|
128
|
+
"type": "update",
|
129
|
+
"id": {
|
130
|
+
"groupName": "mon",
|
131
|
+
"ipProtocol": "ICMP",
|
132
|
+
"inOut": "OUT",
|
133
|
+
"fromPort": null,
|
134
|
+
"toPort": null,
|
135
|
+
"ipRange": null,
|
136
|
+
"group": "web"
|
137
|
+
},
|
138
|
+
"diff": {
|
139
|
+
"description": [
|
140
|
+
null,
|
141
|
+
"for ping monitoring"
|
142
|
+
]
|
143
|
+
}
|
144
|
+
}
|
145
|
+
]
|
146
|
+
```
|
147
|
+
|
148
|
+
### Ignoring Specific Keys
|
149
|
+
|
150
|
+
```
|
151
|
+
prev = [
|
152
|
+
{'groupName' => 'web', 'groupDescription' => 'Web Instances', 'ipPermissions' => nil},
|
153
|
+
{'groupName' => 'apl', 'groupDescription' => 'Apl Instances', 'ipPermissions' => nil},
|
154
|
+
{'groupName' => 'db', 'groupDescription' => 'DB Instances', 'ipPermissions' => nil},
|
155
|
+
]
|
156
|
+
curr = [
|
157
|
+
{'groupName' => 'web', 'groupDescription' => 'Web Instances', 'ipPermissions' => {'item' => ['some ingresses']}},
|
158
|
+
{'groupName' => 'apl', 'groupDescription' => 'Apl Instances', 'ipPermissions' => {'item' => ['other ingresses']}},
|
159
|
+
{'groupName' => 'db', 'groupDescription' => 'Description changed', 'ipPermissions' => {'item' => ['blah blah']}},
|
160
|
+
]
|
161
|
+
|
162
|
+
d2e = D2E.new(id: 'groupName', ignore: 'ipPermissions')
|
163
|
+
events = d2e.d2e(prev, curr)
|
164
|
+
puts JSON.pretty_generate(events)
|
165
|
+
```
|
166
|
+
|
167
|
+
output:
|
168
|
+
|
169
|
+
```
|
170
|
+
[
|
171
|
+
{
|
172
|
+
"type": "update",
|
173
|
+
"id": {
|
174
|
+
"groupName": "db"
|
175
|
+
},
|
176
|
+
"diff": {
|
177
|
+
"groupDescription": [
|
178
|
+
"DB Instances",
|
179
|
+
"Description changed"
|
180
|
+
]
|
181
|
+
}
|
182
|
+
}
|
183
|
+
]
|
184
|
+
```
|
185
|
+
|
186
|
+
## Installation
|
187
|
+
|
188
|
+
Add this line to your application's Gemfile:
|
189
|
+
|
190
|
+
gem 'd2e'
|
191
|
+
|
192
|
+
And then execute:
|
193
|
+
|
194
|
+
$ bundle
|
195
|
+
|
196
|
+
Or install it yourself as:
|
197
|
+
|
198
|
+
$ gem install d2e
|
199
|
+
|
92
200
|
## Contributing
|
93
201
|
|
94
202
|
1. Fork it ( https://github.com/[my-github-username]/d2e/fork )
|
data/lib/d2e.rb
CHANGED
@@ -2,34 +2,33 @@ require "d2e/version"
|
|
2
2
|
|
3
3
|
class D2E
|
4
4
|
def initialize(options)
|
5
|
-
@
|
5
|
+
@id = [options[:id]].flatten
|
6
|
+
if options[:ignore]
|
7
|
+
@ignore = [options[:ignore]].flatten
|
8
|
+
end
|
6
9
|
end
|
7
10
|
|
8
|
-
def
|
11
|
+
def d2e(prev, curr)
|
9
12
|
events = []
|
10
13
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
deleted = prev_ids - curr_ids
|
15
|
-
created = curr_ids - prev_ids
|
16
|
-
updated = prev_ids & curr_ids
|
14
|
+
deleted = difference(prev, curr)
|
15
|
+
created = difference(curr, prev)
|
16
|
+
remained = intersection(prev, curr)
|
17
17
|
|
18
|
-
created.each do |
|
19
|
-
item = curr.find {|item| item[@key] == id }
|
18
|
+
created.each do |item|
|
20
19
|
events << {'type' => 'create', 'item' => item}
|
21
20
|
end
|
22
21
|
|
23
|
-
deleted.each do |
|
24
|
-
item = prev.find {|item| item[@key] == id }
|
22
|
+
deleted.each do |item|
|
25
23
|
events << {'type' => 'delete', 'item' => item}
|
26
24
|
end
|
27
25
|
|
28
|
-
|
26
|
+
remained.each do |prev_item, curr_item|
|
29
27
|
diff = {}
|
30
|
-
prev_item = prev.find {|item| item[@key] == id }
|
31
|
-
curr_item = curr.find {|item| item[@key] == id }
|
32
28
|
keys = prev_item.keys | curr_item.keys
|
29
|
+
if @ignore
|
30
|
+
keys = keys - @ignore
|
31
|
+
end
|
33
32
|
keys.each do |key|
|
34
33
|
prev_value = prev_item[key]
|
35
34
|
curr_value = curr_item[key]
|
@@ -38,11 +37,32 @@ class D2E
|
|
38
37
|
end
|
39
38
|
end
|
40
39
|
if !diff.empty?
|
40
|
+
id = Hash[@id.map {|id| [id, prev_item[id]] }]
|
41
41
|
events << {'type' => 'update', 'id' => id, 'diff' => diff}
|
42
42
|
end
|
43
43
|
end
|
44
44
|
|
45
45
|
events
|
46
46
|
end
|
47
|
+
|
48
|
+
def difference(list_a, list_b)
|
49
|
+
list = []
|
50
|
+
list_a.each do |item_a|
|
51
|
+
if !list_b.find {|item_b| @id.all? {|id| item_a[id] == item_b[id] } }
|
52
|
+
list << item_a
|
53
|
+
end
|
54
|
+
end
|
55
|
+
list
|
56
|
+
end
|
57
|
+
|
58
|
+
def intersection(list_a, list_b)
|
59
|
+
list = []
|
60
|
+
list_a.each do |item_a|
|
61
|
+
if item_b = list_b.find {|item_b| @id.all? {|id| item_a[id] == item_b[id] } }
|
62
|
+
list << [item_a, item_b]
|
63
|
+
end
|
64
|
+
end
|
65
|
+
list
|
66
|
+
end
|
47
67
|
end
|
48
68
|
|
data/lib/d2e/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: d2e
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- tily
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-03-
|
11
|
+
date: 2015-03-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|