regentanz 0.3.3 → 1.0.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.
Files changed (50) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +268 -0
  3. data/bin/regentanz +16 -0
  4. data/lib/regentanz.rb +10 -11
  5. data/lib/regentanz/cli/common.rb +35 -0
  6. data/lib/regentanz/cli/compare.rb +85 -0
  7. data/lib/regentanz/cli/compile.rb +27 -0
  8. data/lib/regentanz/template_compiler.rb +263 -0
  9. data/lib/regentanz/version.rb +1 -2
  10. data/lib/regentanz/yaml-ext.rb +18 -0
  11. data/spec/regentanz/resources/test/unloaded.rb +11 -0
  12. data/spec/regentanz/template_compiler_spec.rb +692 -0
  13. data/spec/spec_helper.rb +2 -0
  14. metadata +45 -152
  15. data/.gitignore +0 -5
  16. data/.rvmrc +0 -4
  17. data/CHANGELOG.rdoc +0 -26
  18. data/Gemfile +0 -4
  19. data/LICENSE +0 -24
  20. data/README.rdoc +0 -54
  21. data/Rakefile +0 -23
  22. data/lib/regentanz/astronomy.rb +0 -69
  23. data/lib/regentanz/cache.rb +0 -2
  24. data/lib/regentanz/cache/base.rb +0 -51
  25. data/lib/regentanz/cache/file.rb +0 -86
  26. data/lib/regentanz/callbacks.rb +0 -18
  27. data/lib/regentanz/conditions.rb +0 -3
  28. data/lib/regentanz/conditions/base.rb +0 -16
  29. data/lib/regentanz/conditions/current.rb +0 -14
  30. data/lib/regentanz/conditions/forecast.rb +0 -14
  31. data/lib/regentanz/configuration.rb +0 -55
  32. data/lib/regentanz/configurator.rb +0 -22
  33. data/lib/regentanz/google_weather.rb +0 -151
  34. data/lib/regentanz/parser.rb +0 -1
  35. data/lib/regentanz/parser/google_weather.rb +0 -100
  36. data/lib/regentanz/test_helper.rb +0 -52
  37. data/regentanz.gemspec +0 -30
  38. data/test/factories.rb +0 -6
  39. data/test/support/tmp/.gitignore +0 -1
  40. data/test/support/valid_response.xml.erb +0 -26
  41. data/test/test_helper.rb +0 -14
  42. data/test/unit/astronomy_test.rb +0 -26
  43. data/test/unit/cache/base_test.rb +0 -53
  44. data/test/unit/cache/file_test.rb +0 -141
  45. data/test/unit/callbacks_test.rb +0 -27
  46. data/test/unit/configuration_test.rb +0 -57
  47. data/test/unit/current_condition_test.rb +0 -33
  48. data/test/unit/forecast_condition_test.rb +0 -35
  49. data/test/unit/google_weather_test.rb +0 -125
  50. data/test/unit/parser/google_weather_parser_test.rb +0 -71
@@ -1,27 +0,0 @@
1
- require File.join(File.dirname(__FILE__), '..', 'test_helper')
2
-
3
- class CallbacksTest < ActiveSupport::TestCase
4
-
5
- def setup
6
- @object = Object.new
7
- @object.extend Regentanz::Callbacks
8
- end
9
-
10
- def test_should_define_constant
11
- assert Regentanz::Callbacks::CALLBACKS
12
- expected_callbacks = [:api_failure_detected, :api_failure_resumed]
13
- assert_equal expected_callbacks, Regentanz::Callbacks::CALLBACKS
14
- end
15
-
16
- def test_google_weather_should_include_callbacks
17
- assert Regentanz::GoogleWeather.included_modules.include?(Regentanz::Callbacks)
18
- assert Regentanz::GoogleWeather.included_modules.include?(ActiveSupport::Callbacks)
19
- end
20
-
21
- def test_should_define_each_callback_method
22
- Regentanz::Callbacks::CALLBACKS.each do |callback_method|
23
- assert @object.private_methods.include?(callback_method.to_s), "#{callback_method} not defined"
24
- end
25
- end
26
-
27
- end
@@ -1,57 +0,0 @@
1
- require File.join(File.dirname(__FILE__), '..', 'test_helper')
2
- require "tmpdir"
3
-
4
- class ConfigurationTest < ActiveSupport::TestCase
5
-
6
- test "should configure Regentanz" do
7
- assert_respond_to Regentanz, :configure
8
- assert_respond_to Regentanz, :configuration
9
- assert_not_nil Regentanz.configuration
10
-
11
- Regentanz.configure do |config|
12
- config.do_not_get_weather = true
13
- end
14
- assert_not_nil Regentanz.configuration
15
- assert Regentanz.configuration.do_not_get_weather
16
- end
17
-
18
- test "should have configuration" do
19
- configuration_options = [
20
- :base_url,
21
- :cache_backend,
22
- :cache_dir,
23
- :cache_prefix,
24
- :cache_ttl,
25
- :retry_marker,
26
- :retry_ttl,
27
- :do_not_get_weather,
28
- :suppress_stderr_output
29
- ]
30
- assert_equal configuration_options, Regentanz::Configuration::OPTIONS, "Diff: #{configuration_options - Regentanz::Configuration::OPTIONS}"
31
- obj = Regentanz::Configuration.new
32
- configuration_options.each do |config_option|
33
- assert_respond_to obj, config_option
34
- end
35
- end
36
-
37
- test "every DEFAULT_OPTION should have a cattr_accessor" do
38
- assert_not_nil Regentanz::Configuration::DEFAULT_OPTIONS
39
- Regentanz::Configuration::DEFAULT_OPTIONS.each do |config_option|
40
- assert_respond_to Regentanz::Configuration, :"default_#{config_option}"
41
- assert_not_nil Regentanz::Configuration.send(:"default_#{config_option}")
42
- end
43
-
44
- end
45
-
46
- test "instance should have sane defaults" do
47
- obj = Regentanz::Configuration.new
48
- tmpdir = Dir.tmpdir
49
- assert_equal "http://www.google.com/ig/api", obj.base_url
50
- assert_equal "#{tmpdir}", obj.cache_dir
51
- assert_equal "regentanz", obj.cache_prefix
52
- assert_equal 14400, obj.cache_ttl
53
- assert_equal 3600, obj.retry_ttl
54
- assert_equal "#{tmpdir}/regentanz_api_retry.txt", obj.retry_marker
55
- end
56
-
57
- end
@@ -1,33 +0,0 @@
1
- require File.join(File.dirname(__FILE__), '..', 'test_helper')
2
-
3
- class CurrentConditionTest < ActiveSupport::TestCase
4
-
5
- test "should define setters and getters" do
6
- obj = Regentanz::Conditions::Current.new
7
- [:condition, :style, :icon, :humidity, :wind_condition, :temp_c, :temp_f].each do |attr|
8
- assert_respond_to obj, attr
9
- assert_respond_to obj, :"#{attr}="
10
- end
11
- end
12
-
13
- test "should initialize with attributes hash" do
14
- attributes = {
15
- "condition" => "Klar",
16
- "temp_f" => "77",
17
- "temp_c" => "25",
18
- "humidity" => "Feuchtigkeit: 57 %",
19
- "icon" => "http://www.google.com/ig/images/weather/sunny.gif",
20
- "style" => "sunny",
21
- "wind_condition" => "Wind: W mit 24 km/h"
22
- }
23
- obj = Regentanz::Conditions::Current.new(attributes)
24
- assert_equal "Klar", obj.condition
25
- assert_equal 77, obj.temp_f
26
- assert_equal 25, obj.temp_c
27
- assert_equal "Feuchtigkeit: 57 %", obj.humidity
28
- assert_equal "http://www.google.com/ig/images/weather/sunny.gif", obj.icon
29
- assert_equal "sunny", obj.style
30
- assert_equal "Wind: W mit 24 km/h", obj.wind_condition
31
- end
32
-
33
- end
@@ -1,35 +0,0 @@
1
- require File.join(File.dirname(__FILE__), '..', 'test_helper')
2
-
3
- class ForecastConditionTest < ActiveSupport::TestCase
4
-
5
- def setup
6
- @object = Regentanz::Conditions::Forecast.new
7
- end
8
-
9
- test "should define setters and getters" do
10
- [:condition, :style, :icon, :day_of_week, :high, :low].each do |attr|
11
- assert_respond_to @object, attr
12
- assert_respond_to @object, :"#{attr}="
13
- end
14
- end
15
-
16
- test "should initialize with attributes hash" do
17
- attributes = {
18
- "high" => "31",
19
- "condition" => "Vereinzelt Regen",
20
- "icon" => "http://www.google.com/ig/images/weather/chance_of_rain.gif",
21
- "day_of_week" =>"Do.",
22
- "low" => "16",
23
- "style" => "chance-of-rain"
24
- }
25
-
26
- obj = Regentanz::Conditions::Forecast.new(attributes)
27
- assert_equal 31, obj.high
28
- assert_equal "Vereinzelt Regen", obj.condition
29
- assert_equal "http://www.google.com/ig/images/weather/chance_of_rain.gif", obj.icon
30
- assert_equal "Do.", obj.day_of_week
31
- assert_equal 16, obj.low
32
- assert_equal "chance-of-rain", obj.style
33
- end
34
-
35
- end
@@ -1,125 +0,0 @@
1
- require File.join(File.dirname(__FILE__), '..', 'test_helper')
2
-
3
- class GoogleWeatherTest < ActiveSupport::TestCase
4
-
5
- TEST_CACHE_FILE_NAME = File.join(Regentanz.configuration.cache_dir, "regentanz_test.xml")
6
-
7
- def setup
8
- setup_regentanz_test_configuration!
9
- end
10
-
11
- def teardown
12
- Dir.glob(File.join(Regentanz.configuration.cache_dir, "**", "*")).each { |file| File.delete(file) }
13
- end
14
-
15
- test "should initialize with options hash" do
16
- Regentanz::GoogleWeather.any_instance.expects(:get_weather).never()
17
- options = { :location => "Test Valley", :lang => "es" }
18
- obj = Regentanz::GoogleWeather.new(options)
19
- assert_equal "Test Valley", obj.location
20
- assert_equal "es", obj.lang
21
- end
22
-
23
- test "should be compatible with old constructor" do
24
- Regentanz::GoogleWeather.any_instance.expects(:get_weather).never()
25
- obj = Factory(:google_weather, :location => "Test Valley")
26
- assert_equal "Test Valley", obj.location
27
- assert_equal "de", obj.lang
28
- end
29
-
30
- test "should have cache instance" do
31
- obj = Factory(:google_weather)
32
- assert_respond_to obj, :cache
33
- assert_kind_of Regentanz.configuration.cache_backend, obj.cache
34
- end
35
-
36
- test "should enter retry state if invalid xml file has been found" do
37
- stub_valid_xml_api_response!
38
- Regentanz::GoogleWeather.any_instance.expects(:api_failure_detected) # callback
39
-
40
- weather = Factory(:google_weather)
41
- assert !weather.waiting_for_retry?
42
- create_invalid_xml_response(TEST_CACHE_FILE_NAME)
43
-
44
- weather.get_weather!
45
- assert weather.waiting_for_retry?
46
- end
47
-
48
- test "should leave retry state remove invalid cache file when retry_ttl waittime is over" do
49
- File.new(Regentanz.configuration.retry_marker, "w+").close
50
- assert File.exists?(Regentanz.configuration.retry_marker) # ensure test setup
51
- Regentanz.configuration.retry_ttl = 0; sleep 0.1
52
- Regentanz::GoogleWeather.any_instance.expects(:api_failure_resumed) # callback
53
-
54
- create_invalid_xml_response(TEST_CACHE_FILE_NAME)
55
- weather = Factory(:google_weather)
56
-
57
- weather.get_weather!
58
- assert !weather.waiting_for_retry?
59
- end
60
-
61
- test "should have lang option" do
62
- weather = Factory(:google_weather, :lang => :es)
63
- assert_equal "es", weather.lang
64
- end
65
-
66
- def test_should_calculate_sunrise_and_sunset_based_on_geodata
67
- weather = Regentanz::GoogleWeather.new("Berlin", weather_options(:geo_location => nil) )
68
- assert weather.respond_to? :sunrise
69
- assert weather.respond_to? :sunset
70
- assert_nil weather.sunrise
71
- assert_nil weather.sunset
72
-
73
- lat = 52.5163253260716
74
- lng = 13.3780860900879
75
-
76
- weather = Regentanz::GoogleWeather.new("Berlin", weather_options(:geodata => {:lat => lat, :lng => lng}) )
77
- assert weather.sunrise.is_a? Time
78
- assert weather.sunset.is_a? Time
79
- end
80
-
81
- test "should set default cache_id by location" do
82
- obj = Regentanz::GoogleWeather.new(:location => "Test Valley", :cache_id => nil)
83
- assert_not_nil obj.cache_id
84
- end
85
-
86
- test "should work with caching disabled" do
87
- Regentanz.configuration.cache_backend = nil
88
- stub_valid_xml_api_response!
89
- obj = Factory(:google_weather, :cache_id => nil)
90
- assert_nil obj.cache
91
- obj.get_weather!
92
- end
93
-
94
- test "should delegate retry state to cache instance" do
95
- obj = Factory(:google_weather)
96
- assert_respond_to obj, :waiting_for_retry?
97
- assert_not_nil obj.cache
98
- assert !obj.waiting_for_retry?
99
- obj.cache.expects(:waiting_for_retry?).returns(true)
100
- assert obj.waiting_for_retry?
101
- end
102
-
103
- test "should respond_to present?" do
104
- obj = Factory(:google_weather)
105
- assert_respond_to obj, :present?
106
-
107
- Regentanz::GoogleWeather.any_instance.expects(:current).returns(nil)
108
- Regentanz::GoogleWeather.any_instance.expects(:forecast).returns(nil)
109
- assert_equal false, obj.present?
110
-
111
- Regentanz::GoogleWeather.any_instance.expects(:current).returns(nil)
112
- Regentanz::GoogleWeather.any_instance.expects(:forecast).returns(true)
113
- assert_equal true, obj.present?
114
- Regentanz::GoogleWeather.any_instance.expects(:current).returns(true)
115
- assert_equal true, obj.present?
116
- end
117
-
118
- private
119
-
120
- # Return a few default options for the test environment
121
- def weather_options(options = {})
122
- {:cache_id => "test"}.merge(options.symbolize_keys!)
123
- end
124
-
125
- end
@@ -1,71 +0,0 @@
1
- require File.join(File.dirname(__FILE__), '..', '..', 'test_helper')
2
-
3
- class GoogleWeatherParserTest < ActiveSupport::TestCase
4
-
5
- def setup
6
- setup_regentanz_test_configuration!
7
- end
8
-
9
- test "should have parser instance" do
10
- obj = Regentanz::GoogleWeather.new
11
- assert_respond_to obj, :parser
12
- assert_not_nil obj.parser
13
- assert_kind_of Regentanz::Parser::GoogleWeather, obj.parser
14
- end
15
-
16
- test "should convert encoding" do
17
- obj = Regentanz::Parser::GoogleWeather.new
18
- assert_respond_to obj, :convert_encoding
19
- assert_nil obj.convert_encoding(nil)
20
- assert_nil obj.convert_encoding("")
21
- # FIXME test actual conversion
22
- end
23
-
24
- test "should parse xml for current condition" do
25
- obj = Regentanz::Parser::GoogleWeather.new
26
- assert_respond_to obj, :parse_current!
27
- assert_nil obj.parse_current!(nil)
28
- assert_nil obj.parse_current!("")
29
-
30
- xml = valid_xml_response
31
- parsed = obj.parse_current!(xml)
32
- assert_kind_of Regentanz::Conditions::Current, parsed
33
- assert_equal "Feuchtigkeit: 57 %", parsed.humidity
34
- assert_equal "Wind: W mit 24 km/h", parsed.wind_condition
35
- assert_equal 25, parsed.temp_c
36
- assert_equal 77, parsed.temp_f
37
- assert_equal "http://www.google.com/ig/images/weather/sunny.gif", parsed.icon
38
- assert_equal "Klar", parsed.condition
39
- end
40
-
41
- test "should rescue current condition parsing from parse erros" do
42
- obj = Regentanz::Parser::GoogleWeather.new
43
- xml = invalid_xml_response
44
- assert_nothing_raised { assert_nil obj.parse_current!(xml) }
45
- end
46
-
47
- test "should parse xml for forecast" do
48
- obj = Regentanz::Parser::GoogleWeather.new
49
- assert_respond_to obj, :parse_forecast!
50
- assert_nil obj.parse_forecast!(nil)
51
- assert_nil obj.parse_forecast!("")
52
-
53
- xml = valid_xml_response
54
- parsed = obj.parse_forecast!(xml)
55
- assert_kind_of Array, parsed
56
- assert_equal 1, parsed.size
57
- assert_kind_of Regentanz::Conditions::Forecast, parsed.first
58
- assert_equal "Do.", parsed.first.day_of_week
59
- assert_equal 31, parsed.first.high
60
- assert_equal 16, parsed.first.low
61
- assert_equal "http://www.google.com/ig/images/weather/chance_of_rain.gif", parsed.first.icon
62
- assert_equal "Vereinzelt Regen", parsed.first.condition
63
- end
64
-
65
- test "should rescue forecast parsing from parse erros" do
66
- obj = Regentanz::Parser::GoogleWeather.new
67
- xml = invalid_xml_response
68
- assert_nothing_raised { assert_nil obj.parse_forecast!(xml) }
69
- end
70
-
71
- end