marvel_explorer 0.2.2
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 +7 -0
- data/.gitignore +16 -0
- data/.rspec +3 -0
- data/.travis.yml +7 -0
- data/Gemfile +4 -0
- data/Guardfile +38 -0
- data/LICENSE.md +22 -0
- data/LICENSE.txt +22 -0
- data/README.md +48 -0
- data/Rakefile +7 -0
- data/bin/marvel_explorer +4 -0
- data/config/defaults.yml +2 -0
- data/config.yml +3 -0
- data/lib/marvel_explorer/characters.rb +39 -0
- data/lib/marvel_explorer/cli.rb +62 -0
- data/lib/marvel_explorer/comic.rb +19 -0
- data/lib/marvel_explorer/explorer.rb +23 -0
- data/lib/marvel_explorer/git.rb +19 -0
- data/lib/marvel_explorer/helpers.rb +17 -0
- data/lib/marvel_explorer/rankings.rb +29 -0
- data/lib/marvel_explorer/twitter.rb +29 -0
- data/lib/marvel_explorer/version.rb +3 -0
- data/lib/marvel_explorer/yamlise.rb +76 -0
- data/lib/marvel_explorer.rb +19 -0
- data/marvel_explorer.gemspec +35 -0
- data/spec/cassettes/MarvelExplorer_Explorer/should_extract_the_year_correctly.yml +136 -0
- data/spec/cassettes/MarvelExplorer_Explorer/should_generate_a_commit_message.yml +255 -0
- data/spec/cassettes/MarvelExplorer_Explorer/should_generate_a_tweet_message.yml +255 -0
- data/spec/cassettes/MarvelExplorer_Explorer/should_generate_correct_yaml.yml +255 -0
- data/spec/cassettes/MarvelExplorer_Explorer/should_get_the_default_start_character.yml +255 -0
- data/spec/cassettes/MarvelExplorer_Explorer/should_get_the_end_character_from_the_comic.yml +255 -0
- data/spec/cassettes/MarvelExplorer_Explorer/should_load_the_stored_character.yml +255 -0
- data/spec/cassettes/MarvelExplorer_Explorer/should_save_the_end_character.yml +255 -0
- data/spec/cassettes/MarvelExplorer_Explorer/should_select_a_comic_for_the_start_character.yml +255 -0
- data/spec/characters_spec.rb +52 -0
- data/spec/explorer_spec.rb +20 -0
- data/spec/fixtures/double-shot-characters.json +2278 -0
- data/spec/fixtures/hulk_comics.json +1 -0
- data/spec/fixtures/last.character +7 -0
- data/spec/fixtures/spider-man.json +1 -0
- data/spec/fixtures/viper.json +1 -0
- data/spec/git_spec.rb +24 -0
- data/spec/rankings_spec.rb +59 -0
- data/spec/spec_helper.rb +98 -0
- data/spec/support/vcr_setup.rb +18 -0
- data/spec/tweet_spec.rb +24 -0
- data/spec/yaml_spec.rb +38 -0
- metadata +295 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA1:
|
|
3
|
+
metadata.gz: a91887bcc6d75c99bab07490edfd98e2e71c53e1
|
|
4
|
+
data.tar.gz: c1c0f0805b44f255cf071e282097ae5e124a5c37
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: b58a35a38ea4a0d75eaa0e78e3477ea95ed4909175bec1508dc2d0beb9f8bf50bb9fe79228fed3a6f1c3fcedb66c18f81ef86430bc229d1fc1a615ca9ad3b341
|
|
7
|
+
data.tar.gz: 37e665477ce26413032408f0e4da963831fa1f0b4f77fb315e3790c906948471ac2c86e968ac435a239ee1be36b82c468887b26ba43314590d473bc6704434bb
|
data/.gitignore
ADDED
data/.rspec
ADDED
data/.travis.yml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
language: ruby
|
|
2
|
+
rvm:
|
|
3
|
+
- 2.1.5
|
|
4
|
+
env:
|
|
5
|
+
global:
|
|
6
|
+
- secure: ee8FFvq5vaDa0lZYgvFn5fZ+w+Rt2dnQcsBz/5daZY4pm42iAyxcESnjfr0ViUNDzRxaiBDz8RkcIoeAKalsr9uzTUrsHY5X/B/gji4tzYkDNjE7uLEaA50NJ+EU3tY9eeuNwLOIKH1jNXt5i7DEwwpmognFCf0wxFsoITM2NOo=
|
|
7
|
+
- secure: VBv4y36Vbkg8RVFxq15xkVrpPk1efCKo24PtW7J4HKoD1MR8isll3/ECI/HmnIJIlpLz/U4Uu2WptUrfjX+d1X5xN/dYwoUewdrBbnG0p5aWggSCIJhS15efLkvoRRAHvm7j4mtwqXwTPT/QBm3wjW1Sea6mfMnYTUZ+VWvSGqE=
|
data/Gemfile
ADDED
data/Guardfile
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# A sample Guardfile
|
|
2
|
+
# More info at https://github.com/guard/guard#readme
|
|
3
|
+
|
|
4
|
+
## Uncomment and set this to only include directories you want to watch
|
|
5
|
+
# directories %(app lib config test spec feature)
|
|
6
|
+
|
|
7
|
+
## Uncomment to clear the screen before every task
|
|
8
|
+
# clearing :on
|
|
9
|
+
|
|
10
|
+
# Note: The cmd option is now required due to the increasing number of ways
|
|
11
|
+
# rspec may be run, below are examples of the most common uses.
|
|
12
|
+
# * bundler: 'bundle exec rspec'
|
|
13
|
+
# * bundler binstubs: 'bin/rspec'
|
|
14
|
+
# * spring: 'bin/rsspec' (This will use spring if running and you have
|
|
15
|
+
# installed the spring binstubs per the docs)
|
|
16
|
+
# * zeus: 'zeus rspec' (requires the server to be started separetly)
|
|
17
|
+
# * 'just' rspec: 'rspec'
|
|
18
|
+
guard :rspec, cmd: 'bundle exec rspec' do
|
|
19
|
+
watch(%r{^spec/.+_spec\.rb$})
|
|
20
|
+
watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
|
|
21
|
+
watch('spec/spec_helper.rb') { "spec" }
|
|
22
|
+
|
|
23
|
+
# Rails example
|
|
24
|
+
watch(%r{^app/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
|
|
25
|
+
watch(%r{^app/(.*)(\.erb|\.haml|\.slim)$}) { |m| "spec/#{m[1]}#{m[2]}_spec.rb" }
|
|
26
|
+
watch(%r{^app/controllers/(.+)_(controller)\.rb$}) { |m| ["spec/routing/#{m[1]}_routing_spec.rb", "spec/#{m[2]}s/#{m[1]}_#{m[2]}_spec.rb", "spec/acceptance/#{m[1]}_spec.rb"] }
|
|
27
|
+
watch(%r{^spec/support/(.+)\.rb$}) { "spec" }
|
|
28
|
+
watch('config/routes.rb') { "spec/routing" }
|
|
29
|
+
watch('app/controllers/application_controller.rb') { "spec/controllers" }
|
|
30
|
+
watch('spec/rails_helper.rb') { "spec" }
|
|
31
|
+
|
|
32
|
+
# Capybara features specs
|
|
33
|
+
watch(%r{^app/views/(.+)/.*\.(erb|haml|slim)$}) { |m| "spec/features/#{m[1]}_spec.rb" }
|
|
34
|
+
|
|
35
|
+
# Turnip features and steps
|
|
36
|
+
watch(%r{^spec/acceptance/(.+)\.feature$})
|
|
37
|
+
watch(%r{^spec/acceptance/steps/(.+)_steps\.rb$}) { |m| Dir[File.join("**/#{m[1]}.feature")][0] || 'spec/acceptance' }
|
|
38
|
+
end
|
data/LICENSE.md
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
##Copyright (c) 2014 Sam Pikesley
|
|
2
|
+
|
|
3
|
+
#MIT License
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
|
6
|
+
a copy of this software and associated documentation files (the
|
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
|
11
|
+
the following conditions:
|
|
12
|
+
|
|
13
|
+
The above copyright notice and this permission notice shall be
|
|
14
|
+
included in all copies or substantial portions of the Software.
|
|
15
|
+
|
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/LICENSE.txt
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
##Copyright (c) 2014 Sam Pikesley
|
|
2
|
+
|
|
3
|
+
#MIT License
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
|
6
|
+
a copy of this software and associated documentation files (the
|
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
|
11
|
+
the following conditions:
|
|
12
|
+
|
|
13
|
+
The above copyright notice and this permission notice shall be
|
|
14
|
+
included in all copies or substantial portions of the Software.
|
|
15
|
+
|
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
[](https://travis-ci.org/marvelexplorer/marvel_explorer)
|
|
2
|
+
[](https://gemnasium.com/marvelexplorer/marvel_explorer)
|
|
3
|
+
[](https://codeclimate.com/github/marvelexplorer/marvel_explorer)
|
|
4
|
+
[](https://rubygems.org/gems/marvel_explorer)
|
|
5
|
+
[](http://marvelexplorer.mit-license.org)
|
|
6
|
+
[](https://github.com/badges/badgerbadgerbadger)
|
|
7
|
+
|
|
8
|
+
# MarvelExplorer
|
|
9
|
+
|
|
10
|
+
Uses my [Ultron](http://pikesley.org/projects/ultron) gem to wander from character to character through the [Marvel Comics Data](http://developer.marvel.com/) and drive the [Twitter stream](https://twitter.com/marvel_explorer) and the [Website](http://marvelexplorer.github.io/). You need to set some things up in `~/.marvel_explorer/config.yml`:
|
|
11
|
+
|
|
12
|
+
twitter:
|
|
13
|
+
consumer:
|
|
14
|
+
key: a_key
|
|
15
|
+
secret: a_secret
|
|
16
|
+
oauth:
|
|
17
|
+
token: a_token
|
|
18
|
+
secret: a_nuvver_secret
|
|
19
|
+
|
|
20
|
+
marshal_file: /home/marvelexplorer/.marvel_explorer/last.character
|
|
21
|
+
jekyll_dir: /home/marvelexplorer/marvelexplorer.github.io/
|
|
22
|
+
|
|
23
|
+
You also need some [Ultron configuration](https://github.com/pikesley/ultron/blob/master/README.md) in `~/.ultronrc`:
|
|
24
|
+
|
|
25
|
+
PUBLIC_KEY: this_r_public_key
|
|
26
|
+
PRIVATE_KEY: this_one_r_private_key
|
|
27
|
+
|
|
28
|
+
Available commands are:
|
|
29
|
+
|
|
30
|
+
marvel_explorer update
|
|
31
|
+
|
|
32
|
+
Gets the next iteration of '_Character A_ appeared in _Comic_ with _Character B_'. Writes YAML into `jekyll_dir` for use by my [Marvel Explorer Jekyll site](https://github.com/marvelexplorer/marvelexplorer.github.io)
|
|
33
|
+
|
|
34
|
+
marvel_explorer tweet
|
|
35
|
+
|
|
36
|
+
Generates and publishes a [Tweet](https://twitter.com/marvel_explorer)
|
|
37
|
+
|
|
38
|
+
marvel_explorer publish
|
|
39
|
+
|
|
40
|
+
Commits and pushes the Jekyll site to Github Pages
|
|
41
|
+
|
|
42
|
+
marvel_explorer ranking
|
|
43
|
+
|
|
44
|
+
Calculates most-featured-characters data, writes YAML for Jekyll site
|
|
45
|
+
|
|
46
|
+
marvel_explorer perform
|
|
47
|
+
|
|
48
|
+
All four of the above tasks
|
data/Rakefile
ADDED
data/bin/marvel_explorer
ADDED
data/config/defaults.yml
ADDED
data/config.yml
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
module MarvelExplorer
|
|
2
|
+
class Explorer
|
|
3
|
+
def start_character
|
|
4
|
+
@start_character ||= begin
|
|
5
|
+
File.open @config['marshal_file'] do |file|
|
|
6
|
+
Marshal.load file
|
|
7
|
+
end
|
|
8
|
+
rescue
|
|
9
|
+
Ultron::Characters.find @config['default_id']
|
|
10
|
+
ensure
|
|
11
|
+
true
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def end_character
|
|
16
|
+
@end_character ||= begin
|
|
17
|
+
characters = Ultron::Characters.by_comic comic.id
|
|
18
|
+
end_character = start_character
|
|
19
|
+
# we want a different character for the next iteration, obvs.
|
|
20
|
+
until end_character.id != start_character.id && MarvelExplorer.validate_character(end_character)
|
|
21
|
+
end_character = characters.sample
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
end_character
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def save
|
|
29
|
+
File.open @config['marshal_file'], 'w' do |file|
|
|
30
|
+
Marshal.dump end_character, file
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
FileUtils.mkdir_p @config['cache_dir']
|
|
34
|
+
File.open '%s/%d' % [ @config['cache_dir'], end_character[:id] ], 'w' do |file|
|
|
35
|
+
Marshal.dump end_character, file
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
require 'marvel_explorer'
|
|
2
|
+
|
|
3
|
+
module MarvelExplorer
|
|
4
|
+
class CLI < Thor
|
|
5
|
+
desc 'version', 'Print marvel_explorer version'
|
|
6
|
+
def version
|
|
7
|
+
puts 'marvel_explorer version %s' % [
|
|
8
|
+
VERSION
|
|
9
|
+
]
|
|
10
|
+
end
|
|
11
|
+
map %w(-v --version) => :version
|
|
12
|
+
|
|
13
|
+
desc 'update', 'Get the next iteration'
|
|
14
|
+
def update
|
|
15
|
+
@me = Explorer.new
|
|
16
|
+
@me.update
|
|
17
|
+
end
|
|
18
|
+
map %w(-u --update) => :update
|
|
19
|
+
|
|
20
|
+
desc 'tweet', 'Tweet the current iteration'
|
|
21
|
+
def tweet
|
|
22
|
+
@me = Explorer.new
|
|
23
|
+
@me.tweet
|
|
24
|
+
end
|
|
25
|
+
map %w(-t --tweet) => :tweet
|
|
26
|
+
|
|
27
|
+
desc 'publish', 'Publish the current iteration to Github Pages'
|
|
28
|
+
def publish
|
|
29
|
+
@me = Explorer.new
|
|
30
|
+
@me.publish
|
|
31
|
+
end
|
|
32
|
+
map %w(-p --publish) => :publish
|
|
33
|
+
|
|
34
|
+
desc 'ranking', 'Calculate the most-featured-characters data'
|
|
35
|
+
method_option :commits,
|
|
36
|
+
type: :numeric,
|
|
37
|
+
default: 96,
|
|
38
|
+
desc: 'How many commits to rank over; 96 is 24 hours, 672 is 7 days',
|
|
39
|
+
aliases: '-c'
|
|
40
|
+
method_option :limit,
|
|
41
|
+
type: :numeric,
|
|
42
|
+
default: 5,
|
|
43
|
+
desc: 'Get top N rankings',
|
|
44
|
+
aliases: '-l'
|
|
45
|
+
|
|
46
|
+
def ranking
|
|
47
|
+
@me = Explorer.new
|
|
48
|
+
@me.record_rankings commits: options[:commits], limit: options[:limit]
|
|
49
|
+
end
|
|
50
|
+
map %w(-r --ranking) => :ranking
|
|
51
|
+
|
|
52
|
+
desc 'perform', 'Update, publish and tweet'
|
|
53
|
+
def perform
|
|
54
|
+
@me = Explorer.new
|
|
55
|
+
@me.update
|
|
56
|
+
@me.rankings commits: 96
|
|
57
|
+
@me.rankings commits: 672
|
|
58
|
+
@me.publish
|
|
59
|
+
@me.tweet
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
module MarvelExplorer
|
|
2
|
+
class Explorer
|
|
3
|
+
def comic
|
|
4
|
+
@comic ||= begin
|
|
5
|
+
comics = Ultron::Comics.by_character_and_vanilla_comics start_character.id
|
|
6
|
+
@comic = comics.sample
|
|
7
|
+
until MarvelExplorer.validate_comic @comic
|
|
8
|
+
@comic = comics.sample
|
|
9
|
+
end
|
|
10
|
+
@comic
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def series
|
|
15
|
+
@comic[:title] =~ /(.*) \((.*)\) #(.*)/
|
|
16
|
+
{ name: $1, period: $2 }
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
module MarvelExplorer
|
|
2
|
+
class Explorer
|
|
3
|
+
attr_accessor :config
|
|
4
|
+
|
|
5
|
+
def initialize config_file = "#{ENV['HOME']}/.marvel_explorer/config.yml"
|
|
6
|
+
@config = YAML.load(File.open(File.join(File.dirname(__FILE__), '..', '..', 'config/defaults.yml')))
|
|
7
|
+
@config.merge! YAML.load File.open config_file
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def update
|
|
11
|
+
yamlise
|
|
12
|
+
save
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def tweet
|
|
16
|
+
twitter_client.update tweet_message
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def publish
|
|
20
|
+
commit
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
module MarvelExplorer
|
|
2
|
+
class Explorer
|
|
3
|
+
def commit_message
|
|
4
|
+
'%s -> %s -> %s' % [
|
|
5
|
+
yamls['start']['name'],
|
|
6
|
+
yamls['comic']['series']['name'],
|
|
7
|
+
yamls['end']['name']
|
|
8
|
+
]
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def commit
|
|
12
|
+
g = Git.open @config['jekyll_dir']
|
|
13
|
+
|
|
14
|
+
g.add '.'
|
|
15
|
+
g.commit commit_message
|
|
16
|
+
g.push(g.remote('origin'))
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
module MarvelExplorer
|
|
2
|
+
def self.get_year comic
|
|
3
|
+
DateTime.parse(comic.dates.select { |d| d['type'] == 'onsaleDate' }[0]['date']).year
|
|
4
|
+
end
|
|
5
|
+
|
|
6
|
+
def self.validate_character character
|
|
7
|
+
character.thumbnail &&
|
|
8
|
+
character.thumbnail['path'] !~ /not_available/
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def self.validate_comic comic
|
|
12
|
+
comic.characters['available'] > 1 &&
|
|
13
|
+
MarvelExplorer.get_year(comic) > 1900 &&
|
|
14
|
+
comic.thumbnail &&
|
|
15
|
+
comic.thumbnail['path'] !~ /not_available/
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
module MarvelExplorer
|
|
2
|
+
class Explorer
|
|
3
|
+
def calculate_rankings params
|
|
4
|
+
params = { commits: 35040, repo: @config['jekyll_dir'], limit: 5 }.merge params
|
|
5
|
+
g = Git.open params[:repo]
|
|
6
|
+
|
|
7
|
+
counts = Hash.new(0)
|
|
8
|
+
|
|
9
|
+
g.log(params[:commits])
|
|
10
|
+
.select{ |c| c.message =~ /\->/ }
|
|
11
|
+
.map { |c| /(.*) -> (.*) -> (.*)/.match(c.message)[1] }
|
|
12
|
+
.each { |c| counts[c] += 1 }
|
|
13
|
+
|
|
14
|
+
counts.sort_by { |k, v| v }.reverse
|
|
15
|
+
.map { |k, v| { 'name' => k, 'score' => v } }[0...params[:limit]]
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def rankings params = {}
|
|
19
|
+
FileUtils.mkdir_p '%s/_data/' % @config['jekyll_dir']
|
|
20
|
+
y = File.open '%s/_data/rankings_%d.yml' % [
|
|
21
|
+
@config['jekyll_dir'],
|
|
22
|
+
params[:commits],
|
|
23
|
+
], 'w'
|
|
24
|
+
|
|
25
|
+
y.write calculate_rankings(params).to_yaml
|
|
26
|
+
y.close
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
module MarvelExplorer
|
|
2
|
+
class Explorer
|
|
3
|
+
def twitter_client
|
|
4
|
+
twitter_config = {
|
|
5
|
+
consumer_key: @config['twitter']['consumer']['key'],
|
|
6
|
+
consumer_secret: @config['twitter']['consumer']['secret'],
|
|
7
|
+
access_token: @config['twitter']['oauth']['token'],
|
|
8
|
+
access_token_secret: @config['twitter']['oauth']['secret']
|
|
9
|
+
}
|
|
10
|
+
Twitter::REST::Client.new(twitter_config)
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def tweet_message
|
|
14
|
+
tm = 'In %s, %s appeared in %s #%s with %s' % [
|
|
15
|
+
yamls['comic']['year'],
|
|
16
|
+
yamls['start']['name'],
|
|
17
|
+
yamls['comic']['series']['name'],
|
|
18
|
+
yamls['comic']['issue'],
|
|
19
|
+
yamls['end']['name']
|
|
20
|
+
]
|
|
21
|
+
|
|
22
|
+
if tm.length > @config['tweet_length'].to_i
|
|
23
|
+
tm = '%s…' % s[0, @config['tweet_length'].to_i - 1]
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
tm
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
module MarvelExplorer
|
|
2
|
+
class Explorer
|
|
3
|
+
def yamlise_characters
|
|
4
|
+
[
|
|
5
|
+
'start',
|
|
6
|
+
'end'
|
|
7
|
+
].each do |c|
|
|
8
|
+
h = {
|
|
9
|
+
'name' => eval("#{c}_character[:name]"),
|
|
10
|
+
'description' => eval("#{c}_character[:description]"),
|
|
11
|
+
'url' => eval("#{c}_character[:urls][1]['url']"),
|
|
12
|
+
'image' => eval("#{c}_character[:thumbnail]")
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
write_yaml h, c
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def yamlise_comic
|
|
20
|
+
h = {
|
|
21
|
+
'date' => comic[:dates][0]['date'],
|
|
22
|
+
'year' => Date.parse(comic[:dates][0]['date']).strftime('%Y'),
|
|
23
|
+
'title' => comic[:title],
|
|
24
|
+
'issue' => comic[:issueNumber],
|
|
25
|
+
'series' => {
|
|
26
|
+
'period' => series[:period],
|
|
27
|
+
'name' => series[:name]
|
|
28
|
+
},
|
|
29
|
+
'url' => comic[:urls][0]['url'],
|
|
30
|
+
'image' => comic[:thumbnail]
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
write_yaml h, 'comic'
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def write_yaml h, path
|
|
37
|
+
FileUtils.mkdir_p '%s/_data/' % @config['jekyll_dir']
|
|
38
|
+
y = File.open '%s/_data/%s.yml' % [
|
|
39
|
+
@config['jekyll_dir'],
|
|
40
|
+
path
|
|
41
|
+
], 'w'
|
|
42
|
+
y.write h.to_yaml
|
|
43
|
+
y.close
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def yamlise
|
|
47
|
+
FileUtils.mkdir_p '%s/_data' % @config['jekyll_dir']
|
|
48
|
+
%w{ comic characters }.each do |item|
|
|
49
|
+
eval "yamlise_#{item}"
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def yamls
|
|
54
|
+
@yamls ||= begin
|
|
55
|
+
yamls = {}
|
|
56
|
+
%w{ start end comic }.each do |thing|
|
|
57
|
+
begin
|
|
58
|
+
file = File.open '%s/_data/%s.yml' % [
|
|
59
|
+
@config['jekyll_dir'],
|
|
60
|
+
thing
|
|
61
|
+
]
|
|
62
|
+
rescue Exception
|
|
63
|
+
update
|
|
64
|
+
file = File.open '%s/_data/%s.yml' % [
|
|
65
|
+
@config['jekyll_dir'],
|
|
66
|
+
thing
|
|
67
|
+
]
|
|
68
|
+
end
|
|
69
|
+
y = YAML.load file
|
|
70
|
+
yamls[thing] = y
|
|
71
|
+
end
|
|
72
|
+
yamls
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
require 'date'
|
|
2
|
+
require 'twitter'
|
|
3
|
+
require 'ultron'
|
|
4
|
+
require 'yaml'
|
|
5
|
+
require 'dotenv'
|
|
6
|
+
require 'fileutils'
|
|
7
|
+
require 'date'
|
|
8
|
+
require 'thor'
|
|
9
|
+
require 'git'
|
|
10
|
+
|
|
11
|
+
require 'marvel_explorer/helpers'
|
|
12
|
+
require 'marvel_explorer/characters'
|
|
13
|
+
require 'marvel_explorer/comic'
|
|
14
|
+
require 'marvel_explorer/explorer'
|
|
15
|
+
require 'marvel_explorer/twitter'
|
|
16
|
+
require 'marvel_explorer/rankings'
|
|
17
|
+
require 'marvel_explorer/git'
|
|
18
|
+
require 'marvel_explorer/yamlise'
|
|
19
|
+
require 'marvel_explorer/version'
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# coding: utf-8
|
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
|
+
require 'marvel_explorer/version'
|
|
5
|
+
|
|
6
|
+
Gem::Specification.new do |spec|
|
|
7
|
+
spec.name = 'marvel_explorer'
|
|
8
|
+
spec.version = MarvelExplorer::VERSION
|
|
9
|
+
spec.authors = ['pikesley']
|
|
10
|
+
spec.email = ['sam@pikesley.org']
|
|
11
|
+
spec.summary = %q{Wander around the Marvel Comics data}
|
|
12
|
+
spec.description = %q{}
|
|
13
|
+
spec.homepage = 'http://sam.pikesley.org/projects/marvel-explorer/'
|
|
14
|
+
spec.license = 'MIT'
|
|
15
|
+
|
|
16
|
+
spec.files = `git ls-files -z`.split("\x0")
|
|
17
|
+
spec.executables = 'marvel_explorer'
|
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
|
19
|
+
spec.require_paths = ['lib']
|
|
20
|
+
|
|
21
|
+
spec.add_dependency 'ultron', '~> 0.2'
|
|
22
|
+
spec.add_dependency 'twitter', '~> 5.13'
|
|
23
|
+
spec.add_dependency 'dotenv', '~> 0.11'
|
|
24
|
+
spec.add_dependency 'git', '~> 1.2'
|
|
25
|
+
spec.add_dependency 'thor', '~> 0.19m '
|
|
26
|
+
|
|
27
|
+
spec.add_development_dependency 'bundler', '~> 1.7'
|
|
28
|
+
spec.add_development_dependency 'rake', '~> 10.0'
|
|
29
|
+
spec.add_development_dependency 'rspec', '~> 3.1'
|
|
30
|
+
spec.add_development_dependency 'guard-rspec', '~> 4.4'
|
|
31
|
+
spec.add_development_dependency 'terminal-notifier-guard'
|
|
32
|
+
spec.add_development_dependency 'vcr', '~> 2.9'
|
|
33
|
+
spec.add_development_dependency 'webmock', '~> 1.20'
|
|
34
|
+
spec.add_development_dependency 'timecop', '~> 0.7'
|
|
35
|
+
end
|