fccc 0.1.2

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: 79bc017cdb587c605747522ec0b5f1986b61b511
4
+ data.tar.gz: a2dd7933534c9859a4760a29c381bd49137e0e86
5
+ SHA512:
6
+ metadata.gz: bc62dcfc92434dc2da86ed4961879c73ba360a035c88a560d3b511edda582baf5b0a0ca0f50fc6506377deb77c6a2f42a6eaea7ec287b94d5e2b2699fa8b05ce
7
+ data.tar.gz: 1d432d0108f552faa6231a78e3a546110c542855aa0d5d14a038c3082376540f52a618cd5aa6e7ebca084c0592c53cd7935845c08d290c34fe507d058b179fe4
data/.gitignore ADDED
@@ -0,0 +1,113 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/
9
+ Rakefile
10
+ LiCENSE.txt
11
+ /spec/reports/
12
+ /tmp/
13
+ *.jpg
14
+ .rspec
15
+ .travis.yml
16
+ /release/
17
+ credentials.yml
18
+
19
+ # Created by https://www.gitignore.io/api/vim,ruby,osx
20
+
21
+ ### Vim ###
22
+ # swap
23
+ [._]*.s[a-w][a-z]
24
+ [._]s[a-w][a-z]
25
+ # session
26
+ Session.vim
27
+ # temporary
28
+ .netrwhist
29
+ *~
30
+ # auto-generated tag files
31
+ tags
32
+
33
+
34
+ ### Ruby ###
35
+ *.gem
36
+ *.rbc
37
+ /.config
38
+ /coverage/
39
+ /InstalledFiles
40
+ /pkg/
41
+ /spec/reports/
42
+ /spec/examples.txt
43
+ /test/tmp/
44
+ /test/version_tmp/
45
+ /tmp/
46
+
47
+ # Used by dotenv library to load environment variables.
48
+ # .env
49
+
50
+ ## Specific to RubyMotion:
51
+ .dat*
52
+ .repl_history
53
+ build/
54
+ *.bridgesupport
55
+ build-iPhoneOS/
56
+ build-iPhoneSimulator/
57
+
58
+ ## Specific to RubyMotion (use of CocoaPods):
59
+ #
60
+ # We recommend against adding the Pods directory to your .gitignore. However
61
+ # you should judge for yourself, the pros and cons are mentioned at:
62
+ # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
63
+ #
64
+ # vendor/Pods/
65
+
66
+ ## Documentation cache and generated files:
67
+ /.yardoc/
68
+ /_yardoc/
69
+ /doc/
70
+ /rdoc/
71
+
72
+ ## Environment normalization:
73
+ /.bundle/
74
+ /vendor/bundle
75
+ /lib/bundler/man/
76
+
77
+ # for a library or gem, you might want to ignore these files since the code is
78
+ # intended to run in multiple environments; otherwise, check them in:
79
+ # Gemfile.lock
80
+ # .ruby-version
81
+ # .ruby-gemset
82
+
83
+ # unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
84
+ .rvmrc
85
+
86
+
87
+ ### OSX ###
88
+ *.DS_Store
89
+ .AppleDouble
90
+ .LSOverride
91
+
92
+ # Icon must end with two \r
93
+ Icon
94
+
95
+
96
+ # Thumbnails
97
+ ._*
98
+
99
+ # Files that might appear in the root of a volume
100
+ .DocumentRevisions-V100
101
+ .fseventsd
102
+ .Spotlight-V100
103
+ .TemporaryItems
104
+ .Trashes
105
+ .VolumeIcon.icns
106
+ .com.apple.timemachine.donotpresent
107
+
108
+ # Directories potentially created on remote AFP share
109
+ .AppleDB
110
+ .AppleDesktop
111
+ Network Trash Folder
112
+ Temporary Items
113
+ .apdisk
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 2.3.1
data/Gemfile ADDED
@@ -0,0 +1,9 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in fccc.gemspec
4
+ # gemspec
5
+
6
+ gem 'thor', '~> 0.19.1'
7
+ gem 'flickraw', '~> 0.9.8'
8
+ gem 'rmagick', '~> 2.15', '>= 2.15.4'
9
+ gem 'random-word', '~> 1.3'
data/README.md ADDED
@@ -0,0 +1,120 @@
1
+ # fccc - Flickr Collage Coding Challenge
2
+
3
+ [![Code Climate](https://codeclimate.com/github/AkihikoITOH/fccc/badges/gpa.svg)](https://codeclimate.com/github/AkihikoITOH/fccc)
4
+
5
+ ## Features
6
+
7
+ ### Basic
8
+ Ruby command line application that
9
+
10
+ * [x] accepts a list of search keywords as arguments
11
+ * [x] queries the Flickr API for the top-rated image for each keyword
12
+ * [x] downloads the results
13
+ * [x] crops them rectangularly
14
+ * [x] assembles a collage grid from ten images and
15
+ * [x] writes the result to a user-supplied filename
16
+ * [x] adds suffix to filename if user-supplied one already exists.
17
+ * [x] If given less than ten keywords, or if any keyword fails to result in a match, retrieves random words from a dictionary source and repeats as necessary until it has gathered ten images.
18
+
19
+ ### Additional features
20
+
21
+ * [x] Wrapped in a Gem and installable from Github repo.
22
+ * [x] You can provide keywords either as arguments or from a file.
23
+
24
+ ## Installation
25
+
26
+ ### Requirements
27
+
28
+ - Ruby `2.2.x` or `2.3.x`
29
+ * `apt-get install ruby ruby-dev` (Ubuntu)
30
+ - [ImageMagick](http://www.imagemagick.org/script/binary-releases.php)
31
+ * `brew install imagemagick && brew install pkg-config` (Mac OSX)
32
+ * `apt-get install imagemagick libmagickcore-dev libmagickwand-dev` (Ubuntu)
33
+ - [Bundler](http://bundler.io/)
34
+ * `gem install bundler`
35
+
36
+ ### Install fccc
37
+ There are three ways to install fccc:
38
+
39
+ - Install from Github (Recommended)
40
+ - Install locally
41
+ - Just as a Ruby script
42
+
43
+ #### Install from Github
44
+ First, create `Gemfile` in your current directory.
45
+ `Gemfile` should be like this.
46
+ ```ruby
47
+ # Gemfile
48
+ source 'https://rubygems.org'
49
+ gem 'fccc', :git => 'http://github.com/AkihikoITOH/fccc.git'
50
+ ```
51
+
52
+ Then, run
53
+ ```bash
54
+ $ bundle install
55
+ ```
56
+ to install fccc.
57
+
58
+ #### Install locally
59
+ You can also build gem and install it locally.
60
+ ```bash
61
+ $ git clone https://github.com/AkihikoITOH/fccc.git
62
+ $ cd fccc && gem build fccc.gemspec
63
+ $ gem install fccc-0.1.0.gem
64
+ ```
65
+
66
+ #### Just as a ruby script
67
+ You can also use fccc by simply downloading file from Github.
68
+ ```bash
69
+ $ git clone https://github.com/AkihikoITOH/fccc.git
70
+ $ cd fccc
71
+ $ ruby lib/fccc.rb
72
+ ```
73
+
74
+ ## Usage
75
+
76
+ First, you need to put `credentials.yml` containing `api_key` and `shared_secret` of Flickr API in your current directory(in which you will run `fccc` command).
77
+
78
+ `credentials.yml` should be like this.
79
+ ```yaml
80
+ api_key: yourapikeyhere
81
+ shared_secret: yoursecretkeyhere
82
+ ```
83
+
84
+ ```bash
85
+ # As a command line application
86
+ $ fccc collage [keyword1, keyword2, ..., keyword10] --output [output_filename]
87
+ # If it doesn't work, you can try another way
88
+ $ bundle exec fccc collage [keyword1, keyword2, ..., keyword10] --output [output_filename]
89
+
90
+ # As a Ruby script
91
+ $ cd fccc/
92
+ $ ruby lib/fccc.rb collage keyword1, keyword2, ..., keyword10 --output filename
93
+ ```
94
+
95
+ ### Example
96
+ ```bash
97
+ # Basic
98
+ $ fccc collage dog, cat, lion, tiger, beetle, bee, salmon, mackerel, Kyoto, Hamburg --output mycollage
99
+
100
+ # If you have a list of keywords in a file, you can use it as input instead of giving them as arguments.
101
+ $ fccc collage --input keywords.txt --credential credentials.yml --output mycollage
102
+ ```
103
+
104
+ `keywords.txt` should be like this.
105
+ ```
106
+ dog
107
+ cat
108
+ lion
109
+ tiger
110
+ beetle
111
+ bee
112
+ salmon
113
+ mackerel
114
+ Kyoto
115
+ Hamburg
116
+ ```
117
+
118
+ ## License
119
+
120
+ The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "fccc"
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/fccc ADDED
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env ruby -wU
2
+ # -*- encoding: utf-8 -*-
3
+
4
+ require 'fccc'
data/bin/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
data/exe/fccc ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "fccc"
data/fccc.gemspec ADDED
@@ -0,0 +1,38 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'fccc/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "fccc"
8
+ spec.version = Fccc::VERSION
9
+ spec.authors = ["Akihiko ITOH"]
10
+ spec.email = ["itoh@ai.soc.i.kyoto-u.ac.jp"]
11
+
12
+ spec.summary = "Search images on Flickr for given keywords and create a collage with them."
13
+ spec.description = "Description: Search images on Flickr for given keywords and create a collage with them."
14
+ spec.homepage = "https://github.com/AkihikoITOH/fccc"
15
+ spec.license = "MIT"
16
+
17
+ # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
18
+ # to allow pushing to a single host or delete this section to allow pushing to any host.
19
+ # if spec.respond_to?(:metadata)
20
+ # spec.metadata['allowed_push_host'] = "https://rubygems.org"
21
+ # else
22
+ # raise "RubyGems 2.0 or newer is required to protect against public gem pushes."
23
+ # end
24
+
25
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
26
+ spec.bindir = "exe"
27
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
28
+ spec.require_paths = ["lib"]
29
+
30
+ spec.add_development_dependency "bundler", "~> 1.12"
31
+ spec.add_development_dependency "rake", "~> 10.0"
32
+ spec.add_development_dependency "rspec", "~> 3.0"
33
+
34
+ spec.add_dependency "thor", "~> 0.19.1"
35
+ spec.add_dependency "flickraw", "~> 0.9.8"
36
+ spec.add_dependency "rmagick", "~> 2.15", ">= 2.15.4"
37
+ spec.add_dependency "random-word", "~> 1.3"
38
+ end
data/keywords.txt ADDED
@@ -0,0 +1,10 @@
1
+ dog
2
+ cat
3
+ lion
4
+ tiger
5
+ beetle
6
+ bee
7
+ salmon
8
+ mackerel
9
+ Kyoto
10
+ Hamburg
data/lib/fccc.rb ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env ruby
2
+ # -*- encoding: utf-8 -*-
3
+
4
+ $:.unshift File.dirname(__FILE__)
5
+ require 'fccc/version'
6
+ require 'fccc/cli'
7
+
8
+ Fccc::CLI.start(ARGV)
data/lib/fccc/cli.rb ADDED
@@ -0,0 +1,54 @@
1
+ #!/usr/bin/env ruby
2
+ # -*- encoding: utf-8 -*-
3
+
4
+ $:.unshift File.dirname(__FILE__)
5
+ require 'time'
6
+ require 'thor'
7
+ require 'utils'
8
+
9
+ SMALL_WIDTH = 160
10
+ SMALL_HEIGHT = 160
11
+ COLLAGE_WIDTH = 5
12
+ COLLAGE_HEIGHT = 2
13
+ NUM_KEYWORDS = 10 # Expected number of keywords
14
+
15
+ module Fccc
16
+ class CLI < Thor
17
+ desc "collage keyword1, keyword2, ..., keyword#{NUM_KEYWORDS}", "This will search a top-rated image for each keyword and create collage with them."
18
+ option :output
19
+ option :input
20
+ def collage(*keywords)
21
+ collage = Utils::Collage.new(SMALL_WIDTH, SMALL_HEIGHT, COLLAGE_WIDTH, COLLAGE_HEIGHT, NUM_KEYWORDS)
22
+ if !options[:input].nil?
23
+ # Get keywords from a file
24
+ keywords = File.readlines(File.join(Dir.pwd, "#{options[:input]}")).map do |line|
25
+ line.strip if line.strip != ""
26
+ end
27
+ end
28
+ # Clean up keywords
29
+ keywords = keywords.map do |kw|
30
+ kw.gsub(/[,]/ ,"").strip
31
+ end
32
+ # Force resize keywords array.
33
+ # If it has more than NUM_KEYWORDS elements, just ignore extra elements.
34
+ # If it has less than NUM_KEYWORDS elements, fill the rest with nil.
35
+ keywords = Array.new(NUM_KEYWORDS).zip(keywords).map(&:last)
36
+ # Download images
37
+ collage.download_images_by_keywords(keywords)
38
+ # Create and save collage
39
+ output = options[:output]
40
+ if output.nil?
41
+ # Default filename with timestamp
42
+ output_file = File.join(Dir.pwd, "collage-#{Time.now.utc.iso8601.gsub(/[:]/ ,"-")}.jpg")
43
+ else
44
+ # User-supplied filename
45
+ output_file = File.join(Dir.pwd, "#{output}.jpg")
46
+ while File.exist?(output_file) do
47
+ # Increment suffix if the file exists
48
+ output_file = Utils.increment_filename(output_file)
49
+ end
50
+ end
51
+ collage.create_collage(output_file)
52
+ end
53
+ end
54
+ end
data/lib/fccc/utils.rb ADDED
@@ -0,0 +1,79 @@
1
+ #!/usr/bin/env ruby
2
+ # -*- encoding: utf-8 -*-
3
+
4
+ require 'yaml'
5
+ require 'flickraw'
6
+ require 'rmagick'
7
+ require 'random-word'
8
+
9
+ CREDENTIALS_PATH = File.join(Dir.pwd, "credentials.yml")
10
+
11
+ module Utils
12
+ class Collage
13
+ def initialize(small_width, small_height, collage_width, collage_height, num_images)
14
+ # Size of each image in collage in pixel
15
+ @small_width = small_width
16
+ @small_height = small_height
17
+ # Number of columns and rows of a collage
18
+ @collage_width = collage_width
19
+ @collage_height = collage_height
20
+ @num_images = num_images
21
+ Utils.load_credentials(CREDENTIALS_PATH)
22
+ end
23
+
24
+ def download_images_by_keywords(keywords)
25
+ # Get image url for each keyword
26
+ img_urls = Array.new()
27
+ keywords.each do |kw|
28
+ # Apparently no image without keyword
29
+ kw.nil? ? img = nil : img = flickr.photos.search(text: kw, per_page: 1)[0]
30
+ while img.nil? do
31
+ # Randomly pick an English word and search top-rated image for the word
32
+ puts "*** Image for '#{kw}' not found. Trying a randomly picked word. ***"
33
+ kw = RandomWord.nouns.next.strip
34
+ img = flickr.photos.search(text: kw, per_page: 1)[0]
35
+ end
36
+ url = FlickRaw.url(img)
37
+ puts "Image for '#{kw}' => #{url}"
38
+ img_urls.push(url)
39
+ end
40
+ # Download images
41
+ puts "Downloading images..."
42
+ @images = img_urls.map do |url|
43
+ Magick::Image.read(url).first
44
+ end
45
+ end
46
+
47
+ def create_collage(output_path)
48
+ # Create collage
49
+ puts "Creating collage..."
50
+ # Prepare a base image
51
+ @collage = Magick::Image.new(@small_width * @collage_width, @small_height * @collage_height) do
52
+ self.background_color = "black"
53
+ end
54
+ # Add rectangularly resized images to the base image
55
+ @images.each_with_index do |img, idx|
56
+ @collage.composite!(img.resize_to_fill!(@small_width, @small_height),
57
+ @small_width * (idx % @collage_width),
58
+ @small_height * (idx / @collage_width),
59
+ Magick::OverCompositeOp
60
+ )
61
+ end
62
+ # Save collage to a designated path
63
+ @collage.write(output_path)
64
+ puts "Collage saved to #{output_path} ."
65
+ end
66
+ end
67
+
68
+ def self.increment_filename(path)
69
+ _, filename, count, extension = *path.match(/(\A.*?)(?:_#(\d+))?(\.[^.]*)?\Z/)
70
+ count = (count || '0').to_i + 1
71
+ return "#{filename}_##{count}#{extension}"
72
+ end
73
+
74
+ def self.load_credentials(path)
75
+ credentials = YAML.load_file(path)
76
+ FlickRaw.api_key = credentials["api_key"]
77
+ FlickRaw.shared_secret = credentials["shared_secret"]
78
+ end
79
+ end
@@ -0,0 +1,3 @@
1
+ module Fccc
2
+ VERSION = "0.1.2"
3
+ end
metadata ADDED
@@ -0,0 +1,164 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: fccc
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.2
5
+ platform: ruby
6
+ authors:
7
+ - Akihiko ITOH
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2016-06-01 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.12'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.12'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '3.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '3.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: thor
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: 0.19.1
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: 0.19.1
69
+ - !ruby/object:Gem::Dependency
70
+ name: flickraw
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: 0.9.8
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: 0.9.8
83
+ - !ruby/object:Gem::Dependency
84
+ name: rmagick
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '2.15'
90
+ - - ">="
91
+ - !ruby/object:Gem::Version
92
+ version: 2.15.4
93
+ type: :runtime
94
+ prerelease: false
95
+ version_requirements: !ruby/object:Gem::Requirement
96
+ requirements:
97
+ - - "~>"
98
+ - !ruby/object:Gem::Version
99
+ version: '2.15'
100
+ - - ">="
101
+ - !ruby/object:Gem::Version
102
+ version: 2.15.4
103
+ - !ruby/object:Gem::Dependency
104
+ name: random-word
105
+ requirement: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - "~>"
108
+ - !ruby/object:Gem::Version
109
+ version: '1.3'
110
+ type: :runtime
111
+ prerelease: false
112
+ version_requirements: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - "~>"
115
+ - !ruby/object:Gem::Version
116
+ version: '1.3'
117
+ description: 'Description: Search images on Flickr for given keywords and create a
118
+ collage with them.'
119
+ email:
120
+ - itoh@ai.soc.i.kyoto-u.ac.jp
121
+ executables:
122
+ - fccc
123
+ extensions: []
124
+ extra_rdoc_files: []
125
+ files:
126
+ - ".gitignore"
127
+ - ".ruby-version"
128
+ - Gemfile
129
+ - README.md
130
+ - bin/console
131
+ - bin/fccc
132
+ - bin/setup
133
+ - exe/fccc
134
+ - fccc.gemspec
135
+ - keywords.txt
136
+ - lib/fccc.rb
137
+ - lib/fccc/cli.rb
138
+ - lib/fccc/utils.rb
139
+ - lib/fccc/version.rb
140
+ homepage: https://github.com/AkihikoITOH/fccc
141
+ licenses:
142
+ - MIT
143
+ metadata: {}
144
+ post_install_message:
145
+ rdoc_options: []
146
+ require_paths:
147
+ - lib
148
+ required_ruby_version: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ required_rubygems_version: !ruby/object:Gem::Requirement
154
+ requirements:
155
+ - - ">="
156
+ - !ruby/object:Gem::Version
157
+ version: '0'
158
+ requirements: []
159
+ rubyforge_project:
160
+ rubygems_version: 2.5.1
161
+ signing_key:
162
+ specification_version: 4
163
+ summary: Search images on Flickr for given keywords and create a collage with them.
164
+ test_files: []