seis_ruby 0.0.1 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.rdoc ADDED
@@ -0,0 +1,5 @@
1
+ = SeisRuby
2
+ == Executables
3
+ === seis_ruby
4
+ Please see details by typing:
5
+ > seis_ruby help
data/bin/seis_ruby CHANGED
@@ -1,17 +1,4 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- require 'thor'
4
- class SeisRubyRunner < Thor
5
- require 'seis_ruby'
6
- require 'ruby_patch'
7
- require 'yaml'
8
-
9
- desc 'gcmt_catalog_scrape URL', 'scrape cmtsolution data from GCMT catalog search result pages.'
10
- def gcmt_catalog_scrape(url)
11
- file = "#{__METHOD__}_#{Time.now.ymdhms}.yaml"
12
- open(file, 'w').write(SeisRuby::Io::GcmtCatalog.scrape(url).to_yaml)
13
- puts file
14
- end
15
- end
16
-
17
- SeisRubyRunner.start
3
+ require 'seis_ruby'
4
+ ::SeisRuby::Bin::SeisRubyRunner.start
@@ -0,0 +1,58 @@
1
+ module SeisRuby
2
+ module Bin
3
+ require 'thor'
4
+
5
+ class SeisRubyRunner < Thor
6
+ require 'yaml'
7
+ require 'fileutils'
8
+ require 'ruby_patch'
9
+ extend ::RubyPatch::AutoLoad
10
+
11
+ COMMAND_NAME = 'seis_ruby'
12
+
13
+ desc 'gcmt_catalog_scrape URL', 'scrape cmtsolution data from GCMT catalog search result pages.'
14
+ def gcmt_catalog_scrape(url)
15
+ file = "#{__METHOD__}_#{Time.now.ymdhms}.yaml"
16
+ open(file, 'w').write(SeisRuby::Io::GcmtCatalog.scrape(url).to_yaml)
17
+ puts file
18
+ end
19
+
20
+ desc "generate_completion", "Generate bash completion of seis_ruby's commands."
21
+ def generate_completion
22
+ commands = `#{COMMAND_NAME} --help`.split("\n").select{|l| l =~ / *#{COMMAND_NAME} /}.map{|l| l.split[1]}
23
+ function = <<-EOS
24
+ _#{COMMAND_NAME}()
25
+ {
26
+ local commands current previous
27
+ commands="#{commands.join(' ')}"
28
+ current="${COMP_WORDS[COMP_CWORD]}"
29
+ previous="${COMP_WORDS[COMP_CWORD-1]}"
30
+
31
+ case "${previous}" in
32
+ #{COMMAND_NAME}|help)
33
+ COMPREPLY=( $(compgen -W "${commands}" ${current}) );;
34
+ * )
35
+ COMPREPLY=( $(compgen -f ${current}) );;
36
+ esac
37
+ }
38
+ complete -F _#{COMMAND_NAME} #{COMMAND_NAME}
39
+ EOS
40
+
41
+ file = "#{ENV['HOME']}/.#{COMMAND_NAME}.d/completion.bash"
42
+ FileUtils.mkdir_p(File.dirname(file))
43
+ FileUtils.cp(file, "#{file}.#{Time.now.ymdhms}.bak") if File.file?(file)
44
+ open(file, 'w').write(function)
45
+
46
+ tilde_file = file.sub(/\A#{ENV['HOME']}/, '~')
47
+ puts <<-EOS
48
+ Please add following code to your ~/.bashrc if necessary.
49
+
50
+ # enable seis_ruby completion.
51
+ if [ -f #{tilde_file} ]; then
52
+ . #{tilde_file}
53
+ fi
54
+ EOS
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,6 @@
1
+ module SeisRuby
2
+ module Bin
3
+ require 'ruby_patch'
4
+ extend ::RubyPatch::AutoLoad
5
+ end
6
+ end
@@ -1,8 +1,8 @@
1
1
  module SeisRuby
2
2
  module Data
3
3
  module Cmtsolution
4
- require 'rainbow'
5
- require 'ruby_patch/string'
4
+ require 'ruby_patch'
5
+ extend ::RubyPatch::AutoLoad
6
6
 
7
7
  ParseError = Class.new(StandardError)
8
8
 
@@ -42,20 +42,34 @@ module SeisRuby
42
42
  h
43
43
  end
44
44
 
45
- def parse(text_for_one_event)
45
+ def _parse_one_event(text_for_one_event)
46
46
  begin
47
47
  lines = _preprocess_for_parse(text_for_one_event)
48
48
  _parse_lines(lines)
49
49
  rescue
50
- raise ParseError, text_for_one_event\
51
- .split("\n")\
52
- .map{|line| line.quote('|'.color(:red))}\
53
- .join("\n")
50
+ raise ParseError, text_for_one_event
54
51
  end
55
52
  end
56
53
 
57
- def parse_list(events)
58
- events.map{|ev| parse(ev)}
54
+ # @param [String, Array<String>] events List of CMTSOLUTION format texts.
55
+ # @return [Array<Hash>] You can access :event_name, :hypocenter, :centroid.
56
+ def parse(*events)
57
+ h = events.flatten.map{|ev|
58
+ begin
59
+ _parse_one_event(ev)
60
+ rescue ParseError => e
61
+ e
62
+ end
63
+ }.classify{|o| o.exception?}
64
+ unless (error_list = h[true]).empty?
65
+ error_message = error_list.map{|e| e.message}.join("\n\n")
66
+ raise ParseError, <<-EOS
67
+ Could not parse following events:
68
+ #{error_message}
69
+ EOS
70
+ end
71
+
72
+ h[false]
59
73
  end
60
74
  end
61
75
  end
@@ -1,6 +1,6 @@
1
1
  module SeisRuby
2
2
  module Data
3
- require 'seis_ruby/data/cmtsolution'
4
- require 'seis_ruby/data/sac'
3
+ require 'ruby_patch'
4
+ extend ::RubyPatch::AutoLoad
5
5
  end
6
6
  end
@@ -4,6 +4,9 @@ module SeisRuby
4
4
  require 'mechanize'
5
5
 
6
6
  class CustomHtmlParser < ::Mechanize::Page
7
+ require 'ruby_patch'
8
+ extend ::RubyPatch::AutoLoad
9
+
7
10
  def initialize(uri = nil, response = nil, body = nil, code = nil, mech = nil)
8
11
  super(uri, response, body.gsub(/<=/, '&lt;='), code, mech)
9
12
  end
@@ -3,30 +3,38 @@ module SeisRuby
3
3
  module GcmtCatalog
4
4
  require 'rainbow'
5
5
  require 'mechanize'
6
- require 'seis_ruby/io/gcmt_catalog/custom_html_parser'
7
- require 'seis_ruby/data/cmtsolution'
6
+ require 'ruby_patch'
7
+ extend ::RubyPatch::AutoLoad
8
8
 
9
9
  module_function
10
10
 
11
+ # @param [String] url URL of a first page of Global CMT Catalog search result.
12
+ # @return [Array<Hash>] {::SeisRuby::Data::Cmtsolution#parse}
11
13
  def scrape(url)
12
14
  agent = Mechanize.new{|a|
13
15
  a.pluggable_parser.html = ::SeisRuby::Io::GcmtCatalog::CustomHtmlParser
14
16
  }
15
17
 
16
- event_list = []
18
+ result = {
19
+ query: url,
20
+ result: [],
21
+ }
22
+
17
23
  while url
18
24
  agent.get(url)
19
- agent.page.search('pre')\
25
+ event_text_list = agent.page.search('pre')\
20
26
  .find{|e| e.text =~ /event name:/}\
21
27
  .text.split("\n\n")\
22
- .each{|event|
23
- begin
24
- event_list << ::SeisRuby::Data::Cmtsolution.parse(event) unless event.strip.empty?
25
- rescue ::SeisRuby::Data::Cmtsolution::ParseError => e
26
- $stderr.puts e.class.to_s.color(:red)
27
- $stderr.puts e.message
28
- end
29
- }
28
+ .delete_if{|t| t.strip.empty?}
29
+
30
+ begin
31
+ event_list = ::SeisRuby::Data::Cmtsolution.parse(event_text_list)
32
+ rescue ::SeisRuby::Data::Cmtsolution::ParseError => e
33
+ $stderr.puts e.class.to_s.color(:red)
34
+ $stderr.puts e.message
35
+ ensure
36
+ result[:result].concat event_list
37
+ end
30
38
 
31
39
  url = nil
32
40
  if next_link = agent.page.links\
@@ -35,7 +43,7 @@ module SeisRuby
35
43
  end
36
44
  end
37
45
 
38
- event_list
46
+ result
39
47
  end
40
48
  end
41
49
  end
data/lib/seis_ruby/io.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  module SeisRuby
2
2
  module Io
3
- require 'seis_ruby/io/gcmt_catalog'
3
+ require 'ruby_patch'
4
+ extend ::RubyPatch::AutoLoad
4
5
  end
5
6
  end
@@ -1,3 +1,3 @@
1
1
  module SeisRuby
2
- VERSION = '0.0.1'
2
+ VERSION = '0.1.0'
3
3
  end
data/lib/seis_ruby.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  module SeisRuby
2
2
  require 'seis_ruby/version'
3
- require 'seis_ruby/data'
4
- require 'seis_ruby/io'
3
+ require 'ruby_patch'
4
+ extend ::RubyPatch::AutoLoad
5
5
  end
data/seis_ruby.gemspec CHANGED
@@ -1,19 +1,39 @@
1
1
  gem_name = File.basename(Dir.pwd)
2
- require "./lib/#{gem_name}/version"
2
+ require 'rainbow'
3
+ require 'ruby_patch'
4
+
5
+ dir = File.join(__DIR__, 'lib')
6
+ $LOAD_PATH.unshift(File.join(dir)) unless $LOAD_PATH.include?(dir)
7
+ require "#{gem_name}"
3
8
 
4
9
  Gem::Specification.new do |s|
5
10
  s.files = `git ls-files`.split
6
11
  s.name = gem_name
7
12
  s.summary = "Ruby library for earthquake science."
8
13
  s.version = SeisRuby::VERSION
9
- s.add_development_dependency 'rspec', '~> 2'
10
- s.add_development_dependency 'simplecov', '~> 0'
11
- s.add_runtime_dependency 'rainbow', '~>1'
12
- s.add_runtime_dependency 'mechanize', '~>2'
13
- s.add_runtime_dependency 'ruby_patch', ['>= 0.1.0', '< 1.0.0']
14
+ s.add_development_dependency 'rspec', '~> 2.10'
15
+ s.add_development_dependency 'simplecov', '~> 0.6'
16
+ s.add_runtime_dependency 'rainbow', '~> 1.1'
17
+ s.add_runtime_dependency 'thor', '~> 0.15'
18
+ s.add_runtime_dependency 'mechanize', '~> 2.5'
19
+ s.add_runtime_dependency 'ruby_patch', '~> 0.0'
14
20
  s.author = 'kshramt'
15
21
  s.description = "Ruby library for earthquake science. Provides Parser for various data formats used in seismology."
16
22
  s.executables << 'seis_ruby'
17
- s.required_ruby_version = '>= 1.9.0'
23
+ s.post_install_message = (<<-EOS
24
+
25
+
26
+ SeisRuby #{::SeisRuby::VERSION}
27
+ Thank you for installing.
28
+ Please execute following command:
29
+
30
+ #{::SeisRuby::Bin::SeisRubyRunner::COMMAND_NAME} generate_completion
31
+
32
+ Enjoy!
33
+
34
+
35
+ EOS
36
+ ).color(:green)
37
+ s.required_ruby_version = '~> 1.9'
18
38
  s.test_files.concat `git ls-files spec`.split.select{|path| path =~ /_spec\.rb/}
19
39
  end
@@ -1,5 +1,4 @@
1
1
  require 'spec_helper'
2
- require 'seis_ruby/data/cmtsolution'
3
2
 
4
3
  describe ::SeisRuby::Data::Cmtsolution do
5
4
  before :each do
@@ -71,27 +70,13 @@ Mtp: -1.491000e+24
71
70
  describe '.parse' do
72
71
  context 'normal case' do
73
72
  it do
74
- ::SeisRuby::Data::Cmtsolution.parse(@valid_data).should == @parsed_valid_data
73
+ ::SeisRuby::Data::Cmtsolution.parse(@valid_data, @valid_data, [@valid_data, @valid_data]).should == [@parsed_valid_data, @parsed_valid_data, @parsed_valid_data, @parsed_valid_data]
75
74
  end
76
75
  end
77
76
 
78
77
  context 'wrong case' do
79
78
  it do
80
- lambda{::SeisRuby::Data::Cmtsolution.parse(@wrong_data)}.should raise_error(::SeisRuby::Data::Cmtsolution::ParseError)
81
- end
82
- end
83
- end
84
-
85
- describe '.parse_list' do
86
- context 'normal case' do
87
- it do
88
- ::SeisRuby::Data::Cmtsolution.parse_list([@valid_data, @valid_data]).should == [@parsed_valid_data, @parsed_valid_data]
89
- end
90
- end
91
-
92
- context 'wrong case' do
93
- it do
94
- lambda{::SeisRuby::Data::Cmtsolution.parse_list([@valid_data, @wrong_data])}.should raise_error(::SeisRuby::Data::Cmtsolution::ParseError)
79
+ lambda{::SeisRuby::Data::Cmtsolution.parse([@valid_data, @wrong_data])}.should raise_error(::SeisRuby::Data::Cmtsolution::ParseError)
95
80
  end
96
81
  end
97
82
  end
@@ -1,7 +1,6 @@
1
1
  require 'yaml'
2
2
  require 'ruby_patch'
3
3
  require 'spec_helper'
4
- require 'seis_ruby'
5
4
 
6
5
  describe ::SeisRuby::Io::GcmtCatalog do
7
6
  describe '.scrape' do
@@ -1,4 +1,6 @@
1
1
  ---
2
+ :query: http://www.globalcmt.org/cgi-bin/globalcmt-cgi-bin/CMT4/form?itype=ymd&yr=1976&mo=1&day=1&oyr=1976&omo=1&oday=1&jyr=1976&jday=1&ojyr=1&ojday=1&otype=nd&nday=400&lmw=0&umw=10&lms=0&ums=10&lmb=0&umb=10&llat=-90&ulat=90&llon=-180&ulon=180&lhd=0&uhd=1000&lts=-9999&uts=9999&lpe1=0&upe1=90&lpe2=0&upe2=90&list=4
3
+ :result:
2
4
  - :hypocenter:
3
5
  :data_source: MLI
4
6
  :year: 1976
@@ -157,7 +159,7 @@
157
159
  :mrr: 4.78e+27
158
160
  :mtt: -4.9e+26
159
161
  :mpp: -4.3e+27
160
- :mrt: 830000000000000100000000000.0
162
+ :mrt: 8.3e+26
161
163
  :mrp: 3.62e+27
162
164
  :mtp: -1.32e+27
163
165
  :event_name: 011476A
data/spec/spec_helper.rb CHANGED
@@ -14,3 +14,5 @@ RSpec.configure do |config|
14
14
  config.run_all_when_everything_filtered = true
15
15
  config.filter_run :focus
16
16
  end
17
+
18
+ require 'seis_ruby'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: seis_ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.1.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,66 +9,74 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-06-26 00:00:00.000000000 Z
12
+ date: 2012-07-07 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec
16
- requirement: &79465380 !ruby/object:Gem::Requirement
16
+ requirement: &86475830 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
20
20
  - !ruby/object:Gem::Version
21
- version: '2'
21
+ version: '2.10'
22
22
  type: :development
23
23
  prerelease: false
24
- version_requirements: *79465380
24
+ version_requirements: *86475830
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: simplecov
27
- requirement: &79465130 !ruby/object:Gem::Requirement
27
+ requirement: &86475580 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ~>
31
31
  - !ruby/object:Gem::Version
32
- version: '0'
32
+ version: '0.6'
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *79465130
35
+ version_requirements: *86475580
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: rainbow
38
- requirement: &79464900 !ruby/object:Gem::Requirement
38
+ requirement: &86475350 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ~>
42
42
  - !ruby/object:Gem::Version
43
- version: '1'
43
+ version: '1.1'
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *79464900
46
+ version_requirements: *86475350
47
+ - !ruby/object:Gem::Dependency
48
+ name: thor
49
+ requirement: &86475120 !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: '0.15'
55
+ type: :runtime
56
+ prerelease: false
57
+ version_requirements: *86475120
47
58
  - !ruby/object:Gem::Dependency
48
59
  name: mechanize
49
- requirement: &79464670 !ruby/object:Gem::Requirement
60
+ requirement: &86474890 !ruby/object:Gem::Requirement
50
61
  none: false
51
62
  requirements:
52
63
  - - ~>
53
64
  - !ruby/object:Gem::Version
54
- version: '2'
65
+ version: '2.5'
55
66
  type: :runtime
56
67
  prerelease: false
57
- version_requirements: *79464670
68
+ version_requirements: *86474890
58
69
  - !ruby/object:Gem::Dependency
59
70
  name: ruby_patch
60
- requirement: &79464420 !ruby/object:Gem::Requirement
71
+ requirement: &86474660 !ruby/object:Gem::Requirement
61
72
  none: false
62
73
  requirements:
63
- - - ! '>='
64
- - !ruby/object:Gem::Version
65
- version: 0.1.0
66
- - - <
74
+ - - ~>
67
75
  - !ruby/object:Gem::Version
68
- version: 1.0.0
76
+ version: '0.0'
69
77
  type: :runtime
70
78
  prerelease: false
71
- version_requirements: *79464420
79
+ version_requirements: *86474660
72
80
  description: Ruby library for earthquake science. Provides Parser for various data
73
81
  formats used in seismology.
74
82
  email:
@@ -77,8 +85,11 @@ executables:
77
85
  extensions: []
78
86
  extra_rdoc_files: []
79
87
  files:
88
+ - README.rdoc
80
89
  - bin/seis_ruby
81
90
  - lib/seis_ruby.rb
91
+ - lib/seis_ruby/bin.rb
92
+ - lib/seis_ruby/bin/seis_ruby_runner.rb
82
93
  - lib/seis_ruby/data.rb
83
94
  - lib/seis_ruby/data/cmtsolution.rb
84
95
  - lib/seis_ruby/data/sac.rb
@@ -94,16 +105,17 @@ files:
94
105
  - spec/spec_helper.rb
95
106
  homepage:
96
107
  licenses: []
97
- post_install_message:
108
+ post_install_message: ! "\e[32m\n\nSeisRuby 0.1.0\nThank you for installing.\nPlease
109
+ execute following command:\n\nseis_ruby generate_completion\n\nEnjoy!\n\n\n\e[0m"
98
110
  rdoc_options: []
99
111
  require_paths:
100
112
  - lib
101
113
  required_ruby_version: !ruby/object:Gem::Requirement
102
114
  none: false
103
115
  requirements:
104
- - - ! '>='
116
+ - - ~>
105
117
  - !ruby/object:Gem::Version
106
- version: 1.9.0
118
+ version: '1.9'
107
119
  required_rubygems_version: !ruby/object:Gem::Requirement
108
120
  none: false
109
121
  requirements: