alltweets 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 2b33d85e4ed86292378100467435ec3502def14c
4
+ data.tar.gz: 352d24d36477fe4fb6b72f74c077d080f7cae380
5
+ SHA512:
6
+ metadata.gz: f799b0cf67d8429fbb73c791ea3e310e601ff55d82ad20e02771f0547739bc1a3e0d5a555227ce9c0f8deb7fe72ac1082d679cd0333e4e7a91faf59d8f6217ab
7
+ data.tar.gz: a32d8e0c4f036f8ddc3924928be4126da85b541cf6452392e2a76aa5d873deaf7724b636b66d62fc64e60081bbab0589ab8018077f353f8b05b63a8b26da4131
data/.gitignore ADDED
@@ -0,0 +1,9 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --format documentation
2
+ --color
data/.travis.yml ADDED
@@ -0,0 +1,4 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.2.2
4
+ before_install: gem install bundler -v 1.10.6
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in alltweets.gemspec
4
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ The zlib license (Zlib)
2
+
3
+ Copyright (c) 2015 OTSUKA Tatsuya
4
+
5
+ This software is provided 'as-is', without any express or implied
6
+ warranty. In no event will the authors be held liable for any damages
7
+ arising from the use of this software.
8
+
9
+ Permission is granted to anyone to use this software for any purpose,
10
+ including commercial applications, and to alter it and redistribute it
11
+ freely, subject to the following restrictions:
12
+
13
+ 1. The origin of this software must not be misrepresented; you must not
14
+ claim that you wrote the original software. If you use this software
15
+ in a product, an acknowledgment in the product documentation would be
16
+ appreciated but is not required.
17
+
18
+ 2. Altered source versions must be plainly marked as such, and must not be
19
+ misrepresented as being the original software.
20
+
21
+ 3. This notice may not be removed or altered from any source
22
+ distribution.
data/README.md ADDED
@@ -0,0 +1,37 @@
1
+ # AllTweets
2
+
3
+ Downloads someone's all tweets.
4
+
5
+ ## Installation
6
+
7
+ ```
8
+ $ gem install alltweets
9
+ ```
10
+
11
+ ## Usage
12
+
13
+ ### Commands
14
+
15
+ * `alltweets <screen name>`: Download <screen name>'s all tweets.
16
+
17
+ ### Options
18
+
19
+ * `-r`, `--retweets`: Include retweets to output
20
+ * `-j`, `--json`: Download as JSON (default: YAML)
21
+ * `-h`, `--help`: Show help message
22
+
23
+ ### Example
24
+
25
+ * `alltweets tatzyr`: Download @tatzyr's all tweets.
26
+ * `alltweets -r tatzyr`: Download @tatzyr's all tweets including retweets.
27
+ * `alltweets -j tatzyr`: Download @tatzyr's all tweets as JSON.
28
+
29
+ ## Development
30
+
31
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment. Run `bundle exec alltweets` to use the gem in this directory, ignoring other installed copies of this gem.
32
+
33
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
34
+
35
+ ## Contributing
36
+
37
+ Bug reports and pull requests are welcome on GitHub at https://github.com/Tatzyr/alltweets.
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
data/alltweets.gemspec ADDED
@@ -0,0 +1,30 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'alltweets/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "alltweets"
8
+ spec.version = AllTweets::VERSION
9
+ spec.authors = ["OTSUKA Tatsuya"]
10
+ spec.email = ["tatzyr@gmail.com"]
11
+
12
+ spec.summary = %q{Downloads someone's all tweets.}
13
+ spec.homepage = "https://github.com/Tatzyr/all_tweets"
14
+
15
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
16
+ spec.bindir = "exe"
17
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
18
+ spec.require_paths = ["lib"]
19
+
20
+ spec.add_dependency "colorize", "~> 0.7.7"
21
+ spec.add_dependency "launchy", "~> 2.4.3"
22
+ spec.add_dependency "oauth", "~> 0.4.7"
23
+ spec.add_dependency "oj", "~> 2.12.10"
24
+ spec.add_dependency "trollop", '~> 2.1.2'
25
+ spec.add_dependency "twitter", "~> 5.14.0"
26
+
27
+ spec.add_development_dependency "bundler", "~> 1.10"
28
+ spec.add_development_dependency "rake", "~> 10.0"
29
+ spec.add_development_dependency "rspec"
30
+ end
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "alltweets"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start
data/bin/setup ADDED
@@ -0,0 +1,7 @@
1
+ #!/bin/bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+
5
+ bundle install
6
+
7
+ # Do any other automated setup that you need to do here
data/exe/alltweets ADDED
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "alltweets"
4
+
5
+ AllTweets::CLI.new.run
@@ -0,0 +1,74 @@
1
+ require "colorize"
2
+ require "oj"
3
+ require "trollop"
4
+
5
+ module AllTweets
6
+ class CLI
7
+ def initialize
8
+ @screen_name, @opts = parse_args
9
+ @settings = Settings.new
10
+ update_access_token
11
+ @collector = Collector.new(
12
+ consumer_key: @settings.consumer_key,
13
+ consumer_secret: @settings.consumer_secret,
14
+ access_token: @settings.access_token,
15
+ access_token_secret: @settings.access_token_secret
16
+ )
17
+ @filename = filename
18
+ end
19
+
20
+ def run
21
+ puts "Saving #{@screen_name}'s all tweets to #{@filename}"
22
+ result = @collector.get_all_tweets(@screen_name, include_retweets: @opts[:retweets]).map(&:to_h)
23
+
24
+ if @opts[:json]
25
+ dump_data = Oj.dump(result, mode: :compat)
26
+ else
27
+ dump_data = YAML.dump(result)
28
+ end
29
+
30
+ open(filename, "w") do |f|
31
+ f.puts dump_data
32
+ end
33
+ rescue
34
+ puts "Error: #{$!}".colorize(:red)
35
+ end
36
+
37
+ private
38
+ def parse_args
39
+ opts = Trollop::options do
40
+ opt :retweets, "Include retweets to output"
41
+ opt :json, "Use JSON"
42
+ end
43
+ screen_name = ARGV.first
44
+ [screen_name, opts]
45
+ end
46
+
47
+ def update_access_token
48
+ unless @settings.exist?
49
+ consumer = OAuth::Consumer.new(
50
+ @settings.consumer_key,
51
+ @settings.consumer_secret,
52
+ site: "https://api.twitter.com"
53
+ )
54
+ request_token = consumer.get_request_token
55
+
56
+ puts "1) Open: #{request_token.authorize_url}".colorize(:cyan)
57
+ Launchy.open(request_token.authorize_url)
58
+
59
+ print "2) Enter the PIN: ".colorize(:cyan)
60
+ pin = $stdin.gets.strip
61
+
62
+ access_token = request_token.get_access_token(oauth_verifier: pin)
63
+
64
+ puts "Saving access token and access token secret to #{@settings.filename}"
65
+ @settings.add_access_tokens(access_token.token, access_token.secret)
66
+ end
67
+ end
68
+
69
+ def filename
70
+ ext = @opts[:json] ? ".json" : ".yml"
71
+ "alltweets_#{@screen_name}#{ext}"
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,28 @@
1
+ require "twitter"
2
+
3
+ module AllTweets
4
+ class Collector
5
+ def initialize(hash)
6
+ @client = Twitter::REST::Client.new(hash)
7
+ end
8
+
9
+ def get_all_tweets(user, include_retweets:)
10
+ collect_with_max_id do |max_id|
11
+ options = { count: 200, include_rts: include_retweets }
12
+ options[:max_id] = max_id unless max_id.nil?
13
+ @client.user_timeline(user, options)
14
+ end
15
+ end
16
+
17
+ private
18
+ def collect_with_max_id(collection=[], max_id = nil, &block)
19
+ response = yield(max_id)
20
+ collection += response
21
+ if response.empty?
22
+ collection.flatten
23
+ else
24
+ collect_with_max_id(collection, response.last.id - 1, &block)
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,48 @@
1
+ require "launchy"
2
+ require "oauth"
3
+ require "yaml"
4
+
5
+ module AllTweets
6
+ class Settings
7
+ INITIAL_SETTINGS = {
8
+ consumer_key: "dJHSlSiV3iuchF4UdXKxw",
9
+ consumer_secret: "y34Ftm34OJNoNO3wXlLujnq5aULaK5eRzDz1DnbjGQ",
10
+ }
11
+
12
+ def initialize(filename = File.expand_path('~/.alltweets'))
13
+ @filename = filename
14
+ @settings = load_file
15
+ end
16
+
17
+ attr_reader :filename
18
+
19
+ %i[consumer_key consumer_secret access_token access_token_secret].each do |name|
20
+ define_method(name) do
21
+ @settings[name]
22
+ end
23
+ end
24
+
25
+ def add_access_tokens(access_token, access_token_secret)
26
+ @settings[:access_token] = access_token
27
+ @settings[:access_token_secret] = access_token_secret
28
+ dump_file
29
+ end
30
+
31
+ def exist?
32
+ FileTest.exist?(@filename)
33
+ end
34
+
35
+ private
36
+ def load_file
37
+ return INITIAL_SETTINGS unless exist?
38
+
39
+ YAML.load_file(@filename)
40
+ end
41
+
42
+ def dump_file
43
+ open(@filename, "w") do |f|
44
+ YAML.dump(@settings, f)
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,3 @@
1
+ module AllTweets
2
+ VERSION = "0.1.0"
3
+ end
data/lib/alltweets.rb ADDED
@@ -0,0 +1,4 @@
1
+ require "alltweets/version"
2
+ require "alltweets/cli"
3
+ require "alltweets/collector"
4
+ require "alltweets/settings"
metadata ADDED
@@ -0,0 +1,186 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: alltweets
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - OTSUKA Tatsuya
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2015-07-29 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: colorize
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 0.7.7
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 0.7.7
27
+ - !ruby/object:Gem::Dependency
28
+ name: launchy
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 2.4.3
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 2.4.3
41
+ - !ruby/object:Gem::Dependency
42
+ name: oauth
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 0.4.7
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 0.4.7
55
+ - !ruby/object:Gem::Dependency
56
+ name: oj
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: 2.12.10
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: 2.12.10
69
+ - !ruby/object:Gem::Dependency
70
+ name: trollop
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: 2.1.2
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: 2.1.2
83
+ - !ruby/object:Gem::Dependency
84
+ name: twitter
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: 5.14.0
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: 5.14.0
97
+ - !ruby/object:Gem::Dependency
98
+ name: bundler
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '1.10'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '1.10'
111
+ - !ruby/object:Gem::Dependency
112
+ name: rake
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '10.0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '10.0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: rspec
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ description:
140
+ email:
141
+ - tatzyr@gmail.com
142
+ executables:
143
+ - alltweets
144
+ extensions: []
145
+ extra_rdoc_files: []
146
+ files:
147
+ - ".gitignore"
148
+ - ".rspec"
149
+ - ".travis.yml"
150
+ - Gemfile
151
+ - LICENSE
152
+ - README.md
153
+ - Rakefile
154
+ - alltweets.gemspec
155
+ - bin/console
156
+ - bin/setup
157
+ - exe/alltweets
158
+ - lib/alltweets.rb
159
+ - lib/alltweets/cli.rb
160
+ - lib/alltweets/collector.rb
161
+ - lib/alltweets/settings.rb
162
+ - lib/alltweets/version.rb
163
+ homepage: https://github.com/Tatzyr/all_tweets
164
+ licenses: []
165
+ metadata: {}
166
+ post_install_message:
167
+ rdoc_options: []
168
+ require_paths:
169
+ - lib
170
+ required_ruby_version: !ruby/object:Gem::Requirement
171
+ requirements:
172
+ - - ">="
173
+ - !ruby/object:Gem::Version
174
+ version: '0'
175
+ required_rubygems_version: !ruby/object:Gem::Requirement
176
+ requirements:
177
+ - - ">="
178
+ - !ruby/object:Gem::Version
179
+ version: '0'
180
+ requirements: []
181
+ rubyforge_project:
182
+ rubygems_version: 2.4.8
183
+ signing_key:
184
+ specification_version: 4
185
+ summary: Downloads someone's all tweets.
186
+ test_files: []