ramesh 1.0.0 → 1.1.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4f4924a2a9862be2453eca7cd904ad030f40bffe
4
- data.tar.gz: fe489d0e70553bfd27d05d11fe474e1ded0cd5f5
3
+ metadata.gz: 864cf2072c0d6e2fadf44f5f5bf45bca20b02ee4
4
+ data.tar.gz: cebbb43a3842d404dd8a9f86b6e79f7a1aac9414
5
5
  SHA512:
6
- metadata.gz: 799120642973f40dd8f9a8f16f87e441cfc8594597791ab96d87b268581da0ab177fc36c98b6a33b14713076880adfdfc4683b1227cf9dbb4ff3d23b79fb4c42
7
- data.tar.gz: 826e8a3ad52ed1626764350e67854e583567bda470a40480522be6325f391b9c530d4bce35877fbdfc49051f9ec8700db8e4dcbe0bf4b56cc021c7c8854a1e1a
6
+ metadata.gz: f9172e4821c9e2f94fc3738b8905a408dfe11d145a64a01841099bcea2a4cdc82aa9d59aa1c200df347cc0d9428d5a0075232bb9c42f8608994c1fb5e3aa0084
7
+ data.tar.gz: 8bed25633c866e135e3e26438fa14075c4afcda2fd0530cca94f5e869e53931503a76afcca3c58cefe1cddaa0d75c0d90fcf66fbe0f2db220c999442b9420c4e
data/.rspec CHANGED
@@ -1,2 +1,2 @@
1
1
  --color
2
- --format progress
2
+ --format doc
@@ -0,0 +1,5 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.3
4
+ - 2.0.0
5
+ - 2.1
data/README.md CHANGED
@@ -1,4 +1,7 @@
1
1
  # Ramesh
