greyhawkweather 0.0.6 → 0.0.7

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.
Files changed (53) hide show
  1. data/.gitignore +5 -0
  2. data/.rspec +1 -0
  3. data/Gemfile +4 -0
  4. data/Gemfile.lock +28 -0
  5. data/History.txt +5 -0
  6. data/Manifest.txt +16 -14
  7. data/Rakefile +10 -22
  8. data/bin/greyweathergen +6 -2
  9. data/greyhawkweather.gemspec +33 -0
  10. data/lib/baselinedata.rb +1 -3
  11. data/lib/greyhawkweather.rb +2 -3
  12. data/lib/greyhawkweather/version.rb +4 -0
  13. data/lib/greyhawkweathergenerator.rb +4 -6
  14. data/lib/options.rb +15 -0
  15. data/lib/precipitationoccurance.rb +8 -4
  16. data/lib/singledayweather.rb +11 -3
  17. data/lib/skyconditions.rb +1 -1
  18. data/lib/temperaturerange.rb +10 -2
  19. data/lib/util/dieroller.rb +3 -3
  20. data/lib/weathergenerator.rb +15 -9
  21. data/lib/wind.rb +3 -1
  22. data/spec/acceptance_spec.rb +52 -0
  23. data/spec/dieroller_spec.rb +22 -0
  24. data/spec/latitude_spec.rb +25 -0
  25. data/spec/month_spec.rb +34 -0
  26. data/spec/options_spec.rb +25 -0
  27. data/spec/precipation_spec.rb +23 -0
  28. data/spec/precipitation_occurance_spec.rb +114 -0
  29. data/spec/singledayweather_spec.rb +44 -0
  30. data/spec/sky_conditions_spec.rb +20 -0
  31. data/spec/spec_helper.rb +22 -0
  32. data/spec/temperature_range_spec.rb +27 -0
  33. data/spec/weathergenerator_spec.rb +63 -0
  34. data/spec/wind_spec.rb +8 -0
  35. data/todo.org +3 -2
  36. metadata +67 -80
  37. data.tar.gz.sig +0 -1
  38. data/.gemtest +0 -0
  39. data/test/rollers/avgroller.rb +0 -7
  40. data/test/rollers/riggedroller.rb +0 -11
  41. data/test/test_acceptance.rb +0 -36
  42. data/test/test_dieroller.rb +0 -30
  43. data/test/test_greyhawkweather.rb +0 -11
  44. data/test/test_helper.rb +0 -3
  45. data/test/test_month.rb +0 -36
  46. data/test/test_precipitation.rb +0 -26
  47. data/test/test_precipitation_occurance.rb +0 -93
  48. data/test/test_singledayweather.rb +0 -61
  49. data/test/test_sky_conditions.rb +0 -23
  50. data/test/test_temperature_range.rb +0 -30
  51. data/test/test_weather_generator.rb +0 -59
  52. data/test/test_wind.rb +0 -11
  53. metadata.gz.sig +0 -1
data/.gitignore ADDED
@@ -0,0 +1,5 @@
1
+ *~
2
+ TAGS
3
+ coverage
4
+ coverage.info
5
+ pkg
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --color
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in greyhawkweather.gemspec
4
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,28 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ greyhawkweather (0.0.7)
5
+ rangehash (>= 0.0.5)
6
+
7
+ GEM
8
+ remote: http://rubygems.org/
9
+ specs:
10
+ diff-lcs (1.1.2)
11
+ rangehash (0.0.5)
12
+ rcov (0.9.10)
13
+ rspec (2.6.0)
14
+ rspec-core (~> 2.6.0)
15
+ rspec-expectations (~> 2.6.0)
16
+ rspec-mocks (~> 2.6.0)
17
+ rspec-core (2.6.4)
18
+ rspec-expectations (2.6.0)
19
+ diff-lcs (~> 1.1.2)
20
+ rspec-mocks (2.6.0)
21
+
22
+ PLATFORMS
23
+ ruby
24
+
25
+ DEPENDENCIES
26
+ greyhawkweather!
27
+ rcov
28
+ rspec
data/History.txt CHANGED
@@ -1,3 +1,8 @@
1
+ === 0.0.7 2011-08-14
2
+ * switching to use rspec
3
+ * switching to use bundler
4
+ * various cleanups based upon flog/flay etc.
5
+
1
6
  === 0.0.6 2011-04-26
2
7
  * Fixing problems due to RangeHash update
3
8
 
data/Manifest.txt CHANGED
@@ -1,3 +1,4 @@
1
+ .rspec
1
2
  History.txt
