fluent-plugin-twitter 0.5.4 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
data/.travis.yml CHANGED
@@ -2,8 +2,9 @@ sudo: false
2
2
  language: ruby
3
3
 
4
4
  rvm:
5
- - 2.2
6
- - 2.1
5
+ - 2.3.1
6
+ - 2.2.5
7
+ - 2.1.10
7
8
 
8
9
  before_install:
9
10
  - gem update bundler
@@ -12,17 +13,18 @@ gemfile:
12
13
  - Gemfile
13
14
  - gemfiles/fluentd_v0.10.gemfile
14
15
  - gemfiles/fluentd_v0.12.gemfile
16
+ - gemfiles/fluentd_v0.14.gemfile
15
17
 
16
18
  matrix:
17
19
  include:
18
- - rvm: 2.3.1
19
- gemfile: Gemfile
20
20
  - rvm: 2.0.0
21
21
  gemfile: gemfiles/fluentd_v0.10.gemfile
22
22
  - rvm: 2.0.0
23
23
  gemfile: gemfiles/fluentd_v0.12.gemfile
24
+ exclude:
25
+ - rvm: 2.3.1
26
+ gemfile: gemfiles/fluentd_v0.10.gemfile
24
27
  - rvm: 1.9.3
25
28
  gemfile: gemfiles/fluentd_v0.10.gemfile
26
29
  - rvm: 1.9.3
27
30
  gemfile: gemfiles/fluentd_v0.12.gemfile
28
-
data/Appraisals CHANGED
@@ -6,3 +6,6 @@ appraise "fluentd v0.12" do
6
6
  gem "fluentd", "~> 0.12.0"
7
7
  end
8
8
 
9
+ appraise "fluentd v0.14" do
10
+ gem "fluentd", "~> 0.14.0"
11
+ end
data/README.md CHANGED
@@ -27,11 +27,11 @@ $ gem install fluent-plugin-twitter
27
27
 
28
28
  # for td-agent
29
29
  $ sudo /usr/lib64/fluent/ruby/bin/fluent-gem install eventmachine
30
- $ sudo /usr/lib64/fluent/ruby/bin/fluent-gem install fluent-plugin-twitter
30
+ $ sudo /usr/lib64/fluent/ruby/bin/fluent-gem install fluent-plugin-twitter -v 0.6.0
31
31
 
32
32
  # for td-agent2
33
33
  $ sudo td-agent-gem install eventmachine
34
- $ sudo td-agent-gem install fluent-plugin-twitter
34
+ $ sudo td-agent-gem install fluent-plugin-twitter -v 0.6.0
35
35
  ```
36
36
 
37
37
  ## Input Configuration
@@ -42,22 +42,23 @@ It require td-agent2 (fluentd v0.12) to use keyword with hashtag.
42
42
 
43
43
  `````
44
44
  <source>
45
- type twitter
46
- consumer_key YOUR_CONSUMER_KEY # Required
47
- consumer_secret YOUR_CONSUMER_SECRET # Required
48
- oauth_token YOUR_OAUTH_TOKEN # Required
49
- oauth_token_secret YOUR_OAUTH_TOKEN_SECRET # Required
50
- tag input.twitter.sampling # Required
51
- timeline tracking # Required (tracking or sampling or location or userstream)
52
- keyword 'Ruby,Python,#fleuntd' # Optional (keyword has priority than follow_ids)
53
- follow_ids 14252,53235 # Optional (integers, not screen names)
45
+ @type twitter
46
+ consumer_key YOUR_CONSUMER_KEY # Required
47
+ consumer_secret YOUR_CONSUMER_SECRET # Required
48
+ access_token YOUR_ACCESS_TOKEN # Required
49
+ access_token_secret YOUR_ACCESS_TOKEN_SECRET # Required
50
+ tag input.twitter.sampling # Required
51
+ timeline tracking # Required (tracking or sampling or location or userstream)
52
+ keyword 'Ruby,Python,#fleuntd' # Optional (keyword has priority than follow_ids)
53
+ follow_ids 14252,53235 # Optional (integers, not screen names)
54
54
  locations 31.110283, 129.431631, 45.619283, 145.510175 # Optional (bounding boxes; first pair specifies longitude/latitude of southwest corner)
