brighter_planet_metadata 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +4 -0
- data/Gemfile +4 -0
- data/Rakefile +10 -0
- data/bin/brighter_planet_metadata +3 -0
- data/brighter_planet_metadata.gemspec +34 -0
- data/lib/brighter_planet_metadata.rb +23 -0
- data/lib/brighter_planet_metadata/cm1_adapter.rb +40 -0
- data/lib/brighter_planet_metadata/data1_adapter.rb +43 -0
- data/lib/brighter_planet_metadata/metadata.rb +126 -0
- data/lib/brighter_planet_metadata/version.rb +3 -0
- data/test/helper.rb +45 -0
- data/test/test_developer_machine.rb +17 -0
- data/test/test_fallback.rb +32 -0
- data/test/test_live_cm1.rb +59 -0
- data/test/test_live_data1.rb +78 -0
- data/test/test_live_remote.rb +50 -0
- data/test/test_memory_leak.rb +35 -0
- data/test/test_real.rb +31 -0
- metadata +219 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/Rakefile
ADDED
@@ -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
|
data/test/helper.rb
ADDED
@@ -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
|
data/test/test_real.rb
ADDED
@@ -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
|