2
3
  Manifest.txt
3
4
  PostInstall.txt
@@ -10,6 +11,7 @@ lib/baselinedata.rb
10
11
  lib/greyhawkweather.rb
11
12
  lib/greyhawkweathergenerator.rb
12
13
  lib/month.rb
14
+ lib/options.rb
13
15
  lib/precipitation.rb
14
16
  lib/precipitationinfo.rb
15
17
  lib/precipitationoccurance.rb
@@ -22,18 +24,18 @@ lib/wind.rb
22
24
  script/console
23
25
  script/destroy
24
26
  script/generate
25
- test/rollers/avgroller.rb
26
- test/rollers/riggedroller.rb
27
- test/test_acceptance.rb
28
- test/test_dieroller.rb
29
- test/test_greyhawkweather.rb
30
- test/test_helper.rb
31
- test/test_month.rb
32
- test/test_precipitation.rb
33
- test/test_precipitation_occurance.rb
34
- test/test_singledayweather.rb
35
- test/test_sky_conditions.rb
36
- test/test_temperature_range.rb
37
- test/test_weather_generator.rb
38
- test/test_wind.rb
27
+ spec/acceptance_spec.rb
28
+ spec/dieroller_spec.rb
29
+ spec/latitude_spec.rb
30
+ spec/month_spec.rb
31
+ spec/options_spec.rb
32
+ spec/precipation_spec.rb
33
+ spec/precipitation_occurance_spec.rb
34
+ spec/singledayweather_spec.rb
35
+ spec/sky_conditions_spec.rb
36
+ spec/spec_helper.rb
37
+ spec/temperature_range_spec.rb
38
+ spec/weathergenerator_spec.rb
39
+ spec/wind_spec.rb
40
+ tasks/rspec.rake
39
41
  todo.org
data/Rakefile CHANGED
@@ -1,26 +1,14 @@
1
- require 'rubygems'
2
- gem 'hoe', '>= 2.1.0'
3
- require 'hoe'
4
- require 'fileutils'
5
- require './lib/greyhawkweather'
1
+ require 'bundler/gem_tasks'
2
+ require 'rspec/core/rake_task'
6
3
 
7
- Hoe.plugin :newgem
8
- # Hoe.plugin :website
9
- # Hoe.plugin :cucumberfeatures
10
-
11
- # Generate all the Rake tasks
12
- # Run 'rake -T' to see list of generated tasks (from gem root directory)
13
- $hoe = Hoe.spec 'greyhawkweather' do
14
- self.developer 'Mark Simpson', 'verdammelt@gmail.com'
15
- self.post_install_message = 'PostInstall.txt'
16
- self.rubyforge_name = self.name
17
- self.extra_deps = [['rangehash','>= 0.0.1']]
18
- self.extra_rdoc_files = ["README.rdoc"]
4
+ RSpec::Core::RakeTask.new do |t|
5
+ t.rspec_opts = ['--format', 'progress']
19
6
  end
20
7
 
21
- require 'newgem/tasks'
22
- Dir['tasks/**/*.rake'].each { |t| load t }
8
+ desc "Run all specs with RCov"
9
+ RSpec::Core::RakeTask.new(:rcov) do |t|
10
+ t.rcov = true
11
+ t.rcov_opts = ['--text-report', '--save', 'coverage.info', '--exclude', 'spec_helper', '--exclude', '^/']
12
+ end
23
13
 
24
- # TODO - want other tests/tasks run by default? Add them to the list
25
- # remove_task :default
26
- # task :default => [:spec, :features]
14
+ task :default => [:spec]
data/bin/greyweathergen CHANGED
@@ -1,7 +1,6 @@
1
1
  #!/usr/bin/ruby -s
2
2
 
3
3
  # arbitrary defaults: Weather will be generated for 1st of Planting
4
-
5
4
  $month ||= 4
6
5
  $numdays ||= 28
7
6
  $terrain ||= "plains"
@@ -12,7 +11,12 @@ gem 'rangehash'
12
11
  require File.dirname(__FILE__) + '/../lib/greyhawkweather'
13
12
  require 'GreyhawkWeatherGenerator'
14
13
 
15
- weather_generator = GreyhawkWeatherGenerator.create_weather_generator $month.to_i, $numdays.to_i, DieRoller.new, $terrain.to_sym
14
+ options = WeatherGeneratorOptions.new({
15
+ :month => $month.to_i,
16
+ :num_days => $numdays.to_i,
17
+ :terrain => $terrain.to_sym
18
+ })
19
+ weather_generator = GreyhawkWeatherGenerator.create_weather_generator options
16
20
 
