brighter_planet_metadata 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,4 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in brighter_planet_metadata.gemspec
4
+ gemspec
@@ -0,0 +1,10 @@
1
+ require 'bundler'
2
+ Bundler::GemHelper.install_tasks
3
+
4
+ require 'rake'
5
+ require 'rake/testtask'
6
+ Rake::TestTask.new(:test) do |test|
7
+ test.libs << 'lib' << 'test'
8
+ test.pattern = 'test/**/test_*.rb'
9
+ test.verbose = true
10
+ end
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "brighter_planet_metadata"
@@ -0,0 +1,34 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "brighter_planet_metadata/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "brighter_planet_metadata"
7
+ s.version = BrighterPlanetMetadata::VERSION
8
+ s.platform = Gem::Platform::RUBY
9
+ s.authors = ["Seamus Abshere"]
10
+ s.email = ["seamus@abshere.net"]
11
+ s.homepage = ""
12
+ s.summary = %q{Names of Brighter Planet things}
13
+ s.description = %q{What emitters (carbon models), resources (data classes), datasets, etc. we offer.}
14
+
15
+ s.rubyforge_project = "brighter_planet_metadata"
16
+
17
+ s.files = `git ls-files`.split("\n")
18
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
19
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
20
+ s.require_paths = ["lib"]
21
+ s.add_dependency 'eat'
22
+ s.add_dependency 'activesupport', '>=2.3.4'
23
+ s.add_dependency 'i18n' # activesupport?
24
+ s.add_development_dependency 'fakeweb'
25
+ s.add_development_dependency 'test-unit'
26
+ s.add_development_dependency 'fakefs'
27
+ s.add_development_dependency 'earth'
28
+ if RUBY_VERSION > '1.9'
29
+ s.add_development_dependency 'ruby-debug19'
30
+ else
31
+ s.add_development_dependency 'fastercsv' # earth
32
+ s.add_development_dependency 'ruby-debug'
33
+ end
34
+ end
@@ -0,0 +1,23 @@
1
+ module BrighterPlanet
2
+ autoload :Metadata, 'brighter_planet_metadata/metadata'
3
+ def self.metadata
4
+ Metadata.instance
5
+ end
6
+ end
7
+
8
+ # sabshere 2/2/11 in case we ever want to define these directly on BrighterPlanet
9
+ # %w{
10
+ # datasets
11
+ # beta_datasets
12
+ # emitters
13
+ # beta_emitters
14
+ # certified_emitters
15
+ # resources
16
+ # beta_resources
17
+ # }.each do |method_id|
18
+ # eval %{
19
+ # def self.#{method_id}
20
+ # Metadata.instance.#{method_id}
21
+ # end
22
+ # }
23
+ # end
@@ -0,0 +1,40 @@
1
+ require 'singleton'
2
+ module BrighterPlanet
3
+ class Metadata
4
+ class Cm1Adapter
5
+ include ::Singleton
6
+ def authority?(universe, method_id)
7
+ return unless universe == 'cm1_production'
8
+ method_id = method_id.to_s
9
+ if method_id == 'certified_emitters'
10
+ defined?(::Rails) and ::Rails.application.certified?
11
+ else
12
+ respond_to? method_id
13
+ end
14
+ end
15
+ def emitters
16
+ undifferentiated_emitters - beta_emitters
17
+ end
18
+ def beta_emitters
19
+ undifferentiated_emitters.select do |name|
20
+ begin
21
+ "::BrighterPlanet::#{name}::BETA".constantize == true
22
+ rescue ::NameError
23
+ false
24
+ end
25
+ end
26
+ end
27
+ def certified_emitters
28
+ emitters
29
+ end
30
+ private
31
+ def undifferentiated_emitters
32
+ ary = []
33
+ ::ObjectSpace.each_object(::BrighterPlanet::Emitter) do |obj|
34
+ ary.push obj.name.demodulize
35
+ end
36
+ ary
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,43 @@
1
+ require 'singleton'
2
+ module BrighterPlanet
3
+ class Metadata
4
+ class Data1Adapter
5
+ include ::Singleton
6
+ def authority?(universe, method_id)
7
+ return unless universe == 'data1_production'
8
+ respond_to? method_id
9
+ end
10
+ def resources
11
+ undifferentiated_resources - beta_resources
12
+ end
13
+ def beta_resources
14
+ undifferentiated_resources.select do |name|
15
+ begin
16
+ "::#{name}::BETA".constantize == true
17
+ rescue ::NameError
18
+ false
19
+ end
20
+ end
21
+ end
22
+ def datasets
23
+ undifferentiated_datasets - beta_datasets
24
+ end
25
+ def beta_datasets
26
+ undifferentiated_datasets.select do |name|
27
+ begin
28
+ "::#{name}::BETA".constantize == true
29
+ rescue ::NameError
30
+ false
31
+ end
32
+ end
33
+ end
34
+ private
35
+ def undifferentiated_resources
36
+ ::Dir[::File.expand_path(::File.join(::File.dirname(::Gem.required_location('earth', 'earth.rb')), 'earth', '**', '*.rb'))].select { |f| ::File.read(f) =~ /class [\:A-Za-z0-9]+ < ActiveRecord::Base/ }.map { |path| ::File.basename(path, '.rb').camelcase }.sort
37
+ end
38
+ def undifferentiated_datasets
39
+ ::Dir[::File.expand_path(::File.join(::Rails.root, 'app', 'models', '**', '*.rb'))].select { |f| ::File.read(f) =~ /class [\:A-Za-z0-9]+ < Dataset/ }.map { |path| ::File.basename(path, '.rb').camelcase }.sort
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,126 @@
1
+ require 'singleton'
2
+ require 'eat'
3
+ require 'active_support'
4
+ require 'active_support/version'
5
+ %w{
6
+ active_support/json
7
+ active_support/core_ext/object/blank
8
+ }.each do |active_support_3_requirement|
9
+ require active_support_3_requirement
10
+ end if ::ActiveSupport::VERSION::MAJOR == 3
11
+
12
+ module BrighterPlanet
13
+ class Metadata
14
+ include ::Singleton
15
+ LIVE_URL = {
16
+ 'datasets' => 'http://data.brighterplanet.com/datasets.json',
17
+ 'beta_datasets' => 'http://data.brighterplanet.com/datasets.json',
18
+ 'emitters' => 'http://carbon.brighterplanet.com/emitters.json',
19
+ 'beta_emitters' => 'http://carbon.brighterplanet.com/emitters.json',
20
+ 'certified_emitters' => 'http://certified.carbon.brighterplanet.com/emitters.json',
21
+ 'resources' => 'http://data.brighterplanet.com/resources.json',
22
+ 'beta_resources' => 'http://data.brighterplanet.com/resources.json',
23
+ }.freeze
24
+
25
+ # sabshere 2/2/11 fallbacks current as of today
26
+ FALLBACK = {
27
+ 'datasets' => %w{ },
28
+ 'beta_datasets' => %w{ AutomobileIndustry FlightIndustry },
29
+ 'emitters' => %w{ Automobile AutomobileTrip BusTrip Computation Diet Flight FuelPurchase Lodging Meeting Motorcycle Pet Purchase RailTrip Residence Shipment },
30
+ 'beta_emitters' => %w{ },
31
+ 'certified_emitters' => %w{ },
32
+ 'resources' => %w{ AirConditionerUse Aircraft AircraftClass AircraftManufacturer Airline Airport AutomobileFuelType AutomobileMake AutomobileMakeFleetYear AutomobileMakeModel AutomobileMakeModelYear AutomobileMakeModelYearVariant AutomobileMakeYear AutomobileSizeClass AutomobileSizeClassYear AutomobileTypeFuelAge AutomobileTypeFuelControl AutomobileTypeFuelYear AutomobileTypeFuelYearControl AutomobileTypeYear Breed BreedGender BusClass Carrier CarrierMode CensusDivision CensusRegion ClimateDivision ClothesMachineUse ComputationPlatform Country DataCenterCompany DietClass DishwasherUse EgridRegion EgridSubregion FlightDistanceClass FlightFuelType FlightSeatClass FlightSegment FoodGroup FuelPrice FuelType FuelYear Gender GreenhouseGas Industry IndustryProduct IndustryProductLine IndustrySector LodgingClass Merchant MerchantCategory MerchantCategoryIndustry PetroleumAdministrationForDefenseDistrict ProductLine ProductLineIndustryProduct RailClass ResidenceAppliance ResidenceClass ResidenceFuelPrice ResidenceFuelType ResidentialEnergyConsumptionSurveyResponse Sector ServerType ServerTypeAlias ShipmentMode Species State Urbanity ZipCode },
33
+ 'beta_resources' => %w{ },
34
+ }.freeze
35
+
36
+ # What beta_resources are available.
37
+ def beta_resources
38
+ authoritative_list_or_fallback 'beta_resources'
39
+ end
40
+
41
+ # What resources are available.
42
+ def resources
43
+ authoritative_list_or_fallback 'resources'
44
+ end
45
+
46
+ # What certified_emitters are available.
47
+ def certified_emitters
48
+ authoritative_list_or_fallback 'certified_emitters'
49
+ end
50
+
51
+ # What beta_emitters are available.
52
+ def beta_emitters
53
+ authoritative_list_or_fallback 'beta_emitters'
54
+ end
55
+
56
+ # What emitters are available.
57
+ def emitters
58
+ authoritative_list_or_fallback 'emitters'
59
+ end
60
+
61
+ # What datasets are available.
62
+ def datasets
63
+ authoritative_list_or_fallback 'datasets'
64
+ end
65
+
66
+ # What beta_datasets are available.
67
+ def beta_datasets
68
+ authoritative_list_or_fallback 'beta_datasets'
69
+ end
70
+
71
+ # Clear out any cached values
72
+ def refresh
73
+ instance_variables.each { |ivar_name| instance_variable_set ivar_name, nil }
74
+ end
75
+
76
+ private
77
+
78
+ autoload :Cm1Adapter, 'brighter_planet_metadata/cm1_adapter'
79
+ def cm1_adapter
80
+ Cm1Adapter.instance
81
+ end
82
+
83
+ autoload :Data1Adapter, 'brighter_planet_metadata/data1_adapter'
84
+ def data1_adapter
85
+ Data1Adapter.instance
86
+ end
87
+
88
+ def adapters
89
+ [ cm1_adapter, data1_adapter ]
90
+ end
91
+
92
+ # A universe of operation, for example an EngineYard AppCloud "environment"
93
+ def universe
94
+ @universe ||= if ::ENV['BRIGHTER_PLANET_METADATA_FORCE_UNIVERSE'].present?
95
+ ::ENV['BRIGHTER_PLANET_METADATA_FORCE_UNIVERSE']
96
+ elsif ::File.readable? '/etc/brighterplanet/universe'
97
+ ::File.read('/etc/brighterplanet/universe').chomp
98
+ else
99
+ 'unknown'
100
+ end
101
+ end
102
+
103
+ # Used internally to pull a live list of emitters/datasets/etc. or fall back to a static one.
104
+ def authoritative_list_or_fallback(k)
105
+ k = k.to_s
106
+ ivar_name = :"@#{k}"
107
+ if cached_v = instance_variable_get(ivar_name) and cached_v.is_a?(::Array)
108
+ return cached_v.map(&:dup) # deep copy of an array with strings
109
+ end
110
+ v = if adapter = adapters.detect { |a| a.authority? universe, k }
111
+ adapter.send k
112
+ else
113
+ begin
114
+ hsh = ::ActiveSupport::JSON.decode eat(LIVE_URL[k])
115
+ raise unless hsh.has_key? k
116
+ hsh[k]
117
+ rescue
118
+ FALLBACK[k]
119
+ end
120
+ end
121
+ raise "Unknown key #{k}" unless v.is_a? ::Array
122
+ instance_variable_set ivar_name, v
123
+ authoritative_list_or_fallback k
124
+ end
125
+ end
126
+ end
@@ -0,0 +1,3 @@
1
+ module BrighterPlanetMetadata
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,45 @@
1
+ require 'rubygems'
2
+ require 'bundler'
3
+ Bundler.setup
4
+ require 'test/unit'
5
+ require 'ruby-debug'
6
+ require 'fakeweb'
7
+ require 'fakefs/safe'
8
+ require 'fileutils'
9
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
10
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
11
+ require 'brighter_planet_metadata'
12
+ class Test::Unit::TestCase
13
+ def setup
14
+ BrighterPlanet.metadata.refresh
15
+ FakeWeb.clean_registry
16
+ FakeWeb.allow_net_connect = false
17
+ Rails.application.certified = false
18
+ Rails.root = nil
19
+ end
20
+ def teardown
21
+ FakeFS::FileSystem.clear
22
+ FakeFS.deactivate!
23
+ FakeWeb.allow_net_connect = true
24
+ Rails.application.certified = false
25
+ Rails.root = nil
26
+ end
27
+ end
28
+
29
+ require 'singleton'
30
+ require 'active_support/core_ext/module'
31
+ module Rails
32
+ mattr_accessor :root
33
+ def self.application
34
+ FakeApplication.instance
35
+ end
36
+ class FakeApplication
37
+ include ::Singleton
38
+ attr_writer :certified
39
+ def certified?
40
+ @certified == true
41
+ end
42
+ end
43
+ end
44
+
45
+ ENV['BRIGHTER_PLANET_METADATA_DEBUG'] = 'true'
@@ -0,0 +1,17 @@
1
+ require 'helper'
2
+
3
+ class TestDeveloperMachine < Test::Unit::TestCase
4
+ def test_developing_cm1_locally
5
+ ENV['BRIGHTER_PLANET_METADATA_FORCE_UNIVERSE'] = 'cm1_production'
6
+ assert_equal 'cm1_production', BrighterPlanet.metadata.send(:universe)
7
+ ensure
8
+ ENV['BRIGHTER_PLANET_METADATA_FORCE_UNIVERSE'] = ''
9
+ end
10
+
11
+ def test_developing_data1_locally
12
+ ENV['BRIGHTER_PLANET_METADATA_FORCE_UNIVERSE'] = 'data1_production'
13
+ assert_equal 'data1_production', BrighterPlanet.metadata.send(:universe)
14
+ ensure
15
+ ENV['BRIGHTER_PLANET_METADATA_FORCE_UNIVERSE'] = ''
16
+ end
17
+ end
@@ -0,0 +1,32 @@
1
+ require 'helper'
2
+
3
+ class TestFallback < Test::Unit::TestCase
4
+ def setup
5
+ super
6
+ FakeWeb.clean_registry
7
+ FakeWeb.allow_net_connect = false
8
+ [
9
+ 'http://data.brighterplanet.com/datasets.json',
10
+ 'http://carbon.brighterplanet.com/emitters.json',
11
+ 'http://certified.carbon.brighterplanet.com/emitters.json',
12
+ 'http://data.brighterplanet.com/resources.json',
13
+ ].each do |url|
14
+ FakeWeb.register_uri :get,
15
+ url,
16
+ :status => ["500", "Urg"],
17
+ :body => nil
18
+ end
19
+ end
20
+
21
+ def test_beta_datasets
22
+ assert ::BrighterPlanet.metadata.beta_datasets.include? 'AutomobileIndustry'
23
+ end
24
+
25
+ def test_emitters
26
+ assert ::BrighterPlanet.metadata.emitters.include? 'AutomobileTrip'
27
+ end
28
+
29
+ def test_resources
30
+ assert ::BrighterPlanet.metadata.resources.include? 'AutomobileMake'
31
+ end
32
+ end
@@ -0,0 +1,59 @@
1
+ require 'helper'
2
+
3
+ module BrighterPlanet
4
+ module Emitter
5
+ end
6
+ module LiveCm1Emitter
7
+ extend BrighterPlanet::Emitter
8
+ end
9
+ module LiveCm1BetaEmitter
10
+ extend BrighterPlanet::Emitter
11
+ BETA = true
12
+ end
13
+ end
14
+
15
+ class TestLiveCm1 < Test::Unit::TestCase
16
+ def setup
17
+ super
18
+ FakeFS.activate!
19
+ FileUtils.mkdir_p '/etc/brighterplanet'
20
+ File.open('/etc/brighterplanet/universe', 'w') { |f| f.write 'cm1_production' }
21
+ end
22
+
23
+ def test_universe
24
+ assert_equal 'cm1_production', ::BrighterPlanet.metadata.send(:universe)
25
+ end
26
+
27
+ def test_authority
28
+ assert ::BrighterPlanet::Metadata::Cm1Adapter.instance.authority?('cm1_production', 'emitters')
29
+
30
+ # you don't have authority to say what's certified...
31
+ assert !::BrighterPlanet::Metadata::Cm1Adapter.instance.authority?('cm1_production', 'certified_emitters')
32
+
33
+ # now you do
34
+ Rails.application.certified = true
35
+ assert ::BrighterPlanet::Metadata::Cm1Adapter.instance.authority?('cm1_production', 'certified_emitters')
36
+ ensure
37
+ Rails.application.certified = false
38
+ end
39
+
40
+ def test_emitters
41
+ assert_equal %w{LiveCm1Emitter}, ::BrighterPlanet.metadata.emitters
42
+ end
43
+
44
+ def test_beta_emitters
45
+ assert_equal %w{LiveCm1BetaEmitter}, ::BrighterPlanet.metadata.beta_emitters
46
+ end
47
+
48
+ def test_what_must_come_from_other_sources
49
+ assert_equal ::BrighterPlanet::Metadata::FALLBACK['certified_emitters'], ::BrighterPlanet.metadata.certified_emitters
50
+ assert_equal ::BrighterPlanet::Metadata::FALLBACK['resources'], ::BrighterPlanet.metadata.resources
51
+ end
52
+
53
+ def test_certified_emitters_as_though_from_certified
54
+ Rails.application.certified = true
55
+ assert_equal %w{LiveCm1Emitter}, ::BrighterPlanet.metadata.certified_emitters
56
+ ensure
57
+ Rails.application.certified = false
58
+ end
59
+ end
@@ -0,0 +1,78 @@
1
+ require 'helper'
2
+ require 'earth'
3
+
4
+ class TestLiveData1 < Test::Unit::TestCase
5
+ def setup
6
+ super
7
+ # get the real gem path so we can fake it in fakefs (/usr/local/rvm/gems/ruby-1.8.7-head/gems/earth-0.3.11/lib/earth)
8
+ earth_gem_path = ::File.expand_path(::File.join(::File.dirname(::Gem.required_location('earth', 'earth.rb')), '..'))
9
+
10
+ FakeFS.activate!
11
+ FileUtils.mkdir_p earth_gem_path
12
+
13
+ # FAKING RESOURCES
14
+ # fake earth.rb so that Gem.required_path can find it
15
+ File.open(File.join(earth_gem_path, 'lib', 'earth.rb'), 'w') { |f| f.write "module Earth; end" }
16
+
17
+ # fake what looks like a resource
18
+ fake_resource_path = File.join earth_gem_path, 'lib', 'earth', 'live_data1_resource.rb'
19
+ File.open(fake_resource_path, 'w') { |f| f.write "class ::LiveData1Resource < ActiveRecord::Base; end"}
20
+ eval File.read(fake_resource_path) unless defined?(::LiveData1Resource)
21
+
22
+ # fake what looks like a beta resource
23
+ fake_beta_resource_path = File.join earth_gem_path, 'lib', 'earth', 'live_data1_beta_resource.rb'
24
+ File.open(fake_beta_resource_path, 'w') { |f| f.write "class ::LiveData1BetaResource < ActiveRecord::Base; BETA = true; end"}
25
+ eval File.read(fake_beta_resource_path) unless defined?(::LiveData1BetaResource)
26
+
27
+ # FAKING DATASETS
28
+ ::Rails.root = '/data/data1/current'
29
+ eval "class ::Dataset; end"
30
+
31
+ # fake what looks like a dataset
32
+ fake_dataset_path = File.join ::Rails.root, 'app', 'models', 'live_data1_dataset.rb'
33
+ File.open(fake_dataset_path, 'w') { |f| f.write "class ::LiveData1Dataset < Dataset; end"}
34
+ eval File.read(fake_dataset_path) unless defined?(::LiveData1Dataset)
35
+
36
+ # fake what looks like a beta dataset
37
+ fake_beta_dataset_path = File.join ::Rails.root, 'app', 'models', 'live_data1_beta_dataset.rb'
38
+ File.open(fake_beta_dataset_path, 'w') { |f| f.write "class ::LiveData1BetaDataset < Dataset; BETA = true; end"}
39
+ eval File.read(fake_beta_dataset_path) unless defined?(::LiveData1BetaDataset)
40
+
41
+ # FAKING A UNIVERSE
42
+ FileUtils.mkdir_p '/etc/brighterplanet'
43
+ File.open('/etc/brighterplanet/universe', 'w') { |f| f.write 'data1_production' }
44
+ end
45
+
46
+ def test_universe
47
+ assert_equal 'data1_production', ::BrighterPlanet.metadata.send(:universe)
48
+ end
49
+
50
+ def test_authority
51
+ assert ::BrighterPlanet.metadata.send(:data1_adapter).authority?('data1_production', 'resources')
52
+ assert ::BrighterPlanet.metadata.send(:data1_adapter).authority?('data1_production', 'beta_resources')
53
+ end
54
+
55
+ def test_undifferentiated_resources
56
+ assert_equal %w{LiveData1BetaResource LiveData1Resource}, ::BrighterPlanet.metadata.send(:data1_adapter).send(:undifferentiated_resources)
57
+ end
58
+
59
+ def test_resources
60
+ assert_equal %w{LiveData1Resource}, ::BrighterPlanet.metadata.resources
61
+ end
62
+
63
+ def test_beta_resources
64
+ assert_equal %w{LiveData1BetaResource}, ::BrighterPlanet.metadata.beta_resources
65
+ end
66
+
67
+ def test_datasets
68
+ assert_equal %w{LiveData1Dataset}, ::BrighterPlanet.metadata.datasets
69
+ end
70
+
71
+ def test_beta_datasets
72
+ assert_equal %w{LiveData1BetaDataset}, ::BrighterPlanet.metadata.beta_datasets
73
+ end
74
+
75
+ def test_what_must_come_from_other_sources
76
+ assert_equal ::BrighterPlanet::Metadata::FALLBACK['emitters'], ::BrighterPlanet.metadata.emitters
77
+ end
78
+ end
@@ -0,0 +1,50 @@
1
+ require 'helper'
2
+
3
+ require 'active_support/json/encoding'
4
+ require 'active_support/inflector/inflections'
5
+
6
+ class TestLiveRemote < Test::Unit::TestCase
7
+ def setup
8
+ super
9
+ FakeWeb.clean_registry
10
+ FakeWeb.allow_net_connect = false
11
+ {
12
+ 'http://data.brighterplanet.com/datasets.json' => { 'datasets' => %w{ LiveRemoteDataset }, 'beta_datasets' => %w{ LiveRemoteBetaDataset } },
13
+ 'http://carbon.brighterplanet.com/emitters.json' => { 'emitters' => %w{ LiveRemoteEmitter }, 'beta_emitters' => %w{ LiveRemoteBetaEmitter }, 'certified_emitters' => %w{ } },
14
+ 'http://certified.carbon.brighterplanet.com/emitters.json' => { 'emitters' => %w{ LiveRemoteCertifiedEmitter }, 'beta_emitters' => %w{ }, 'certified_emitters' => %w{ LiveRemoteCertifiedEmitter } },
15
+ 'http://data.brighterplanet.com/resources.json' => { 'resources' => %w{ LiveRemoteResource }, 'beta_resources' => %w{ LiveRemoteBetaResource } },
16
+ }.each do |url, hsh|
17
+ FakeWeb.register_uri :get,
18
+ url,
19
+ :status => ["200", "OK"],
20
+ :body => hsh.to_json
21
+ end
22
+ end
23
+
24
+ def test_refresh
25
+ assert ::BrighterPlanet.metadata.emitters.include?('LiveRemoteEmitter')
26
+ FakeWeb.register_uri :get, 'http://carbon.brighterplanet.com/emitters.json', :status => ["200", "OK"], :body => { 'emitters' => %w{LiveRemoteRefreshedEmitter}}.to_json
27
+
28
+ # still the old value because it's cached...
29
+ assert ::BrighterPlanet.metadata.emitters.include?('LiveRemoteEmitter')
30
+
31
+ BrighterPlanet.metadata.refresh
32
+ assert ::BrighterPlanet.metadata.emitters.include?('LiveRemoteRefreshedEmitter')
33
+ end
34
+
35
+ %w{
36
+ datasets
37
+ beta_datasets
38
+ emitters
39
+ beta_emitters
40
+ certified_emitters
41
+ resources
42
+ beta_resources
43
+ }.each do |kind|
44
+ eval %{
45
+ def test_#{kind}
46
+ assert ::BrighterPlanet.metadata.#{kind}.include?('LiveRemote#{kind.camelcase.singularize}')
47
+ end
48
+ }
49
+ end
50
+ end
@@ -0,0 +1,35 @@
1
+ require 'helper'
2
+
3
+ class TestMemoryLeak < Test::Unit::TestCase
4
+ def setup
5
+ super
6
+ FakeWeb.clean_registry
7
+ FakeWeb.allow_net_connect = false
8
+ FakeWeb.register_uri :get, 'http://carbon.brighterplanet.com/emitters.json', :status => ["500", "Urg"], :body => nil
9
+ end
10
+
11
+ def test_attack_array
12
+ # it's possible to attack the local copy...
13
+ local_copy = ::BrighterPlanet.metadata.emitters
14
+ assert local_copy.include?('AutomobileTrip')
15
+ local_copy.clear
16
+ assert local_copy.empty?
17
+
18
+ # but not me!
19
+ assert ::BrighterPlanet.metadata.emitters.include?('AutomobileTrip')
20
+ ::BrighterPlanet.metadata.emitters.clear
21
+ assert ::BrighterPlanet.metadata.emitters.include?('AutomobileTrip')
22
+ end
23
+
24
+ def test_attack_strings
25
+ # it's possible to attack the local copy, obviously...
26
+ local_copy = ::BrighterPlanet.metadata.emitters
27
+ assert local_copy.include?('AutomobileTrip')
28
+ local_copy.map { |name| name.upcase! }
29
+ assert local_copy.include?('AUTOMOBILETRIP')
30
+
31
+ # but not me!
32
+ ::BrighterPlanet.metadata.emitters.map { |name| name.upcase! }
33
+ assert ::BrighterPlanet.metadata.emitters.include?('AutomobileTrip')
34
+ end
35
+ end
@@ -0,0 +1,31 @@
1
+ require 'helper'
2
+
3
+ class TestReal < Test::Unit::TestCase
4
+ def setup
5
+ super
6
+ BrighterPlanet.metadata.refresh
7
+ FakeWeb.clean_registry
8
+ FakeWeb.allow_net_connect = true
9
+ $old_fallback = BrighterPlanet::Metadata::FALLBACK
10
+ $stderr.puts "clearing fallbacks..."
11
+ BrighterPlanet::Metadata.const_set 'FALLBACK', Hash.new([])
12
+ end
13
+
14
+ def teardown
15
+ super
16
+ $stderr.puts "restoring fallbacks..."
17
+ BrighterPlanet::Metadata.const_set 'FALLBACK', $old_fallback
18
+ end
19
+
20
+ def test_emitters
21
+ assert ::BrighterPlanet.metadata.emitters.include?('AutomobileTrip')
22
+ end
23
+
24
+ def test_resources
25
+ assert ::BrighterPlanet.metadata.resources.include?('AutomobileMake')
26
+ end
27
+
28
+ def test_datasets
29
+ assert ::BrighterPlanet.metadata.beta_datasets.include?('AutomobileIndustry')
30
+ end
31
+ end
metadata ADDED
@@ -0,0 +1,219 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: brighter_planet_metadata
3
+ version: !ruby/object:Gem::Version
4
+ hash: 29
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 1
10
+ version: 0.0.1
11
+ platform: ruby
12
+ authors:
13
+ - Seamus Abshere
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2011-02-03 00:00:00 -06:00
19
+ default_executable:
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ name: eat
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ hash: 3
30
+ segments:
31
+ - 0
32
+ version: "0"
33
+ type: :runtime
34
+ version_requirements: *id001
35
+ - !ruby/object:Gem::Dependency
36
+ name: activesupport
37
+ prerelease: false
38
+ requirement: &id002 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ hash: 11
44
+ segments:
45
+ - 2
46
+ - 3
47
+ - 4
48
+ version: 2.3.4
49
+ type: :runtime
50
+ version_requirements: *id002
51
+ - !ruby/object:Gem::Dependency
52
+ name: i18n
53
+ prerelease: false
54
+ requirement: &id003 !ruby/object:Gem::Requirement
55
+ none: false
56
+ requirements:
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ hash: 3
60
+ segments:
61
+ - 0
62
+ version: "0"
63
+ type: :runtime
64
+ version_requirements: *id003
65
+ - !ruby/object:Gem::Dependency
66
+ name: fakeweb
67
+ prerelease: false
68
+ requirement: &id004 !ruby/object:Gem::Requirement
69
+ none: false
70
+ requirements:
71
+ - - ">="
72
+ - !ruby/object:Gem::Version
73
+ hash: 3
74
+ segments:
75
+ - 0
76
+ version: "0"
77
+ type: :development
78
+ version_requirements: *id004
79
+ - !ruby/object:Gem::Dependency
80
+ name: test-unit
81
+ prerelease: false
82
+ requirement: &id005 !ruby/object:Gem::Requirement
83
+ none: false
84
+ requirements:
85
+ - - ">="
86
+ - !ruby/object:Gem::Version
87
+ hash: 3
88
+ segments:
89
+ - 0
90
+ version: "0"
91
+ type: :development
92
+ version_requirements: *id005
93
+ - !ruby/object:Gem::Dependency
94
+ name: fakefs
95
+ prerelease: false
96
+ requirement: &id006 !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ">="
100
+ - !ruby/object:Gem::Version
101
+ hash: 3
102
+ segments:
103
+ - 0
104
+ version: "0"
105
+ type: :development
106
+ version_requirements: *id006
107
+ - !ruby/object:Gem::Dependency
108
+ name: earth
109
+ prerelease: false
110
+ requirement: &id007 !ruby/object:Gem::Requirement
111
+ none: false
112
+ requirements:
113
+ - - ">="
114
+ - !ruby/object:Gem::Version
115
+ hash: 3
116
+ segments:
117
+ - 0
118
+ version: "0"
119
+ type: :development
120
+ version_requirements: *id007
121
+ - !ruby/object:Gem::Dependency
122
+ name: fastercsv
123
+ prerelease: false
124
+ requirement: &id008 !ruby/object:Gem::Requirement
125
+ none: false
126
+ requirements:
127
+ - - ">="
128
+ - !ruby/object:Gem::Version
129
+ hash: 3
130
+ segments:
131
+ - 0
132
+ version: "0"
133
+ type: :development
134
+ version_requirements: *id008
135
+ - !ruby/object:Gem::Dependency
136
+ name: ruby-debug
137
+ prerelease: false
138
+ requirement: &id009 !ruby/object:Gem::Requirement
139
+ none: false
140
+ requirements:
141
+ - - ">="
142
+ - !ruby/object:Gem::Version
143
+ hash: 3
144
+ segments:
145
+ - 0
146
+ version: "0"
147
+ type: :development
148
+ version_requirements: *id009
149
+ description: What emitters (carbon models), resources (data classes), datasets, etc. we offer.
150
+ email:
151
+ - seamus@abshere.net
152
+ executables:
153
+ - brighter_planet_metadata
154
+ extensions: []
155
+
156
+ extra_rdoc_files: []
157
+
158
+ files:
159
+ - .gitignore
160
+ - Gemfile
161
+ - Rakefile
162
+ - bin/brighter_planet_metadata
163
+ - brighter_planet_metadata.gemspec
164
+ - lib/brighter_planet_metadata.rb
165
+ - lib/brighter_planet_metadata/cm1_adapter.rb
166
+ - lib/brighter_planet_metadata/data1_adapter.rb
167
+ - lib/brighter_planet_metadata/metadata.rb
168
+ - lib/brighter_planet_metadata/version.rb
169
+ - test/helper.rb
170
+ - test/test_developer_machine.rb
171
+ - test/test_fallback.rb
172
+ - test/test_live_cm1.rb
173
+ - test/test_live_data1.rb
174
+ - test/test_live_remote.rb
175
+ - test/test_memory_leak.rb
176
+ - test/test_real.rb
177
+ has_rdoc: true
178
+ homepage: ""
179
+ licenses: []
180
+
181
+ post_install_message:
182
+ rdoc_options: []
183
+
184
+ require_paths:
185
+ - lib
186
+ required_ruby_version: !ruby/object:Gem::Requirement
187
+ none: false
188
+ requirements:
189
+ - - ">="
190
+ - !ruby/object:Gem::Version
191
+ hash: 3
192
+ segments:
193
+ - 0
194
+ version: "0"
195
+ required_rubygems_version: !ruby/object:Gem::Requirement
196
+ none: false
197
+ requirements:
198
+ - - ">="
199
+ - !ruby/object:Gem::Version
200
+ hash: 3
201
+ segments:
202
+ - 0
203
+ version: "0"
204
+ requirements: []
205
+
206
+ rubyforge_project: brighter_planet_metadata
207
+ rubygems_version: 1.3.7
208
+ signing_key:
209
+ specification_version: 3
210
+ summary: Names of Brighter Planet things
211
+ test_files:
212
+ - test/helper.rb
213
+ - test/test_developer_machine.rb
214
+ - test/test_fallback.rb
215
+ - test/test_live_cm1.rb
216
+ - test/test_live_data1.rb
217
+ - test/test_live_remote.rb
218
+ - test/test_memory_leak.rb
219
+ - test/test_real.rb