55
- lang ja,en # Optional
56
- output_format nest # Optional (nest or flat or simple[default])
55
+ lang ja,en # Optional
56
+ output_format nest # Optional (nest or flat or simple[default])
57
+ flatten_separator _ # Optional
57
58
  </source>
58
59
 
59
60
  <match input.twitter.sampling>
60
- type stdout
61
+ @type stdout
61
62
  </match>
62
63
  `````
63
64
 
@@ -72,16 +73,16 @@ $ tail -f /var/log/td-agent/td-agent.log
72
73
  ### Output Sample
73
74
  `````
74
75
  <source>
75
- type http
76
+ @type http
76
77
  port 8888
77
78
  </source>
78
79
 
79
80
  <match notify.twitter>
80
- type twitter
81
+ @type twitter
81
82
  consumer_key YOUR_CONSUMER_KEY
82
83
  consumer_secret YOUR_CONSUMER_SECRET
83
- access_token YOUR_OAUTH_TOKEN
84
- access_token_secret YOUR_OAUTH_TOKEN_SECRET
84
+ access_token YOUR_ACCESS_TOKEN
85
+ access_token_secret YOUR_ACCESS_TOKEN_SECRET
85
86
  </match>
86
87
  `````
87
88
 
@@ -3,7 +3,7 @@ $:.push File.expand_path("../lib", __FILE__)
3
3
 
4
4
  Gem::Specification.new do |s|
5
5
  s.name = "fluent-plugin-twitter"
6
- s.version = "0.5.4"
6
+ s.version = "0.6.0"
7
7
  s.authors = ["Kentaro Yoshida"]
8
8
  s.email = ["y.ken.studio@gmail.com"]
9
9
  s.homepage = "https://github.com/y-ken/fluent-plugin-twitter"
@@ -19,13 +19,7 @@ Gem::Specification.new do |s|
19
19
  s.add_development_dependency "test-unit", ">= 3.1.0"
20
20
  s.add_development_dependency "appraisal"
21
21
 
22
- # Since Fluentd v0.14 requires ruby 2.1 or later.
23
- if defined?(RUBY_VERSION) && RUBY_VERSION < "2.1"
24
- s.add_runtime_dependency "fluentd", "< 0.14"
25
- else
26
- s.add_runtime_dependency "fluentd", ">= 0.10.46"
27
- end
28
- s.add_runtime_dependency "twitter", ">= 5.0.0"
29
- s.add_runtime_dependency "tweetstream", ">= 2.6.1"
30
- s.add_runtime_dependency "string-scrub", ">= 0.0.3" if RUBY_VERSION.to_f < 2.1
22
+ s.add_runtime_dependency "fluentd", [">= 0.10.46", "< 2"]
23
+ s.add_runtime_dependency "twitter", "~> 5.0"
24
+ s.add_runtime_dependency "string-scrub", [">= 0.0.3", "<= 0.0.5"]
31
25
  end
@@ -0,0 +1,7 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "http://rubygems.org"
4
+
5
+ gem "fluentd", "~> 0.14.0"
6
+
7
+ gemspec :path => "../"
@@ -1,3 +1,7 @@
1
+ require 'twitter'
2
+ require 'nkf'
3
+ require 'string/scrub' if RUBY_VERSION.to_f < 2.1
4
+
1
5
  require "fluent/input"
2
6
 
3
7
  module Fluent
@@ -13,8 +17,8 @@ module Fluent
13
17
 
14
18
  config_param :consumer_key, :string, :secret => true
15
19
  config_param :consumer_secret, :string, :secret => true
16
- config_param :oauth_token, :string, :secret => true
17
- config_param :oauth_token_secret, :string, :secret => true
20
+ config_param :access_token, :string, :secret => true
21
+ config_param :access_token_secret, :string, :secret => true
18
22
  config_param :tag, :string
19
23
  config_param :timeline, :string
20
24
  config_param :keyword, :string, :default => nil
@@ -26,9 +30,6 @@ module Fluent
26
30
 
27
31
  def initialize
28
32
  super
29
- require 'tweetstream'
30
- require 'nkf'
31
- require 'string/scrub' if RUBY_VERSION.to_f < 2.1
32
33
  end
33
34
 
34
35
  def configure(conf)
@@ -43,20 +44,16 @@ module Fluent
43
44
 
44
45
  @keyword = @keyword.gsub('${hashtag}', '#') unless @keyword.nil?
45
46
 
46
- TweetStream.configure do |config|
47
+ @client = Twitter::Streaming::Client.new do |config|
47
48
  config.consumer_key = @consumer_key
48
49
  config.consumer_secret = @consumer_secret
49
- config.oauth_token = @oauth_token
50
- config.oauth_token_secret = @oauth_token_secret
51
- config.auth_method = :oauth
50
+ config.access_token = @access_token
51
+ config.access_token_secret = @access_token_secret
52
52
  end
53
53
  end
54
54
 
55
55
  def start
56
56
  @thread = Thread.new(&method(:run))
57
- @any = Proc.new do |hash|
58
- get_message(hash) if is_message?(hash)
59
- end
60
57
  end
61
58
 
62
59
  def shutdown
@@ -64,64 +61,58 @@ module Fluent
64
61
  end
65
62
 
66
63
  def run
67
- client = get_twitter_connection
64
+ notice = "twitter: starting Twitter Streaming API for #{@timeline}."
65
+ notice << " tag:#{@tag}"
66
+ notice << " lang:#{@lang}" unless @lang.nil?
67
+ notice << " keyword:#{@keyword}" unless @keyword.nil?
68
+ notice << " follow:#{@follow_ids}" unless @follow_ids.nil? && !@keyword.nil?
69
+ $log.info notice
70
+
68
71
  if ['sampling', 'tracking'].include?(@timeline) && @keyword
69
- client.track(@keyword)
72
+ @client.filter(track: @keyword, &method(:handle_object))
70
73
  elsif @timeline == 'tracking' && @follow_ids
71
- client.follow(@follow_ids)
72
- elsif @timeline == 'location' && @locations
73
- client.locations(@locations)
74
+ @client.filter(follow: @follow_ids, &method(:handle_object))
74
75
  elsif @timeline == 'sampling' && @keyword.nil? && @follow_ids.nil?
75
- client.sample
76
+ @client.sample(&method(:handle_object))
76
77
  elsif @timeline == 'userstream'
77
- client.userstream
78
+ @client.user(&method(:handle_object))
78
79
  end
79
80
  end
80
81
 
81
- def get_twitter_connection
82
- notice = "twitter: starting Twitter Streaming API for #{@timeline}."
83
- notice << " tag:#{@tag}"
84
- notice << " lang:#{@lang}" unless @lang.nil?
85
- notice << " keyword:#{@keyword}" unless @keyword.nil?
86
- notice << " follow:#{@follow_ids}" unless @follow_ids.nil? && !@keyword.nil?
87
- $log.info notice
88
- client = TweetStream::Client.new
89
- client.on_anything(&@any)
90
- client.on_error do |message|
91
- $log.info "twitter: unexpected error has occured. #{message}"
82
+ def handle_object(object)
83
+ if is_message?(object)
84
+ get_message(object)
92
85
  end
93
- return client
94
86
  end
95
87
 
96
- def is_message?(status)
97
- return false if !status.include?(:text)
98
- return false if !status.include?(:user)
99
- return false if (!@lang.nil? && @lang != '') && !@lang.include?(status[:user][:lang])
88
+ def is_message?(tweet)
89
+ return false if !tweet.is_a?(Twitter::Tweet)
90
+ return false if (!@lang.nil? && @lang != '') && !@lang.include?(tweet.user.lang)
100
91
  if @timeline == 'userstream' && (!@keyword.nil? && @keyword != '')
101
92
  pattern = NKF::nkf('-WwZ1', @keyword).gsub(/,\s?/, '|')
102
- tweet = NKF::nkf('-WwZ1', status[:text])
93
+ tweet = NKF::nkf('-WwZ1', tweet.text)
103
94
  return false if !Regexp.new(pattern, Regexp::IGNORECASE).match(tweet)
104
95
  end
105
96
  return true
106
97
  end
107
98
 
108
- def get_message(status)
99
+ def get_message(tweet)
109
100
  case @output_format
110
101
  when 'nest'
111
- record = hash_key_to_s(status)
102
+ record = hash_key_to_s(tweet.to_h)
112
103
  when 'flat'
113
- record = hash_flatten(status)
104
+ record = hash_flatten(tweet.to_h)
114
105
  when 'simple'
115
106
  record = Hash.new
116
- record.store('message', status[:text]).scrub('')
117
- record.store('coordinates', status[:coordinates])
118
- record.store('place', status[:place])
119
- record.store('created_at', status[:created_at])
120
- record.store('user_name', status[:user][:name])
121
- record.store('user_screen_name', status[:user][:screen_name])
122
- record.store('user_profile_image_url', status[:user][:profile_image_url])
123
- record.store('user_time_zone', status[:user][:time_zone])
124
- record.store('user_lang', status[:user][:lang])
107
+ record.store('message', tweet.text).scrub('')
108
+ record.store('geo', tweet.geo)
109
+ record.store('place', tweet.place)
110
+ record.store('created_at', tweet.created_at)
111
+ record.store('user_name', tweet.user.name)
112
+ record.store('user_screen_name', tweet.user.screen_name)
113
+ record.store('user_profile_image_url', tweet.user.profile_image_url)
114
+ record.store('user_time_zone', tweet.user.time_zone)
115
+ record.store('user_lang', tweet.user.lang)
125
116
  end
126
117
  router.emit(@tag, Engine.now, record)
127
118
  end
@@ -170,3 +161,12 @@ module Fluent
170
161
  end
171
162
  end
172
163
  end
164
+
165
+ # TODO: Remove this monkey patch after release new version of twitter gem
166
+ #
167
+ # See: https://github.com/sferik/twitter/pull/815
168
+ class Twitter::NullObject
169
+ def to_json(*args)
170
+ nil.to_json(*args)
171
+ end
172
+ end
data/test/helper.rb CHANGED
@@ -1,12 +1,4 @@
1
- require 'rubygems'
2
- require 'bundler'
3
- begin
4
- Bundler.setup(:default, :development)
5
- rescue Bundler::BundlerError => e
6
- $stderr.puts e.message
7
- $stderr.puts "Run `bundle install` to install missing gems"
8
- exit e.status_code
9
- end
1
+ require 'bundler/setup'
10
2
  require 'test/unit'
11
3
 
12
4
  $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
@@ -8,8 +8,8 @@ class TwitterInputTest < Test::Unit::TestCase
8
8
  CONFIG = %[
9
9
  consumer_key CONSUMER_KEY
10
10
  consumer_secret CONSUMER_SECRET
11
- oauth_token OAUTH_TOKEN
12
- oauth_token_secret OAUTH_TOKEN_SECRET
11
+ access_token ACCESS_TOKEN
12
+ access_token_secret ACCESS_TOKEN_SECRET
13
13
  tag input.twitter
14
14
  timeline sampling
15
15
  ]
@@ -25,16 +25,16 @@ class TwitterInputTest < Test::Unit::TestCase
25
25
  d = create_driver %[
26
26
  consumer_key CONSUMER_KEY
27
27
  consumer_secret CONSUMER_SECRET
28
- oauth_token OAUTH_TOKEN
29
- oauth_token_secret OAUTH_TOKEN_SECRET
28
+ access_token ACCESS_TOKEN
29
+ access_token_secret ACCESS_TOKEN_SECRET
30
30
  tag input.twitter
31
31
  timeline tracking
32
32
  keyword ${hashtag}fluentd,fluentd lang:ja
33
33
  ]
34
34
  assert_equal 'CONSUMER_KEY', d.instance.consumer_key
35
35
  assert_equal 'CONSUMER_SECRET', d.instance.consumer_secret
36
- assert_equal 'OAUTH_TOKEN', d.instance.oauth_token
37
- assert_equal 'OAUTH_TOKEN_SECRET', d.instance.oauth_token_secret
36
+ assert_equal 'ACCESS_TOKEN', d.instance.access_token
37
+ assert_equal 'ACCESS_TOKEN_SECRET', d.instance.access_token_secret
38
38
  assert_equal '#fluentd,fluentd lang:ja', d.instance.keyword
39
39
  end
40
40
 
@@ -45,16 +45,16 @@ class TwitterInputTest < Test::Unit::TestCase
45
45
  d = create_driver(%[
46
46
  consumer_key CONSUMER_KEY
47
47
  consumer_secret CONSUMER_SECRET
48
- oauth_token OAUTH_TOKEN
49
- oauth_token_secret OAUTH_TOKEN_SECRET
48
+ access_token ACCESS_TOKEN
49
+ access_token_secret ACCESS_TOKEN_SECRET
50
50
  tag input.twitter
51
51
  timeline tracking
52
52
  keyword 'treasuredata,treasure data,#treasuredata,fluentd,#fluentd'
53
53
  ], 'test', true)
54
54
  assert_equal 'CONSUMER_KEY', d.instance.consumer_key
55
55
  assert_equal 'CONSUMER_SECRET', d.instance.consumer_secret
56
- assert_equal 'OAUTH_TOKEN', d.instance.oauth_token
57
- assert_equal 'OAUTH_TOKEN_SECRET', d.instance.oauth_token_secret
56
+ assert_equal 'ACCESS_TOKEN', d.instance.access_token
57
+ assert_equal 'ACCESS_TOKEN_SECRET', d.instance.access_token_secret
58
58
  assert_equal 'treasuredata,treasure data,#treasuredata,fluentd,#fluentd', d.instance.keyword
59
59
  end
60
60
  end
metadata CHANGED
@@ -1,99 +1,124 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fluent-plugin-twitter
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.4
4
+ version: 0.6.0
5
+ prerelease:
5
6
  platform: ruby
6
7
  authors:
7
8
  - Kentaro Yoshida
8
9
  autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
- date: 2016-06-07 00:00:00.000000000 Z
12
+ date: 2017-02-27 00:00:00.000000000 Z
12
13
  dependencies:
13
14
  - !ruby/object:Gem::Dependency
14
15
  name: rake
15
16
  requirement: !ruby/object:Gem::Requirement
17
+ none: false
16
18
  requirements:
17
- - - ">="
19
+ - - ! '>='
18
20
  - !ruby/object:Gem::Version
19
21
  version: '0'
20
22
  type: :development
21
23
  prerelease: false
22
24
  version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
23
26
  requirements:
24
- - - ">="
27
+ - - ! '>='
25
28
  - !ruby/object:Gem::Version
26
29
  version: '0'
27
30
  - !ruby/object:Gem::Dependency
28
31
  name: test-unit
29
32
  requirement: !ruby/object:Gem::Requirement
33
+ none: false
30
34
  requirements:
31
- - - ">="
35
+ - - ! '>='
32
36
  - !ruby/object:Gem::Version
33
37
  version: 3.1.0
34
38
  type: :development
35
39
  prerelease: false
36
40
  version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
37
42
  requirements:
38
- - - ">="
43
+ - - ! '>='
39
44
  - !ruby/object:Gem::Version
40
45
  version: 3.1.0
41
46
  - !ruby/object:Gem::Dependency
42
47
  name: appraisal
43
48
  requirement: !ruby/object:Gem::Requirement
49
+ none: false
44
50
  requirements:
45
- - - ">="
51
+ - - ! '>='
46
52
  - !ruby/object:Gem::Version
47
53
  version: '0'
48
54
  type: :development
49
55
  prerelease: false
50
56
  version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
51
58
  requirements:
52
- - - ">="
59
+ - - ! '>='
53
60
  - !ruby/object:Gem::Version
54
61
  version: '0'
55
62
  - !ruby/object:Gem::Dependency
56
63
  name: fluentd
57
64
  requirement: !ruby/object:Gem::Requirement
65
+ none: false
58
66
  requirements:
59
- - - ">="
67
+ - - ! '>='
60
68
  - !ruby/object:Gem::Version
61
69
  version: 0.10.46
70
+ - - <
71
+ - !ruby/object:Gem::Version
72
+ version: '2'
62
73
  type: :runtime
63
74
  prerelease: false
64
75
  version_requirements: !ruby/object:Gem::Requirement
76
+ none: false
65
77
  requirements:
66
- - - ">="
78
+ - - ! '>='
67
79
  - !ruby/object:Gem::Version
68
80
  version: 0.10.46
81
+ - - <
82
+ - !ruby/object:Gem::Version
83
+ version: '2'
69
84
  - !ruby/object:Gem::Dependency
70
85
  name: twitter
71
86
  requirement: !ruby/object:Gem::Requirement
87
+ none: false
72
88
  requirements:
73
- - - ">="
89
+ - - ~>
74
90
  - !ruby/object:Gem::Version
75
- version: 5.0.0
91
+ version: '5.0'
76
92
  type: :runtime
77
93
  prerelease: false
78
94
  version_requirements: !ruby/object:Gem::Requirement
95
+ none: false
79
96
  requirements:
80
- - - ">="
97
+ - - ~>
81
98
  - !ruby/object:Gem::Version
82
- version: 5.0.0
99
+ version: '5.0'
83
100
  - !ruby/object:Gem::Dependency
84
- name: tweetstream
101
+ name: string-scrub
85
102
  requirement: !ruby/object:Gem::Requirement
103
+ none: false
86
104
  requirements:
87
- - - ">="
105
+ - - ! '>='
88
106
  - !ruby/object:Gem::Version
89
- version: 2.6.1
107
+ version: 0.0.3
108
+ - - <=
109
+ - !ruby/object:Gem::Version
110
+ version: 0.0.5
90
111
  type: :runtime
91
112
  prerelease: false
92
113
  version_requirements: !ruby/object:Gem::Requirement
114
+ none: false
93
115
  requirements:
94
- - - ">="
116
+ - - ! '>='
117
+ - !ruby/object:Gem::Version
118
+ version: 0.0.3
119
+ - - <=
95
120
  - !ruby/object:Gem::Version
96
- version: 2.6.1
121
+ version: 0.0.5
97
122
  description:
98
123
  email:
99
124
  - y.ken.studio@gmail.com
@@ -101,8 +126,8 @@ executables: []
101
126
  extensions: []
102
127
  extra_rdoc_files: []
103
128
  files:
104
- - ".gitignore"
105
- - ".travis.yml"
129
+ - .gitignore
130
+ - .travis.yml
106
131
  - Appraisals
107
132
  - Gemfile
108
133
  - LICENSE.txt
@@ -111,6 +136,7 @@ files:
111
136
  - fluent-plugin-twitter.gemspec
112
137
  - gemfiles/fluentd_v0.10.gemfile
113
138
  - gemfiles/fluentd_v0.12.gemfile
139
+ - gemfiles/fluentd_v0.14.gemfile
114
140
  - lib/fluent/plugin/in_twitter.rb
115
141
  - lib/fluent/plugin/out_twitter.rb
116
142
  - test/helper.rb
@@ -119,26 +145,27 @@ files:
119
145
  homepage: https://github.com/y-ken/fluent-plugin-twitter
120
146
  licenses:
121
147
  - Apache-2.0
122
- metadata: {}
123
148
  post_install_message:
124
149
  rdoc_options: []
125
150
  require_paths:
126
151
  - lib
127
152
  required_ruby_version: !ruby/object:Gem::Requirement
153
+ none: false
128
154
  requirements:
129
- - - ">="
155
+ - - ! '>='
130
156
  - !ruby/object:Gem::Version
131
157
  version: '0'
132
158
  required_rubygems_version: !ruby/object:Gem::Requirement
159
+ none: false
133
160
  requirements:
134
- - - ">="
161
+ - - ! '>='
135
162
  - !ruby/object:Gem::Version
136
163
  version: '0'
137
164
  requirements: []
138
165
  rubyforge_project:
139
- rubygems_version: 2.4.5
166
+ rubygems_version: 1.8.23
140
167
  signing_key:
141
- specification_version: 4
168
+ specification_version: 3
142
169
  summary: Fluentd Input/Output plugin to collect/process tweets with Twitter Streaming
143
170
  API.
144
171
  test_files:
checksums.yaml DELETED
@@ -1,7 +0,0 @@
1
- ---
2
- SHA1:
3
- metadata.gz: 8085b7a29724df994e46bccf4c1c69751820e187
4
- data.tar.gz: 62930fb36628f16d9a179c3704ace0ef1e515cb5
5
- SHA512:
6
- metadata.gz: 5fbb52eab855d47e897d8dc9c8ff2b8df9b856e392057c8bcf2fe775e7b7a2d7a23be803252abec70435e116a8ad355b68a75cc8a1942b22e300d93943457e52
7
- data.tar.gz: 7bcdf380a5c0d8d737adc78dcd8b7ea1c42424f6334676085c9a96e57d2ca374a84c2b8e8ab8eb6489c63c08dcaab6af2512d243f40aa13d906a91f701856bc9