logstash-filter-mutate 0.1.0 → 0.1.1
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.
- checksums.yaml +5 -13
- data/Gemfile +3 -3
- data/LICENSE +13 -0
- data/Rakefile +1 -0
- data/lib/logstash/filters/mutate.rb +27 -28
- data/logstash-filter-mutate.gemspec +8 -6
- data/spec/filters/mutate_spec.rb +100 -1
- metadata +62 -23
- data/rakelib/publish.rake +0 -9
- data/rakelib/vendor.rake +0 -169
checksums.yaml
CHANGED
@@ -1,15 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
5
|
-
data.tar.gz: !binary |-
|
6
|
-
MjE0Mzc3M2QyOTczN2Q3NDIyM2EyZGUwMmEzZTM5M2FjOWZhNjc3Mw==
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: e1a18fa5b241d8d58dd013933b60a702dcfdc288
|
4
|
+
data.tar.gz: d33b112ef930d1000bbaf69be4b7cc323855aa95
|
7
5
|
SHA512:
|
8
|
-
metadata.gz:
|
9
|
-
|
10
|
-
MTE4NjAxYzU2YTUwY2JjMGE2NmNmZjUzNWU5ZmI0MWQzMjM3ZGMyYWZmMGI3
|
11
|
-
YTU5NTAwNjcyOGNjZjE1ZDI2OTMxY2ExOTA3MzRjMzNlZTUyOWE=
|
12
|
-
data.tar.gz: !binary |-
|
13
|
-
M2JiODBlMzk1YTdhYzJjNGZmOGZhYzllNTQxZTNlNWIwYzNhYzE2YmZmMDA1
|
14
|
-
ZDJmYjk2ZWU5M2JiNzA0OWQyOGE0OTBjNGRiMDdjMTM2NGRlMTUyNzY4Zjkz
|
15
|
-
YzNlOTJjZTlkYzYxZDZlN2RmZTFjZDIxMzYwNzYxNDg3ODQ0M2I=
|
6
|
+
metadata.gz: f292e896bf3cf0ab5a13c0870193e1a77cc2dc55bb35b3502d36a3b38f2d445472cb531deaa6cece61647e2465038a444fd570860986f74f5d9740a59b7d5e44
|
7
|
+
data.tar.gz: 7ad094fff3b4c5212dff464f314a67f2fe6d3e85e312464bbd427561702cf63cbe2e1c0130f330bde9597200a7cc05bd936c547914d4eca26774f491ab9c9a06
|
data/Gemfile
CHANGED
@@ -1,3 +1,3 @@
|
|
1
|
-
source '
|
2
|
-
|
3
|
-
gem
|
1
|
+
source 'https://rubygems.org'
|
2
|
+
gemspec
|
3
|
+
gem "logstash", :github => "elasticsearch/logstash", :branch => "1.5"
|
data/LICENSE
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
Copyright (c) 2012-2014 Elasticsearch <http://www.elasticsearch.org>
|
2
|
+
|
3
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
you may not use this file except in compliance with the License.
|
5
|
+
You may obtain a copy of the License at
|
6
|
+
|
7
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
|
9
|
+
Unless required by applicable law or agreed to in writing, software
|
10
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
See the License for the specific language governing permissions and
|
13
|
+
limitations under the License.
|
data/Rakefile
CHANGED
@@ -5,7 +5,7 @@ require "logstash/namespace"
|
|
5
5
|
# The mutate filter allows you to perform general mutations on fields. You
|
6
6
|
# can rename, remove, replace, and modify fields in your events.
|
7
7
|
#
|
8
|
-
# TODO(sissel): Support regexp replacements like String#gsub ?
|
8
|
+
# TODO(sissel): Support regexp replacements like `String#gsub` ?
|
9
9
|
class LogStash::Filters::Mutate < LogStash::Filters::Base
|
10
10
|
config_name "mutate"
|
11
11
|
milestone 3
|
@@ -13,7 +13,7 @@ class LogStash::Filters::Mutate < LogStash::Filters::Base
|
|
13
13
|
# Rename one or more fields.
|
14
14
|
#
|
15
15
|
# Example:
|
16
|
-
#
|
16
|
+
# [source,ruby]
|
17
17
|
# filter {
|
18
18
|
# mutate {
|
19
19
|
# # Renames the 'HOSTORIP' field to 'client_ip'
|
@@ -25,14 +25,14 @@ class LogStash::Filters::Mutate < LogStash::Filters::Base
|
|
25
25
|
# Remove one or more fields.
|
26
26
|
#
|
27
27
|
# Example:
|
28
|
-
#
|
28
|
+
# [source,ruby]
|
29
29
|
# filter {
|
30
30
|
# mutate {
|
31
31
|
# remove => [ "client" ] # Removes the 'client' field
|
32
32
|
# }
|
33
33
|
# }
|
34
34
|
#
|
35
|
-
# This option is deprecated, instead use remove_field option available in all
|
35
|
+
# This option is deprecated, instead use `remove_field` option available in all
|
36
36
|
# filters.
|
37
37
|
config :remove, :validate => :array, :deprecated => true
|
38
38
|
|
@@ -40,7 +40,7 @@ class LogStash::Filters::Mutate < LogStash::Filters::Base
|
|
40
40
|
# to help you build a new value from other parts of the event.
|
41
41
|
#
|
42
42
|
# Example:
|
43
|
-
#
|
43
|
+
# [source,ruby]
|
44
44
|
# filter {
|
45
45
|
# mutate {
|
46
46
|
# replace => { "message" => "%{source_host}: My new message" }
|
@@ -52,7 +52,7 @@ class LogStash::Filters::Mutate < LogStash::Filters::Base
|
|
52
52
|
# then no action will be taken.
|
53
53
|
#
|
54
54
|
# Example:
|
55
|
-
#
|
55
|
+
# [source,ruby]
|
56
56
|
# filter {
|
57
57
|
# mutate {
|
58
58
|
# update => { "sample" => "My new message" }
|
@@ -67,7 +67,7 @@ class LogStash::Filters::Mutate < LogStash::Filters::Base
|
|
67
67
|
# Valid conversion targets are: integer, float, string.
|
68
68
|
#
|
69
69
|
# Example:
|
70
|
-
#
|
70
|
+
# [source,ruby]
|
71
71
|
# filter {
|
72
72
|
# mutate {
|
73
73
|
# convert => { "fieldname" => "integer" }
|
@@ -84,7 +84,7 @@ class LogStash::Filters::Mutate < LogStash::Filters::Base
|
|
84
84
|
# Be aware of escaping any backslash in the config file.
|
85
85
|
#
|
86
86
|
# Example:
|
87
|
-
#
|
87
|
+
# [source,ruby]
|
88
88
|
# filter {
|
89
89
|
# mutate {
|
90
90
|
# gsub => [
|
@@ -103,7 +103,7 @@ class LogStash::Filters::Mutate < LogStash::Filters::Base
|
|
103
103
|
# Convert a string to its uppercase equivalent.
|
104
104
|
#
|
105
105
|
# Example:
|
106
|
-
#
|
106
|
+
# [source,ruby]
|
107
107
|
# filter {
|
108
108
|
# mutate {
|
109
109
|
# uppercase => [ "fieldname" ]
|
@@ -114,7 +114,7 @@ class LogStash::Filters::Mutate < LogStash::Filters::Base
|
|
114
114
|
# Convert a string to its lowercase equivalent.
|
115
115
|
#
|
116
116
|
# Example:
|
117
|
-
#
|
117
|
+
# [source,ruby]
|
118
118
|
# filter {
|
119
119
|
# mutate {
|
120
120
|
# lowercase => [ "fieldname" ]
|
@@ -126,7 +126,7 @@ class LogStash::Filters::Mutate < LogStash::Filters::Base
|
|
126
126
|
# fields.
|
127
127
|
#
|
128
128
|
# Example:
|
129
|
-
#
|
129
|
+
# [source,ruby]
|
130
130
|
# filter {
|
131
131
|
# mutate {
|
132
132
|
# split => { "fieldname" => "," }
|
@@ -137,7 +137,7 @@ class LogStash::Filters::Mutate < LogStash::Filters::Base
|
|
137
137
|
# Join an array with a separator character. Does nothing on non-array fields.
|
138
138
|
#
|
139
139
|
# Example:
|
140
|
-
#
|
140
|
+
# [source,ruby]
|
141
141
|
# filter {
|
142
142
|
# mutate {
|
143
143
|
# join => { "fieldname" => "," }
|
@@ -148,7 +148,7 @@ class LogStash::Filters::Mutate < LogStash::Filters::Base
|
|
148
148
|
# Strip whitespace from field. NOTE: this only works on leading and trailing whitespace.
|
149
149
|
#
|
150
150
|
# Example:
|
151
|
-
#
|
151
|
+
# [source,ruby]
|
152
152
|
# filter {
|
153
153
|
# mutate {
|
154
154
|
# strip => ["field1", "field2"]
|
@@ -158,12 +158,13 @@ class LogStash::Filters::Mutate < LogStash::Filters::Base
|
|
158
158
|
|
159
159
|
# Merge two fields of arrays or hashes.
|
160
160
|
# String fields will be automatically be converted into an array, so:
|
161
|
-
#
|
162
|
-
#
|
163
|
-
#
|
164
|
-
#
|
161
|
+
# ==========================
|
162
|
+
# `array` + `string` will work
|
163
|
+
# `string` + `string` will result in an 2 entry array in `dest_field`
|
164
|
+
# `array` and `hash` will not work
|
165
|
+
# ==========================
|
165
166
|
# Example:
|
166
|
-
#
|
167
|
+
# [source,ruby]
|
167
168
|
# filter {
|
168
169
|
# mutate {
|
169
170
|
# merge => { "dest_field" => "added_field" }
|
@@ -390,21 +391,19 @@ class LogStash::Filters::Mutate < LogStash::Filters::Base
|
|
390
391
|
private
|
391
392
|
def merge(event)
|
392
393
|
@merge.each do |dest_field, added_fields|
|
393
|
-
#When multiple calls, added_field is an array
|
394
|
-
added_fields
|
395
|
-
added_fields.each do |added_field|
|
394
|
+
# When multiple calls, added_field is an array
|
395
|
+
Array(added_fields).each do |added_field|
|
396
396
|
if event[dest_field].is_a?(Hash) ^ event[added_field].is_a?(Hash)
|
397
|
-
@logger.error("Not possible to merge an array and a hash: ",
|
398
|
-
:dest_field => dest_field,
|
399
|
-
:added_field => added_field )
|
397
|
+
@logger.error("Not possible to merge an array and a hash: ", :dest_field => dest_field, :added_field => added_field )
|
400
398
|
next
|
401
399
|
end
|
402
|
-
|
400
|
+
|
401
|
+
if event[dest_field].is_a?(Hash)
|
402
|
+
# No need to test the other
|
403
403
|
event[dest_field].update(event[added_field])
|
404
404
|
else
|
405
|
-
event[dest_field] =
|
406
|
-
event[
|
407
|
-
event[dest_field].concat(event[added_field])
|
405
|
+
event[dest_field] = Array(event[dest_field])
|
406
|
+
event[dest_field].concat(Array(event[added_field]))
|
408
407
|
end
|
409
408
|
end
|
410
409
|
end
|
@@ -1,13 +1,13 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
|
3
3
|
s.name = 'logstash-filter-mutate'
|
4
|
-
s.version = '0.1.
|
4
|
+
s.version = '0.1.1'
|
5
5
|
s.licenses = ['Apache License (2.0)']
|
6
6
|
s.summary = "The mutate filter allows you to perform general mutations on fields. You can rename, remove, replace, and modify fields in your events."
|
7
|
-
s.description = "
|
7
|
+
s.description = "This gem is a logstash plugin required to be installed on top of the Logstash core pipeline using $LS_HOME/bin/plugin install gemname. This gem is not a stand-alone program"
|
8
8
|
s.authors = ["Elasticsearch"]
|
9
|
-
s.email = '
|
10
|
-
s.homepage = "http://logstash.
|
9
|
+
s.email = 'info@elasticsearch.com'
|
10
|
+
s.homepage = "http://www.elasticsearch.org/guide/en/logstash/current/index.html"
|
11
11
|
s.require_paths = ["lib"]
|
12
12
|
|
13
13
|
# Files
|
@@ -17,10 +17,12 @@ Gem::Specification.new do |s|
|
|
17
17
|
s.test_files = s.files.grep(%r{^(test|spec|features)/})
|
18
18
|
|
19
19
|
# Special flag to let us know this is actually a logstash plugin
|
20
|
-
s.metadata = { "logstash_plugin" => "true", "
|
20
|
+
s.metadata = { "logstash_plugin" => "true", "logstash_group" => "filter" }
|
21
21
|
|
22
22
|
# Gem dependencies
|
23
23
|
s.add_runtime_dependency 'logstash', '>= 1.4.0', '< 2.0.0'
|
24
|
-
|
24
|
+
s.add_runtime_dependency 'logstash-patterns-core'
|
25
|
+
s.add_runtime_dependency 'logstash-filter-grok'
|
26
|
+
s.add_development_dependency 'logstash-devutils'
|
25
27
|
end
|
26
28
|
|
data/spec/filters/mutate_spec.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
|
3
|
-
require "spec_helper"
|
3
|
+
require "logstash/devutils/rspec/spec_helper"
|
4
4
|
require "logstash/filters/mutate"
|
5
5
|
|
6
6
|
describe LogStash::Filters::Mutate do
|
@@ -254,5 +254,104 @@ describe LogStash::Filters::Mutate do
|
|
254
254
|
]
|
255
255
|
end
|
256
256
|
end
|
257
|
+
|
258
|
+
describe "merge string field into inexisting field" do
|
259
|
+
config '
|
260
|
+
filter {
|
261
|
+
mutate {
|
262
|
+
merge => [ "list", "foo" ]
|
263
|
+
}
|
264
|
+
}'
|
265
|
+
|
266
|
+
sample("foo" => "bar") do
|
267
|
+
insist { subject["list"] } == ["bar"]
|
268
|
+
insist { subject["foo"] } == "bar"
|
269
|
+
end
|
270
|
+
end
|
271
|
+
|
272
|
+
describe "merge string field into empty array" do
|
273
|
+
config '
|
274
|
+
filter {
|
275
|
+
mutate {
|
276
|
+
merge => [ "list", "foo" ]
|
277
|
+
}
|
278
|
+
}'
|
279
|
+
|
280
|
+
sample("foo" => "bar", "list" => []) do
|
281
|
+
insist { subject["list"] } == ["bar"]
|
282
|
+
insist { subject["foo"] } == "bar"
|
283
|
+
end
|
284
|
+
end
|
285
|
+
|
286
|
+
describe "merge string field into existing array" do
|
287
|
+
config '
|
288
|
+
filter {
|
289
|
+
mutate {
|
290
|
+
merge => [ "list", "foo" ]
|
291
|
+
}
|
292
|
+
}'
|
293
|
+
|
294
|
+
sample("foo" => "bar", "list" => ["baz"]) do
|
295
|
+
insist { subject["list"] } == ["baz", "bar"]
|
296
|
+
insist { subject["foo"] } == "bar"
|
297
|
+
end
|
298
|
+
end
|
299
|
+
|
300
|
+
describe "merge non empty array field into existing array" do
|
301
|
+
config '
|
302
|
+
filter {
|
303
|
+
mutate {
|
304
|
+
merge => [ "list", "foo" ]
|
305
|
+
}
|
306
|
+
}'
|
307
|
+
|
308
|
+
sample("foo" => ["bar"], "list" => ["baz"]) do
|
309
|
+
insist { subject["list"] } == ["baz", "bar"]
|
310
|
+
insist { subject["foo"] } == ["bar"]
|
311
|
+
end
|
312
|
+
end
|
313
|
+
|
314
|
+
describe "merge empty array field into existing array" do
|
315
|
+
config '
|
316
|
+
filter {
|
317
|
+
mutate {
|
318
|
+
merge => [ "list", "foo" ]
|
319
|
+
}
|
320
|
+
}'
|
321
|
+
|
322
|
+
sample("foo" => [], "list" => ["baz"]) do
|
323
|
+
insist { subject["list"] } == ["baz"]
|
324
|
+
insist { subject["foo"] } == []
|
325
|
+
end
|
326
|
+
end
|
327
|
+
|
328
|
+
describe "merge array field into string field" do
|
329
|
+
config '
|
330
|
+
filter {
|
331
|
+
mutate {
|
332
|
+
merge => [ "list", "foo" ]
|
333
|
+
}
|
334
|
+
}'
|
335
|
+
|
336
|
+
sample("foo" => ["bar"], "list" => "baz") do
|
337
|
+
insist { subject["list"] } == ["baz", "bar"]
|
338
|
+
insist { subject["foo"] } == ["bar"]
|
339
|
+
end
|
340
|
+
end
|
341
|
+
|
342
|
+
describe "merge string field into string field" do
|
343
|
+
config '
|
344
|
+
filter {
|
345
|
+
mutate {
|
346
|
+
merge => [ "list", "foo" ]
|
347
|
+
}
|
348
|
+
}'
|
349
|
+
|
350
|
+
sample("foo" => "bar", "list" => "baz") do
|
351
|
+
insist { subject["list"] } == ["baz", "bar"]
|
352
|
+
insist { subject["foo"] } == "bar"
|
353
|
+
end
|
354
|
+
end
|
355
|
+
|
257
356
|
end
|
258
357
|
|
metadata
CHANGED
@@ -1,76 +1,115 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: logstash-filter-mutate
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Elasticsearch
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-11-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: logstash
|
15
|
+
version_requirements: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - '>='
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 1.4.0
|
20
|
+
- - <
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 2.0.0
|
15
23
|
requirement: !ruby/object:Gem::Requirement
|
16
24
|
requirements:
|
17
|
-
- -
|
25
|
+
- - '>='
|
18
26
|
- !ruby/object:Gem::Version
|
19
27
|
version: 1.4.0
|
20
28
|
- - <
|
21
29
|
- !ruby/object:Gem::Version
|
22
30
|
version: 2.0.0
|
31
|
+
prerelease: false
|
32
|
+
type: :runtime
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: logstash-patterns-core
|
35
|
+
version_requirements: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - '>='
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '0'
|
40
|
+
requirement: !ruby/object:Gem::Requirement
|
41
|
+
requirements:
|
42
|
+
- - '>='
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
version: '0'
|
45
|
+
prerelease: false
|
23
46
|
type: :runtime
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: logstash-filter-grok
|
49
|
+
version_requirements: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
requirement: !ruby/object:Gem::Requirement
|
55
|
+
requirements:
|
56
|
+
- - '>='
|
57
|
+
- !ruby/object:Gem::Version
|
58
|
+
version: '0'
|
24
59
|
prerelease: false
|
60
|
+
type: :runtime
|
61
|
+
- !ruby/object:Gem::Dependency
|
62
|
+
name: logstash-devutils
|
25
63
|
version_requirements: !ruby/object:Gem::Requirement
|
26
64
|
requirements:
|
27
|
-
- -
|
65
|
+
- - '>='
|
28
66
|
- !ruby/object:Gem::Version
|
29
|
-
version:
|
30
|
-
|
67
|
+
version: '0'
|
68
|
+
requirement: !ruby/object:Gem::Requirement
|
69
|
+
requirements:
|
70
|
+
- - '>='
|
31
71
|
- !ruby/object:Gem::Version
|
32
|
-
version:
|
33
|
-
|
34
|
-
|
35
|
-
|
72
|
+
version: '0'
|
73
|
+
prerelease: false
|
74
|
+
type: :development
|
75
|
+
description: This gem is a logstash plugin required to be installed on top of the Logstash core pipeline using $LS_HOME/bin/plugin install gemname. This gem is not a stand-alone program
|
76
|
+
email: info@elasticsearch.com
|
36
77
|
executables: []
|
37
78
|
extensions: []
|
38
79
|
extra_rdoc_files: []
|
39
80
|
files:
|
40
81
|
- .gitignore
|
41
82
|
- Gemfile
|
83
|
+
- LICENSE
|
42
84
|
- Rakefile
|
43
85
|
- lib/logstash/filters/mutate.rb
|
44
86
|
- logstash-filter-mutate.gemspec
|
45
|
-
- rakelib/publish.rake
|
46
|
-
- rakelib/vendor.rake
|
47
87
|
- spec/filters/mutate_spec.rb
|
48
|
-
homepage: http://logstash.
|
88
|
+
homepage: http://www.elasticsearch.org/guide/en/logstash/current/index.html
|
49
89
|
licenses:
|
50
90
|
- Apache License (2.0)
|
51
91
|
metadata:
|
52
92
|
logstash_plugin: 'true'
|
53
|
-
|
54
|
-
post_install_message:
|
93
|
+
logstash_group: filter
|
94
|
+
post_install_message:
|
55
95
|
rdoc_options: []
|
56
96
|
require_paths:
|
57
97
|
- lib
|
58
98
|
required_ruby_version: !ruby/object:Gem::Requirement
|
59
99
|
requirements:
|
60
|
-
- -
|
100
|
+
- - '>='
|
61
101
|
- !ruby/object:Gem::Version
|
62
102
|
version: '0'
|
63
103
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
64
104
|
requirements:
|
65
|
-
- -
|
105
|
+
- - '>='
|
66
106
|
- !ruby/object:Gem::Version
|
67
107
|
version: '0'
|
68
108
|
requirements: []
|
69
|
-
rubyforge_project:
|
70
|
-
rubygems_version: 2.4.
|
71
|
-
signing_key:
|
109
|
+
rubyforge_project:
|
110
|
+
rubygems_version: 2.4.4
|
111
|
+
signing_key:
|
72
112
|
specification_version: 4
|
73
|
-
summary: The mutate filter allows you to perform general mutations on fields. You
|
74
|
-
can rename, remove, replace, and modify fields in your events.
|
113
|
+
summary: The mutate filter allows you to perform general mutations on fields. You can rename, remove, replace, and modify fields in your events.
|
75
114
|
test_files:
|
76
115
|
- spec/filters/mutate_spec.rb
|
data/rakelib/publish.rake
DELETED
@@ -1,9 +0,0 @@
|
|
1
|
-
require "gem_publisher"
|
2
|
-
|
3
|
-
desc "Publish gem to RubyGems.org"
|
4
|
-
task :publish_gem do |t|
|
5
|
-
gem_file = Dir.glob(File.expand_path('../*.gemspec',File.dirname(__FILE__))).first
|
6
|
-
gem = GemPublisher.publish_if_updated(gem_file, :rubygems)
|
7
|
-
puts "Published #{gem}" if gem
|
8
|
-
end
|
9
|
-
|
data/rakelib/vendor.rake
DELETED
@@ -1,169 +0,0 @@
|
|
1
|
-
require "net/http"
|
2
|
-
require "uri"
|
3
|
-
require "digest/sha1"
|
4
|
-
|
5
|
-
def vendor(*args)
|
6
|
-
return File.join("vendor", *args)
|
7
|
-
end
|
8
|
-
|
9
|
-
directory "vendor/" => ["vendor"] do |task, args|
|
10
|
-
mkdir task.name
|
11
|
-
end
|
12
|
-
|
13
|
-
def fetch(url, sha1, output)
|
14
|
-
|
15
|
-
puts "Downloading #{url}"
|
16
|
-
actual_sha1 = download(url, output)
|
17
|
-
|
18
|
-
if actual_sha1 != sha1
|
19
|
-
fail "SHA1 does not match (expected '#{sha1}' but got '#{actual_sha1}')"
|
20
|
-
end
|
21
|
-
end # def fetch
|
22
|
-
|
23
|
-
def file_fetch(url, sha1)
|
24
|
-
filename = File.basename( URI(url).path )
|
25
|
-
output = "vendor/#{filename}"
|
26
|
-
task output => [ "vendor/" ] do
|
27
|
-
begin
|
28
|
-
actual_sha1 = file_sha1(output)
|
29
|
-
if actual_sha1 != sha1
|
30
|
-
fetch(url, sha1, output)
|
31
|
-
end
|
32
|
-
rescue Errno::ENOENT
|
33
|
-
fetch(url, sha1, output)
|
34
|
-
end
|
35
|
-
end.invoke
|
36
|
-
|
37
|
-
return output
|
38
|
-
end
|
39
|
-
|
40
|
-
def file_sha1(path)
|
41
|
-
digest = Digest::SHA1.new
|
42
|
-
fd = File.new(path, "r")
|
43
|
-
while true
|
44
|
-
begin
|
45
|
-
digest << fd.sysread(16384)
|
46
|
-
rescue EOFError
|
47
|
-
break
|
48
|
-
end
|
49
|
-
end
|
50
|
-
return digest.hexdigest
|
51
|
-
ensure
|
52
|
-
fd.close if fd
|
53
|
-
end
|
54
|
-
|
55
|
-
def download(url, output)
|
56
|
-
uri = URI(url)
|
57
|
-
digest = Digest::SHA1.new
|
58
|
-
tmp = "#{output}.tmp"
|
59
|
-
Net::HTTP.start(uri.host, uri.port, :use_ssl => (uri.scheme == "https")) do |http|
|
60
|
-
request = Net::HTTP::Get.new(uri.path)
|
61
|
-
http.request(request) do |response|
|
62
|
-
fail "HTTP fetch failed for #{url}. #{response}" if [200, 301].include?(response.code)
|
63
|
-
size = (response["content-length"].to_i || -1).to_f
|
64
|
-
count = 0
|
65
|
-
File.open(tmp, "w") do |fd|
|
66
|
-
response.read_body do |chunk|
|
67
|
-
fd.write(chunk)
|
68
|
-
digest << chunk
|
69
|
-
if size > 0 && $stdout.tty?
|
70
|
-
count += chunk.bytesize
|
71
|
-
$stdout.write(sprintf("\r%0.2f%%", count/size * 100))
|
72
|
-
end
|
73
|
-
end
|
74
|
-
end
|
75
|
-
$stdout.write("\r \r") if $stdout.tty?
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
79
|
-
File.rename(tmp, output)
|
80
|
-
|
81
|
-
return digest.hexdigest
|
82
|
-
rescue SocketError => e
|
83
|
-
puts "Failure while downloading #{url}: #{e}"
|
84
|
-
raise
|
85
|
-
ensure
|
86
|
-
File.unlink(tmp) if File.exist?(tmp)
|
87
|
-
end # def download
|
88
|
-
|
89
|
-
def untar(tarball, &block)
|
90
|
-
require "archive/tar/minitar"
|
91
|
-
tgz = Zlib::GzipReader.new(File.open(tarball))
|
92
|
-
# Pull out typesdb
|
93
|
-
tar = Archive::Tar::Minitar::Input.open(tgz)
|
94
|
-
tar.each do |entry|
|
95
|
-
path = block.call(entry)
|
96
|
-
next if path.nil?
|
97
|
-
parent = File.dirname(path)
|
98
|
-
|
99
|
-
mkdir_p parent unless File.directory?(parent)
|
100
|
-
|
101
|
-
# Skip this file if the output file is the same size
|
102
|
-
if entry.directory?
|
103
|
-
mkdir path unless File.directory?(path)
|
104
|
-
else
|
105
|
-
entry_mode = entry.instance_eval { @mode } & 0777
|
106
|
-
if File.exists?(path)
|
107
|
-
stat = File.stat(path)
|
108
|
-
# TODO(sissel): Submit a patch to archive-tar-minitar upstream to
|
109
|
-
# expose headers in the entry.
|
110
|
-
entry_size = entry.instance_eval { @size }
|
111
|
-
# If file sizes are same, skip writing.
|
112
|
-
next if stat.size == entry_size && (stat.mode & 0777) == entry_mode
|
113
|
-
end
|
114
|
-
puts "Extracting #{entry.full_name} from #{tarball} #{entry_mode.to_s(8)}"
|
115
|
-
File.open(path, "w") do |fd|
|
116
|
-
# eof? check lets us skip empty files. Necessary because the API provided by
|
117
|
-
# Archive::Tar::Minitar::Reader::EntryStream only mostly acts like an
|
118
|
-
# IO object. Something about empty files in this EntryStream causes
|
119
|
-
# IO.copy_stream to throw "can't convert nil into String" on JRuby
|
120
|
-
# TODO(sissel): File a bug about this.
|
121
|
-
while !entry.eof?
|
122
|
-
chunk = entry.read(16384)
|
123
|
-
fd.write(chunk)
|
124
|
-
end
|
125
|
-
#IO.copy_stream(entry, fd)
|
126
|
-
end
|
127
|
-
File.chmod(entry_mode, path)
|
128
|
-
end
|
129
|
-
end
|
130
|
-
tar.close
|
131
|
-
File.unlink(tarball) if File.file?(tarball)
|
132
|
-
end # def untar
|
133
|
-
|
134
|
-
def ungz(file)
|
135
|
-
|
136
|
-
outpath = file.gsub('.gz', '')
|
137
|
-
tgz = Zlib::GzipReader.new(File.open(file))
|
138
|
-
begin
|
139
|
-
File.open(outpath, "w") do |out|
|
140
|
-
IO::copy_stream(tgz, out)
|
141
|
-
end
|
142
|
-
File.unlink(file)
|
143
|
-
rescue
|
144
|
-
File.unlink(outpath) if File.file?(outpath)
|
145
|
-
raise
|
146
|
-
end
|
147
|
-
tgz.close
|
148
|
-
end
|
149
|
-
|
150
|
-
desc "Process any vendor files required for this plugin"
|
151
|
-
task "vendor" do |task, args|
|
152
|
-
|
153
|
-
@files.each do |file|
|
154
|
-
download = file_fetch(file['url'], file['sha1'])
|
155
|
-
if download =~ /.tar.gz/
|
156
|
-
prefix = download.gsub('.tar.gz', '').gsub('vendor/', '')
|
157
|
-
untar(download) do |entry|
|
158
|
-
if !file['files'].nil?
|
159
|
-
next unless file['files'].include?(entry.full_name.gsub(prefix, ''))
|
160
|
-
out = entry.full_name.split("/").last
|
161
|
-
end
|
162
|
-
File.join('vendor', out)
|
163
|
-
end
|
164
|
-
elsif download =~ /.gz/
|
165
|
-
ungz(download)
|
166
|
-
end
|
167
|
-
end
|
168
|
-
|
169
|
-
end
|