17
21
  i=0
18
22
  weather_generator.days.each do |d|
@@ -0,0 +1,33 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "greyhawkweather/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "greyhawkweather"
7
+ s.version = Greyhawkweather::VERSION
8
+ s.authors = ["Mark Simpson"]
9
+ s.email = ["verdammelt@gmail.com"]
10
+ s.homepage = ""
11
+ s.summary = %q{Generates randomized weather based upon the 1983 Greyhawk boxed set.}
12
+ s.description = <<-EOF
13
+ Using this gem one can generate randomized weather based upon the
14
+ rules found in the 1983 boxed set.
15
+
16
+ Currently not all features of those rules are applied.
17
+
18
+ Future plans include the ability to choose different months and
19
+ weather chances instead of only those from Greyhawk.
20
+ EOF
21
+
22
+ s.rubyforge_project = "greyhawkweather"
23
+
24
+ s.files = `git ls-files`.split("\n")
25
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
26
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
27
+ s.require_paths = ["lib"]
28
+
29
+ # specify any dependencies here; for example:
30
+ s.add_dependency "rangehash", ">=0.0.5"
31
+ s.add_development_dependency "rspec"
32
+ s.add_development_dependency "rcov"
33
+ end
data/lib/baselinedata.rb CHANGED
@@ -1,5 +1,3 @@
1
- require 'YAML' unless defined? YAML
2
-
3
1
  require 'temperaturerange'
4
2
  require 'skyconditions'
5
3
  require 'month'
@@ -18,7 +16,7 @@ class BaselineData
18
16
  end
19
17
 
20
18
  def month(monthnum)
21
- month_data = @all_data[monthnum -1]
19
+ month_data = @all_data[monthnum - 1]
22
20
  Month.new(month_data[:temp_range], make_skyconditions(month_data[:sky_conditions]), month_data[:precipitation_chance])
23
21
  end
24
22
 
@@ -1,6 +1,5 @@
1
1
  $:.unshift(File.dirname(__FILE__)) unless
2
2
  $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
3
3
 
4
- module Greyhawkweather
5
- VERSION = '0.0.6'
6
- end
4
+ require 'greyhawkweather/version'
5
+
@@ -0,0 +1,4 @@
1
+
2
+ module Greyhawkweather
3
+ VERSION = '0.0.7'
4
+ end
@@ -1,15 +1,13 @@
1
1
  require 'baselinedata'
2
2
  require 'util/dieroller'
3
3
  require 'weathergenerator'
4
+ require 'options'
4
5
 
5
6
  class GreyhawkWeatherGenerator
6
- def self.create_weather_generator (month_index, num_days = 1, dieroller = DieRoller.new, terrain = :plains)
7
+ def self.create_weather_generator (options)
7
8
  WeatherGenerator.new(BaselineData.load("data/baselinedata.yml"),
8
- PrecipitationOccurance.load("data/precipitationoccurance.yml"),
9
- month_index,
10
- num_days,
11
- dieroller,
12
- terrain)
9
+ PrecipitationOccurance.load("data/precipitationoccurance.yml"),
10
+ options)
13
11
  end
14
12
  end
15
13
 
data/lib/options.rb ADDED
@@ -0,0 +1,15 @@
1
+ require 'util/dieroller'
2
+
3
+ class WeatherGeneratorOptions
4
+ attr_reader :month
5
+ attr_reader :num_days
6
+ attr_reader :dieroller
7
+ attr_reader :terrain
8
+
9
+ def initialize (args = {})
10
+ @month = args.fetch(:month, 1)
11
+ @num_days = args.fetch(:num_days, 28)
12
+ @dieroller = args.fetch(:dieroller, DieRoller.new)
13
+ @terrain = args.fetch(:terrain, :plains)
14
+ end
15
+ end
@@ -67,17 +67,21 @@ class PrecipitationOccurance < RangeHash
67
67
  end
68
68
 
69
69
  def line_above(precip_info)
70
- prev_key = sorted_keys[[0,index_of_precip(precip_info)-1].max]
70
+ current_index = index_of_precip(precip_info) || 0
71
+ prev_key = sorted_keys[[0,current_index-1].max]
71
72
  self[prev_key]
72
73
  end
73
74
 
74
75
  def line_below(precip_info)
75
- next_key = sorted_keys[[sorted_keys.length,index_of_precip(precip_info)+1].min]
76
+ current_index = index_of_precip(precip_info) || sorted_keys.length
77
+ index = [sorted_keys.length,current_index+1].min
78
+ next_key = sorted_keys[index]
76
79
  self[next_key]
77
80
  end
78
81
 
79
82
  def index_of_precip(precip_info)
80
- key = index(precip_info)
81
- index_of_key = sorted_keys.index(key)
83
+ pair = select {|k, v| v == precip_info }.first
84
+ key = pair.first
85
+ index_of_key = sorted_keys.index(key)
82
86
  end
83
87
  end
@@ -2,18 +2,20 @@ require 'month'
2
2
  require 'precipitationoccurance'
3
3
  require 'precipitationinfo'
4
4
  require 'wind'
5
+ require 'util/dieroller'
5
6
 
6
7
  class SingleDayWeather
7
8
  attr_reader :temperature_range
8
9
  attr_reader :sky_conditions
9
10
  attr_reader :precipitation
10
11
  attr_reader :wind
11
-
12
+
12
13
  def initialize (month, dieroller,
13
14
  precipitation_occurance_chart=PrecipitationOccurance.new({ 0..100 => NullPrecipitationInfo.new() }),
14
15
  record_temp=nil,
15
- terrain = :plains)
16
- @temperature_range = month.temp_range(dieroller, record_temp)
16
+ terrain = :plains,
17
+ latitude = 40)
18
+ @temperature_range = adjust_for_latitude(month.temp_range(dieroller, record_temp), latitude)
17
19
  @sky_conditions = month.sky_conditions(dieroller)
18
20
  @record_temp = record_temp
19
21
  @precipitation =
@@ -25,5 +27,11 @@ class SingleDayWeather
25
27
  def inspect
26
28
  "#{@record_temp} #{@temperature_range} #{@sky_conditions} #{@precipitation} #{@wind}"
27
29
  end
30
+
31
+ private
32
+ def adjust_for_latitude (range, latitude)
33
+ adjustment = (latitude-40)*2
34
+ Range.new(range.first+adjustment, range.last+adjustment)
35
+ end
28
36
  end
29
37
 
data/lib/skyconditions.rb CHANGED
@@ -4,7 +4,7 @@ class SkyConditions
4
4
  def initialize (clear_range, partly_range, cloudy_range)
5
5
  hash = { clear_range => :clear, partly_range => :partly_cloudy, cloudy_range => :cloudy}
6
6
  @condition_ranges = RangeHash.new(:none)
7
- @condition_ranges.merge!(hash)
7
+ @condition_ranges.merge! hash
8
8
  end
9
9
 
10
10
  def condition(roller)
@@ -15,10 +15,18 @@ class TemperatureRange
15
15
  record = make_record_array record
16
16
 
17
17
  base = @base
18
- base = base + (record.find_all{ |r| r == :high}.length * (@high_adj[0] + @high_adj[1]))
19
- base = base - (record.find_all{ |r| r == :low}.length * (@low_adj[0] + @low_adj[1]))
18
+ base = base + record_adjustment(record, :high, @high_adj)
19
+ base = base - record_adjustment(record, :low, @low_adj)
20
20
  base
21
21
  end
22
+
23
+ def count_records(record, type)
24
+ record.find_all{|r| r == type}.length
25
+ end
26
+
27
+ def record_adjustment(record, type, adjustment_values)
28
+ (count_records(record, type) * (adjustment_values[0] + adjustment_values[1]))
29
+ end
22
30
 
23
31
  def make_record_array(record)
24
32
  ((record.class == Array) ? record : [record])
@@ -1,11 +1,11 @@
1
1
  class DieRoller
2
- def roll(nSides, modifier=0)
3
- rand(nSides) + 1 + modifier
2
+ def roll(num_sides, modifier=0)
3
+ rand(num_sides) + 1 + modifier
4
4
  end
5
5
  end
6
6
 
7
7
  class NullDieRoller
8
- def roll(nSides, modifier=0)
8
+ def roll(num_sides, modifier=0)
9
9
  -1
10
10
  end
11
11
  end
@@ -3,9 +3,11 @@ require 'singledayweather'
3
3
  class WeatherGenerator
4
4
  attr_reader :days
5
5
 
6
- def initialize (baselinedata, precipitation_occurance_chart, month_index, num_days, dieroller, terrain = :plains)
7
- month_for_each_day = make_months_for_days_array(baselinedata, month_index, num_days)
8
- @days = month_for_each_day.map { |month| make_weather month, dieroller, precipitation_occurance_chart, terrain}
6
+ def initialize (baselinedata, precipitation_occurance_chart, options)
7
+ month_for_each_day = make_months_for_days_array(baselinedata, options.month, options.num_days)
8
+ @days = month_for_each_day.map do |month|
9
+ make_weather month, options.dieroller, precipitation_occurance_chart, options.terrain
10
+ end
9
11
  end
10
12
 
11
13
  private
@@ -31,14 +33,18 @@ class WeatherGenerator
31
33
  SingleDayWeather.new(month, dieroller, precipitation_occurance_chart, check_record_high_low(dieroller), terrain)
32
34
  end
33
35
 
36
+ RECORD_HIGH_LOW_RANGES = {
37
+ 1 => [:low, :low, :low],
38
+ 2 => [:low, :low],
39
+ 3..4 => :low,
40
+ 97..98 => :high,
41
+ 99 => [:high, :high],
42
+ 100 => [:high, :high, :high]
43
+ }
44
+
34
45
  def check_record_high_low(dieroller)
35
46
  record_high_low_range = RangeHash.new(:normal)
36
- record_high_low_range.merge!({ 1 => [:low, :low, :low],
37
- 2 => [:low, :low],
38
- 3..4 => :low,
39
- 97..98 => :high,
40
- 99 => [:high, :high],
41
- 100 => [:high, :high, :high]})
47
+ record_high_low_range.merge!(RECORD_HIGH_LOW_RANGES)
42
48
  record_high_low_range[dieroller.roll(100)]
43
49
  end
44
50
  end
data/lib/wind.rb CHANGED
@@ -1,8 +1,10 @@
1
1
 
2
2
  class Wind
3
+ DIRECTIONS = [:N, :NE, :E, :SE, :S, :SW, :W, :NW]
4
+
3
5
  def initialize(dieroller)
4
6
  @speed = dieroller.roll(20, -1)
5
- @direction = [:N, :NE, :E, :SE, :S, :SW, :W, :NW][dieroller.roll(8, -1)]
7
+ @direction = DIRECTIONS[dieroller.roll(8, -1)]
6
8
  end
7
9
 
8
10
  def to_s
@@ -0,0 +1,52 @@
1
+ require 'spec_helper'
2
+ require 'greyhawkweathergenerator'
3
+
4
+ describe "Acceptance Tests" do
5
+ context GreyhawkWeatherGenerator do
6
+ let(:roller) do
7
+ avg_roller_mock
8
+ end
9
+
10
+ context "generates weather with" do
11
+ let(:options) { WeatherGeneratorOptions.new({:month => 4, :num_days => 1, :dieroller => roller}) }
12
+ let(:weather) { GreyhawkWeatherGenerator.create_weather_generator(options).days[0] }
13
+ subject { weather }
14
+ its(:temperature_range) { should == (44..63) }
15
+ its(:sky_conditions) { should == :partly_cloudy }
16
+
17
+ its(:precipitation) { should be_a_kind_of(Array) }
18
+ its(:precipitation) { should be }
19
+
20
+ describe "precipation" do
21
+ subject { weather.precipitation[0] }
22
+ it { should be_a_kind_of(Precipitation) }
23
+ its(:name) { should == NullPrecipitationInfo.new.name }
24
+ end
25
+ end
26
+
27
+ it "should generate multiple days" do
28
+ num_days = 3
29
+ options = WeatherGeneratorOptions.new({:dieroller => roller, :num_days => num_days})
30
+ generator = GreyhawkWeatherGenerator.create_weather_generator(options)
31
+
32
+ generator.days.should have(num_days).items
33
+ generator.days.should_not include(nil)
34
+ end
35
+
36
+ it "generates weather for the given month" do
37
+ options = WeatherGeneratorOptions.new({:dieroller => roller, :month => 8})
38
+ generator = GreyhawkWeatherGenerator.create_weather_generator(options)
39
+ weather = generator.days[0]
40
+ weather.temperature_range.should eq((66..83))
41
+ weather.sky_conditions.should eq(:partly_cloudy)
42
+ end
43
+
44
+ it "generates weather given a terrain" do
45
+ roller = rigged_roller_mock 1
46
+ options = WeatherGeneratorOptions.new({:dieroller => roller, :terrain => :desert})
47
+ generator = GreyhawkWeatherGenerator.create_weather_generator(options)
48
+ weather = generator.days[0]
49
+ weather.precipitation[0].name.should == NullPrecipitationInfo.new().name
50
+ end
51
+ end
52
+ end