fluent-plugin-twitter 0.5.4 → 0.6.0

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.
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