2
+ [![Build Status](https://travis-ci.org/dtan4/ramesh.svg?branch=master)](https://travis-ci.org/dtan4/ramesh)
3
+ [![Coverage Status](https://img.shields.io/coveralls/dtan4/ramesh.svg)](https://coveralls.io/r/dtan4/ramesh?branch=master)
4
+ [![Code Climate](https://codeclimate.com/github/dtan4/ramesh.png)](https://codeclimate.com/github/dtan4/ramesh)
2
5
 
3
6
  Command Line Tool for [東京アメッシュ (Tokyo-Amesh)](http://tokyo-ame.jwa.or.jp/)
4
7
 
data/Rakefile CHANGED
@@ -1 +1,7 @@
1
1
  require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
7
+
data/bin/ramesh CHANGED
@@ -1,36 +1,34 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- require 'optparse'
4
-
5
- $LOAD_PATH.unshift File.expand_path("../../lib", __FILE__)
3
+ require "optparse"
6
4
  require "ramesh"
7
5
 
8
6
  USAGE = <<-EOS
9
7
  Usage:
10
- ramesh download the latest image
11
- ramesh [0-120] download the image specified minutes before
12
- ramesh [0-120]-[0-120] download images within a specified range
13
- ramesh -h show this usage
8
+ ramesh [-d save_dir] download the latest image
9
+ ramesh [-d save_dir] 0-120 download the image specified minutes before
10
+ ramesh [-d save_dir] 0-120 0-120 download images within a specified range
11
+ ramesh -h, --help show this usage
14
12
  EOS
15
13
 
16
- client = Ramesh::Client.new
14
+ save_dir = Dir.pwd
17
15
 
18
- if ARGV.length == 0
19
- client.download_moment_image
16
+ parser = OptionParser.new(USAGE) do |opt|
17
+ opt.on("-d", "--dir=VAL", "Save directory (default: current directory)") { |val| save_dir = val }
18
+ end
20
19
 
21
- else
22
- if ARGV.include?('-h')
23
- puts USAGE
24
- exit
25
- end
20
+ argv = parser.parse(ARGV)
26
21
 
27
- arg = ARGV.shift
22
+ client = Ramesh::Client.new(Ramesh::Logger.new(STDOUT))
28
23
 
29
- if arg =~ /^(?:0|[1-9]\d*)$/
30
- client.download_moment_image(arg.to_i)
31
- elsif arg =~ /^(?:0|[1-9]\d*)-(?:0|[1-9]\d*)$/
32
- client.download_sequential_image(arg)
33
- else
34
- $stderr.puts USAGE
35
- end
24
+ case argv.length
25
+ when 0
26
+ client.download_image(save_dir)
27
+ when 1
28
+ client.download_image(save_dir, argv[0].to_i)
29
+ when 2
30
+ client.download_sequential_images(save_dir, argv[0].to_i, argv[1].to_i)
31
+ else
32
+ $stderr.puts USAGE
33
+ exit 1
36
34
  end
@@ -1,4 +1,4 @@
1
- require "ramesh/version"
2
- require "ramesh/util"
3
- require "ramesh/image_util"
4
1
  require "ramesh/client"
2
+ require "ramesh/image"
3
+ require "ramesh/logger"
4
+ require "ramesh/version"
@@ -1,45 +1,45 @@
1
1
  module Ramesh
2
2
  class Client
3
- include Util
4
- include ImageUtil
3
+ MESHES_INDEX_URL = "http://tokyo-ame.jwa.or.jp/scripts/mesh_index.js"
5
4
 
6
- def initialize
7
- @indexes = get_mesh_indexes
5
+ def initialize(logger)
6
+ @logger = logger
8
7
  end
9
8
 
10
- def download_sequential_image(minute_range)
11
- range = minute_range.split('-').map { |num| num.to_i }.sort
12
-
13
- unless range.length == 2
14
- $stderr.puts "error: invalid range"
15
- exit 1
9
+ def download_image(save_dir, minute = 0)
10
+ unless valid_minutes?(minute)
11
+ raise ArgumentError, "minutes must be a number; 0, 5, 10, ... 120"
16
12
  end
17
13
 
18
- range.each do |min|
19
- unless validate_minutes(min)
20
- $stderr.puts "error: minutes must be a number; 0, 5, 10, ... 120"
21
- exit 1
22
- end
23
- end
14
+ image_name = name_from_minute(minute)
15
+ image = Image.new(image_name)
16
+ image.save(save_dir, image_name)
24
17
 
25
- minute = range[0]
18
+ @logger.info("Downloaded: #{image_name}.jpg")
19
+ end
26
20
 
27
- while minute <= range[1]
28
- download_moment_image(minute)
29
- minute += 5
21
+ def download_sequential_images(save_dir, from, to)
22
+ unless valid_minutes?(from) && valid_minutes?(to)
23
+ raise ArgumentError, "minutes must be a number; 0, 5, 10, ... 120"
30
24
  end
31
- end
32
25
 
33
- def download_moment_image(minutes = 0)
34
- unless validate_minutes(minutes)
35
- $stderr.puts "error: minutes must be a number; 0, 5, 10, ... 120"
36
- exit 1
26
+ (from..to).step(5) do |minute|
27
+ download_image(save_dir, minute)
37
28
  end
29
+ end
38
30
 
39
- download_index = @indexes[minutes / 5]
40
- create_moment_image("#{download_index}.gif")
31
+ private
32
+
33
+ def meshes_index
34
+ @meshes_index ||= open(MESHES_INDEX_URL).read.gsub(/[^0-9,]/, "").split(",")
35
+ end
36
+
37
+ def name_from_minute(minute)
38
+ meshes_index[minute / 5]
39
+ end
41
40
 
42
- puts "Successfully downloaded: #{download_index}.gif"
41
+ def valid_minutes?(minutes)
42
+ (minutes >= 0) && (minutes <= 120) && (minutes % 5 == 0)
43
43
  end
44
44
  end
45
45
  end
@@ -0,0 +1,50 @@
1
+ require "RMagick"
2
+ require "open-uri"
3
+
4
+ module Ramesh
5
+ class Image
6
+ MESH_URL_BASE = "http://tokyo-ame.jwa.or.jp/mesh/000/"
7
+ BACKGROUND_IMAGE_URL = "http://tokyo-ame.jwa.or.jp/map/map000.jpg"
8
+ MASK_IMAGE_URL = "http://tokyo-ame.jwa.or.jp/map/msk000.png"
9
+
10
+ def self.background_image
11
+ download_image(BACKGROUND_IMAGE_URL)
12
+ end
13
+
14
+ def self.mask_image
15
+ download_image(MASK_IMAGE_URL)
16
+ end
17
+
18
+ def initialize(image_name,
19
+ background_image = self.class.background_image,
20
+ mask_image = self.class.mask_image)
21
+ image_list = [
22
+ background_image,
23
+ self.class.download_image(moment_image_url(image_name)),
24
+ mask_image
25
+ ]
26
+ @image = composite_images(image_list)
27
+ end
28
+
29
+ def save(save_dir, image_name)
30
+ save_path = File.join(save_dir, "#{image_name}.jpg")
31
+ @image.write(save_path)
32
+ end
33
+
34
+ private
35
+
36
+ def self.download_image(url)
37
+ Magick::Image.from_blob(open(url).read).shift
38
+ end
39
+
40
+ def moment_image_url(image_name)
41
+ "#{MESH_URL_BASE}#{image_name}.gif"
42
+ end
43
+
44
+ def composite_images(image_list)
45
+ image = image_list.shift
46
+ image_list.each { |layer| image = image.composite(layer, 0, 0, Magick::OverCompositeOp) }
47
+ image
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,11 @@
1
+ module Ramesh
2
+ class Logger
3
+ def initialize(output)
4
+ @output = output
5
+ end
6
+
7
+ def info(msg)
8
+ @output.puts msg
9
+ end
10
+ end
11
+ end
@@ -1,3 +1,3 @@
1
1
  module Ramesh
2
- VERSION = "1.0.0"
2
+ VERSION = "1.1.0"
3
3
  end
@@ -19,9 +19,13 @@ Gem::Specification.new do |spec|
19
19
  spec.require_paths = ["lib"]
20
20
 
21
21
  spec.add_development_dependency "bundler", "~> 1.3"
22
+ spec.add_development_dependency "coveralls"
23
+ spec.add_development_dependency "fakefs"
24
+ spec.add_development_dependency "guard-rspec"
22
25
  spec.add_development_dependency "rake"
23
26
  spec.add_development_dependency "rspec"
24
- spec.add_development_dependency "guard-rspec"
27
+ spec.add_development_dependency "terminal-notifier-guard"
28
+ spec.add_development_dependency "webmock"
25
29
 
26
30
  spec.add_dependency "rmagick"
27
31
  end
@@ -0,0 +1,2 @@
1
+ Amesh.setIndexList(["201405091845","201405091840","201405091835","201405091830","201405091825","201405091820","201405091815","201405091810","201405091805","201405091800","201405091755","201405091750","201405091745","201405091740","201405091735","201405091730","201405091725","201405091720","201405091715","201405091710","201405091705","201405091700","201405091655","201405091650","201405091645"]);
2
+
Binary file
@@ -1,47 +1,89 @@
1
- require 'spec_helper'
1
+ require "spec_helper"
2
+ require "fileutils"
2
3
 
3
4
  module Ramesh
4
5
  describe Client do
5
- let(:client) { client = Ramesh::Client.new }
6
+ let(:logger) do
7
+ double("logger", info: true)
8
+ end
9
+
10
+ let(:client) do
11
+ Ramesh::Client.new(logger)
12
+ end
13
+
14
+ let(:tmpdir) do
15
+ File.expand_path(File.join("..", "..", "tmp"), __FILE__)
16
+ end
17
+
18
+ let(:meshes_index_url) do
19
+ "http://tokyo-ame.jwa.or.jp/scripts/mesh_index.js"
20
+ end
21
+
22
+ before do
23
+ stub_request(:get, meshes_index_url)
24
+ .to_return(status: 200, body: open(fixture_path("index.js")))
25
+ Dir.mkdir(tmpdir)
26
+ end
27
+
28
+ describe "#download_image" do
29
+ before do
30
+ image = double(write: true)
31
+ Image.stub(download_image: image)
32
+ Image.any_instance.stub(composite_images: image)
33
+ end
34
+
35
+ context "when minute is not specified" do
36
+ it "should download the current image" do
37
+ expect_any_instance_of(Image).to receive(:save).with(tmpdir, "201405091845").once
38
+ client.download_image(tmpdir)
39
+ end
6
40
 
7
- describe "#download_sequential_image" do
8
- context "0-20" do
9
- it "should download 5 images" do
10
- client.download_sequential_image('0-20')
11
- Dir.glob("*.gif").length.should == 5
41
+ it "should log the result" do
42
+ expect(logger).to receive(:info).with("Downloaded: 201405091845.jpg")
43
+ client.download_image(tmpdir)
12
44
  end
13
45
  end
14
46
 
15
- context "20-0" do
16
- it "should download 5 images" do
17
- client.download_sequential_image('20-0')
18
- Dir.glob("*.gif").length.should == 5
47
+ context "when valid minute is specified" do
48
+ it "should download the image of the specified minutes ago" do
49
+ expect_any_instance_of(Image).to receive(:save).with(tmpdir, "201405091815").once
50
+ client.download_image(tmpdir, 30)
51
+ end
52
+
53
+ it "should log the result" do
54
+ expect(logger).to receive(:info).with("Downloaded: 201405091815.jpg")
55
+ client.download_image(tmpdir, 30)
19
56
  end
20
57
  end
21
58
 
22
- context "30-80" do
23
- it "should download 11 images" do
24
- client.download_sequential_image('30-80')
25
- Dir.glob("*.gif").length.should == 11
59
+ context "when invalid minute is specified" do
60
+ it "should raise ArgumentError" do
61
+ expect do
62
+ client.download_image(tmpdir, 7)
63
+ end.to raise_error ArgumentError
26
64
  end
27
65
  end
66
+ end
28
67
 
29
- context "0-120" do
30
- it "should download 25 images" do
31
- client.download_sequential_image('0-120')
32
- Dir.glob("*.gif").length.should == 25
68
+ describe "#download_sequential_images" do
69
+ context "when valid section is specified" do
70
+ it "should download the images" do
71
+ expect_any_instance_of(Client).to receive(:download_image).exactly(7).times
72
+ client.download_sequential_images(tmpdir, 0, 30)
33
73
  end
34
74
  end
35
75
 
36
- context "0-130" do
37
- it "should not download any image" do
38
- lambda { client.download_sequential_image('0-130') }.should raise_error SystemExit
76
+ context "when invalid section is specified" do
77
+ it "should raise ArgumentError" do
78
+ expect do
79
+ client.download_sequential_images(tmpdir, 1, 2)
80
+ end.to raise_error ArgumentError
39
81
  end
40
82
  end
41
83
  end
42
84
 
43
- after(:each) do
44
- Dir.glob("*.gif").each { |gif| File.delete(gif) }
85
+ after do
86
+ FileUtils.rm_rf(tmpdir)
45
87
  end
46
88
  end
47
89
  end
@@ -0,0 +1,74 @@
1
+ require "spec_helper"
2
+ require "fileutils"
3
+
4
+ module Ramesh
5
+ describe Image do
6
+ let(:image_name) do
7
+ "201405091845"
8
+ end
9
+
10
+ let(:tmpdir) do
11
+ File.expand_path(File.join("..", "..", "tmp"), __FILE__)
12
+ end
13
+
14
+ let(:mesh_url) do
15
+ "http://tokyo-ame.jwa.or.jp/mesh/000/#{image_name}.gif"
16
+ end
17
+
18
+ let(:background_url) do
19
+ "http://tokyo-ame.jwa.or.jp/map/map000.jpg"
20
+ end
21
+
22
+ let(:mask_url) do
23
+ "http://tokyo-ame.jwa.or.jp/map/msk000.png"
24
+ end
25
+
26
+ before do
27
+ stub_request(:get, mesh_url)
28
+ .to_return(status: 200, body: open(fixture_path("lena.png")).read)
29
+ stub_request(:get, background_url)
30
+ .to_return(status: 200, body: open(fixture_path("lena.png")).read)
31
+ stub_request(:get, mask_url)
32
+ .to_return(status: 200, body: open(fixture_path("lena.png")).read)
33
+ end
34
+
35
+ describe "#background_image" do
36
+ it "should download the background image" do
37
+ described_class.background_image
38
+ expect(a_request(:get, background_url)).to have_been_made.once
39
+ end
40
+ end
41
+
42
+ describe "#mask_image" do
43
+ it "should download the mask image" do
44
+ described_class.mask_image
45
+ expect(a_request(:get, mask_url)).to have_been_made.once
46
+ end
47
+ end
48
+
49
+ describe "#initialize" do
50
+ it "should composite the moment image" do
51
+ described_class.new(image_name)
52
+ expect(a_request(:get, mesh_url)).to have_been_made.once
53
+ expect(a_request(:get, background_url)).to have_been_made.once
54
+ expect(a_request(:get, mask_url)).to have_been_made.once
55
+ end
56
+ end
57
+
58
+ describe "#save" do
59
+ before do
60
+ Dir.mkdir(tmpdir)
61
+ end
62
+
63
+ it "should save itself to the file" do
64
+ image = described_class.new(image_name)
65
+ image.save(tmpdir, image_name)
66
+ expect(File.exist?(File.join(tmpdir, "#{image_name}.jpg"))).to be_true
67
+ end
68
+
69
+ after do
70
+ FileUtils.rm_rf(tmpdir)
71
+ end
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,20 @@
1
+ require "spec_helper"
2
+
3
+ module Ramesh
4
+ describe Logger do
5
+ let(:output) do
6
+ double("output", puts: true)
7
+ end
8
+
9
+ let(:logger) do
10
+ described_class.new(output)
11
+ end
12
+
13
+ describe "#info" do
14
+ it "should flush message" do
15
+ logger.info("message")
16
+ expect(output).to have_received(:puts).with("message")
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,5 @@
1
+ require "spec_helper"
2
+
3
+ module Ramesh
4
+
5
+ end
@@ -1,4 +1,8 @@
1
+ require 'coveralls'
2
+ Coveralls.wear!
3
+
1
4
  require 'ramesh'
5
+ require 'webmock/rspec'
2
6
 
3
7
  RSpec.configure do |config|
4
8
  config.treat_symbols_as_metadata_keys_with_true_values = true
@@ -11,3 +15,7 @@ RSpec.configure do |config|
11
15
  # --seed 1234
12
16
  config.order = 'random'
13
17
  end
18
+
19
+ def fixture_path(name)
20
+ File.expand_path(File.join("..", "fixtures", name), __FILE__)
21
+ end
metadata CHANGED
@@ -1,83 +1,139 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ramesh
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - dtan4
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-07-15 00:00:00.000000000 Z
11
+ date: 2014-05-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ~>
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
19
  version: '1.3'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ~>
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1.3'
27
+ - !ruby/object:Gem::Dependency
28
+ name: coveralls
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: fakefs
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: guard-rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
27
69
  - !ruby/object:Gem::Dependency
28
70
  name: rake
29
71
  requirement: !ruby/object:Gem::Requirement
30
72
  requirements:
31
- - - '>='
73
+ - - ">="
32
74
  - !ruby/object:Gem::Version
33
75
  version: '0'
34
76
  type: :development
35
77
  prerelease: false
36
78
  version_requirements: !ruby/object:Gem::Requirement
37
79
  requirements:
38
- - - '>='
80
+ - - ">="
39
81
  - !ruby/object:Gem::Version
40
82
  version: '0'
41
83
  - !ruby/object:Gem::Dependency
42
84
  name: rspec
43
85
  requirement: !ruby/object:Gem::Requirement
44
86
  requirements:
45
- - - '>='
87
+ - - ">="
46
88
  - !ruby/object:Gem::Version
47
89
  version: '0'
48
90
  type: :development
49
91
  prerelease: false
50
92
  version_requirements: !ruby/object:Gem::Requirement
51
93
  requirements:
52
- - - '>='
94
+ - - ">="
53
95
  - !ruby/object:Gem::Version
54
96
  version: '0'
55
97
  - !ruby/object:Gem::Dependency
56
- name: guard-rspec
98
+ name: terminal-notifier-guard
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: webmock
57
113
  requirement: !ruby/object:Gem::Requirement
58
114
  requirements:
59
- - - '>='
115
+ - - ">="
60
116
  - !ruby/object:Gem::Version
61
117
  version: '0'
62
118
  type: :development
63
119
  prerelease: false
64
120
  version_requirements: !ruby/object:Gem::Requirement
65
121
  requirements:
66
- - - '>='
122
+ - - ">="
67
123
  - !ruby/object:Gem::Version
68
124
  version: '0'
69
125
  - !ruby/object:Gem::Dependency
70
126
  name: rmagick
71
127
  requirement: !ruby/object:Gem::Requirement
72
128
  requirements:
73
- - - '>='
129
+ - - ">="
74
130
  - !ruby/object:Gem::Version
75
131
  version: '0'
76
132
  type: :runtime
77
133
  prerelease: false
78
134
  version_requirements: !ruby/object:Gem::Requirement
79
135
  requirements:
80
- - - '>='
136
+ - - ">="
81
137
  - !ruby/object:Gem::Version
82
138
  version: '0'
83
139
  description: Command Line Tool for Tokyo-Amesh
@@ -88,8 +144,9 @@ executables:
88
144
  extensions: []
89
145
  extra_rdoc_files: []
90
146
  files:
91
- - .gitignore
92
- - .rspec
147
+ - ".gitignore"
148
+ - ".rspec"
149
+ - ".travis.yml"
93
150
  - Gemfile
94
151
  - Guardfile
95
152
  - LICENSE.txt
@@ -98,13 +155,16 @@ files:
98
155
  - bin/ramesh
99
156
  - lib/ramesh.rb
100
157
  - lib/ramesh/client.rb
101
- - lib/ramesh/image_util.rb
102
- - lib/ramesh/util.rb
158
+ - lib/ramesh/image.rb
159
+ - lib/ramesh/logger.rb
103
160
  - lib/ramesh/version.rb
104
161
  - ramesh.gemspec
162
+ - spec/fixtures/index.js
163
+ - spec/fixtures/lena.png
105
164
  - spec/ramesh/client_spec.rb
106
- - spec/ramesh/image_util_spec.rb
107
- - spec/ramesh/util_spec.rb
165
+ - spec/ramesh/image_spec.rb
166
+ - spec/ramesh/logger_spec.rb
167
+ - spec/ramesh_spec.rb
108
168
  - spec/spec_helper.rb
109
169
  homepage: https://github.com/dtan4/ramesh
110
170
  licenses:
@@ -116,23 +176,26 @@ require_paths:
116
176
  - lib
117
177
  required_ruby_version: !ruby/object:Gem::Requirement
118
178
  requirements:
119
- - - '>='
179
+ - - ">="
120
180
  - !ruby/object:Gem::Version
121
181
  version: '0'
122
182
  required_rubygems_version: !ruby/object:Gem::Requirement
123
183
  requirements:
124
- - - '>='
184
+ - - ">="
125
185
  - !ruby/object:Gem::Version
126
186
  version: '0'
127
187
  requirements: []
128
188
  rubyforge_project:
129
- rubygems_version: 2.0.3
189
+ rubygems_version: 2.2.2
130
190
  signing_key:
131
191
  specification_version: 4
132
192
  summary: Tokyo-Amesh Downloader
133
193
  test_files:
194
+ - spec/fixtures/index.js
195
+ - spec/fixtures/lena.png
134
196
  - spec/ramesh/client_spec.rb
135
- - spec/ramesh/image_util_spec.rb
136
- - spec/ramesh/util_spec.rb
197
+ - spec/ramesh/image_spec.rb
198
+ - spec/ramesh/logger_spec.rb
199
+ - spec/ramesh_spec.rb
137
200
  - spec/spec_helper.rb
138
201
  has_rdoc:
@@ -1,34 +0,0 @@
1
- require 'RMagick'
2
- require 'open-uri'
3
-
4
- module Ramesh::ImageUtil
5
- MESH_URL_BASE ='http://tokyo-ame.jwa.or.jp/mesh/000/'
6
- BACKGROUND_IMAGE_URL = 'http://tokyo-ame.jwa.or.jp/map/map000.jpg'
7
- MAP_MASK_URL = 'http://tokyo-ame.jwa.or.jp/map/msk000.png'
8
-
9
- include Magick
10
-
11
- def create_moment_image(gif_name)
12
- mesh_url = MESH_URL_BASE + gif_name
13
-
14
- @background_image ||= Image.from_blob(open(BACKGROUND_IMAGE_URL).read).shift
15
- @map_image ||= Image.from_blob(open(MAP_MASK_URL).read).shift
16
-
17
- begin
18
- image_list = [
19
- @background_image,
20
- Image.from_blob(open(mesh_url).read).shift,
21
- @map_image
22
- ]
23
- moment_image = composite_images(image_list)
24
- moment_image.write(gif_name)
25
- rescue OpenURI::HTTPError
26
- end
27
- end
28
-
29
- def composite_images(image_list)
30
- image = image_list.shift
31
- image_list.each { |layer| image = image.composite(layer, 0, 0, OverCompositeOp) }
32
- image
33
- end
34
- end
@@ -1,27 +0,0 @@
1
- require 'open-uri'
2
- require 'time'
3
-
4
- module Ramesh::Util
5
- AMESH_INDEXES_URL = 'http://tokyo-ame.jwa.or.jp/scripts/mesh_index.js'
6
-
7
- def extract_filename(url)
8
- if url =~ /.+\/([a-zA-Z0-9._-]+)$/
9
- $1
10
- else
11
- ''
12
- end
13
- end
14
-
15
- def get_mesh_indexes
16
- begin
17
- indexes_js = open(AMESH_INDEXES_URL).read
18
- indexes = indexes_js.gsub(/[^0-9,]/, '').split(',')
19
- rescue
20
- $stderr.puts 'Failed to download: #{AMESH_INDEXES_URL}'
21
- end
22
- end
23
-
24
- def validate_minutes(minutes)
25
- (minutes >= 0) && (minutes <= 120) && (minutes % 5 == 0)
26
- end
27
- end
@@ -1,30 +0,0 @@
1
- require 'spec_helper'
2
-
3
- module Ramesh
4
- describe ImageUtil do
5
- include Ramesh::ImageUtil
6
-
7
- describe "#create_moment_image" do
8
- before(:all) do
9
- current_time = Time.now
10
- year = current_time.year
11
- month = current_time.month
12
- day = current_time.day
13
- hour = current_time.hour
14
-
15
- @gif = sprintf('%04d%02d%02d%02d00.gif', year, month, day, hour)
16
- create_moment_image(@gif)
17
- end
18
-
19
- context "downloaded image" do
20
- it "should exist" do
21
- File.exist?(@gif).should be_true
22
- end
23
- end
24
-
25
- after(:all) do
26
- File.delete(@gif) if File.exists?(@gif)
27
- end
28
- end
29
- end
30
- end
@@ -1,86 +0,0 @@
1
- require 'spec_helper'
2
- require 'time'
3
-
4
- module Ramesh
5
- describe Util do
6
- include Ramesh::Util
7
-
8
- describe '#extract_filename' do
9
- context 'http://tokyo-ame.jwa.or.jp/map/map000.jpg' do
10
- it 'should return "map000.jpg"' do
11
- extract_filename('http://tokyo-ame.jwa.or.jp/map/map000.jpg').should == 'map000.jpg'
12
- end
13
- end
14
-
15
- context 'http://tokyo-ame.jwa.or.jp/map/' do
16
- it 'should return ""' do
17
- extract_filename('http://tokyo-ame.jwa.or.jp/map/').should == ''
18
- end
19
- end
20
- end
21
-
22
- describe '#get_mesh_indexes' do
23
- before(:all) do
24
- @indexes = get_mesh_indexes
25
- end
26
-
27
- context 'downloaded indexes' do
28
- it 'should be Array' do
29
- @indexes.class.should == Array
30
- end
31
-
32
- it 'should be sorted decrementally' do
33
- @indexes.should == @indexes.sort.reverse
34
- end
35
-
36
- it 'should have 25 items' do
37
- @indexes.length.should == 25
38
- end
39
-
40
- 25.times do |i|
41
- it "indexes[#{i}] should be 12 digit number" do
42
- @indexes[i].should =~ /^\d{12}$/
43
- end
44
- end
45
- end
46
- end
47
-
48
- describe "#validate_minutes" do
49
- context "0" do
50
- it 'should be true' do
51
- validate_minutes(0).should be_true
52
- end
53
- end
54
-
55
- context "5" do
56
- it 'should be true' do
57
- validate_minutes(5).should be_true
58
- end
59
- end
60
-
61
- context "7" do
62
- it 'should be false' do
63
- validate_minutes(7).should be_false
64
- end
65
- end
66
-
67
- context "120" do
68
- it 'should be true' do
69
- validate_minutes(120).should be_true
70
- end
71
- end
72
-
73
- context "130" do
74
- it 'should be false' do
75
- validate_minutes(130).should be_false
76
- end
77
- end
78
-
79
- context "-5" do
80
- it 'should be false' do
81
- validate_minutes(130).should be_false
82
- end
83
- end
84
- end
85
- end
86
- end