ppe_api 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,5 @@
1
+ module PPE_API
2
+ class AbstractPa
3
+
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ module PPE_API
2
+ class AlternativeName
3
+
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ module PPE_API
2
+ class ApaRelation
3
+
4
+ end
5
+ end
@@ -0,0 +1,29 @@
1
+ module PPE_API
2
+ class Country
3
+ include ::HappyMapper
4
+
5
+ element :id, Integer
6
+ element :created_at, DateTime, :tag=>'created-at'
7
+ element :updated_at, DateTime, :tag=>'updated-at'
8
+ element :iso, String
9
+ element :iso_3, String, :tag=>'iso-3'
10
+ element :the_geom, String, :tag=>'the-geom'
11
+ element :numareas, Integer
12
+ element :name, String
13
+ has_one :region, Region
14
+
15
+ def geometry_json
16
+ JSON.parse(@the_geom)
17
+ end
18
+
19
+ def self.get_by_iso(iso)
20
+ res, data = ::DR::Config.http.get("/api/country/iso/#{iso}")
21
+ Country.parse(data) unless data.nil? || data.empty?
22
+ end
23
+
24
+ def to_xml(options={})
25
+ self.as_json.to_xml({:root => "country"}.merge(options))
26
+ end
27
+
28
+ end
29
+ end
@@ -0,0 +1,23 @@
1
+ module PPE_API
2
+ class Dataset
3
+ include ::HappyMapper
4
+
5
+ element :id, Integer
6
+ element :created_at, DateTime, :tag=>'created-at'
7
+ element :updated_at, DateTime, :tag=>'updated-at'
8
+ element :author, String
9
+ element :year, Integer
10
+ element :citation, String
11
+ has_one :user, User
12
+
13
+ def ==(data)
14
+ return false if data.nil?
15
+ data.author==self.author && data.year = self.year && data.citation==self.citation && self.user.id == data.user.id
16
+ end
17
+
18
+ def to_xml(options={})
19
+ self.as_json.to_xml({:root => "dataset"}.merge(options))
20
+ end
21
+
22
+ end
23
+ end
@@ -0,0 +1,28 @@
1
+ module PPE_API
2
+ class Designation
3
+ include ::HappyMapper
4
+
5
+ element :id, Integer
6
+ element :created_at, DateTime, :tag=>'created-at'
7
+ element :name, String
8
+ element :updated_at, DateTime, :tag=>'updated-at'
9
+ has_one :jurisdiction, Jurisdiction
10
+
11
+ def self.get_by_name(name)
12
+ res, data = ::DR::Config.http.post("/api/designation/name", "name=#{name}")
13
+ return Designation.parse(data) unless data.nil? || data.empty?
14
+ return nil
15
+
16
+ end
17
+
18
+ def ==(des)
19
+ return false if des.nil?
20
+ des.name==self.name
21
+ end
22
+
23
+ def to_xml(options={})
24
+ self.as_json.to_xml({:root => "designation"}.merge(options))
25
+ end
26
+
27
+ end
28
+ end
@@ -0,0 +1,29 @@
1
+ module PPE_API
2
+ class IucnCategory
3
+ include ::HappyMapper
4
+
5
+ tag 'iucn-category'
6
+ element :id, Integer
7
+ element :created_at, DateTime, :tag=>'created-at'
8
+ element :updated_at, DateTime, :tag=>'updated-at'
9
+ element :name, String
10
+ element :value, Integer
11
+
12
+ def self.get_by_name(name)
13
+ res, data = ::DR::Config.http.get("/api/iucn_category/name/#{name}")
14
+ return IucnCategory.parse(data) unless data.nil? || data.empty?
15
+ return nil
16
+
17
+ end
18
+
19
+ def ==(iucn)
20
+ return false if iucn.nil?
21
+ iucn.name==self.name
22
+ end
23
+
24
+ def to_xml(options={})
25
+ self.as_json.to_xml({:root => "iucn-category"}.merge(options))
26
+ end
27
+
28
+ end
29
+ end
@@ -0,0 +1,15 @@
1
+ module PPE_API
2
+ class Jurisdiction
3
+ include ::HappyMapper
4
+
5
+ element :id, Integer
6
+ element :created_at, DateTime, :tag=>'created-at'
7
+ element :name, String
8
+ element :updated_at, DateTime, :tag=>'updated-at'
9
+
10
+ def to_xml(options={})
11
+ self.as_json.to_xml({:root => "jurisdiction"}.merge(options))
12
+ end
13
+
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ module PPE_API
2
+ class Language
3
+ include ::HappyMapper
4
+
5
+ element :id, Integer
6
+ element :created_at, DateTime, :tag=>'created-at'
7
+ element :updated_at, DateTime, :tag=>'updated-at'
8
+ element :name, String
9
+
10
+ def to_xml(options={})
11
+ self.as_json.to_xml({:root => "language"}.merge(options))
12
+ end
13
+
14
+ end
15
+ end
@@ -0,0 +1,29 @@
1
+ module PPE_API
2
+ class LegalStatus
3
+ include ::HappyMapper
4
+
5
+ tag 'legal-status'
6
+ element :id, Integer
7
+ element :created_at, DateTime, :tag=>'created-at'
8
+ element :updated_at, DateTime, :tag=>'updated-at'
9
+ element :name, String
10
+
11
+ def self.get_by_name(name)
12
+ unless name.nil? || name.empty?
13
+ res, data = ::DR::Config.http.post("/api/legal_status/name", "name=#{name}")
14
+ return LegalStatus.parse(data) unless data.nil? || data.empty?
15
+ end
16
+ return nil
17
+ end
18
+
19
+ def ==(legal_status)
20
+ return false if legal_status.nil?
21
+ legal_status.name==self.name
22
+ end
23
+
24
+ def to_xml(options={})
25
+ self.as_json.to_xml({:root => "legal-status"}.merge(options))
26
+ end
27
+
28
+ end
29
+ end
@@ -0,0 +1,15 @@
1
+ module PPE_API
2
+ class PointGeom
3
+ include ::HappyMapper
4
+
5
+ element :id, Integer
6
+ element :created_at, DateTime, :tag=>'created-at'
7
+ element :updated_at, DateTime, :tag=>'updated-at'
8
+ element :the_geom, String
9
+
10
+ def geometry_json
11
+ JSON.parse(@the_geom)
12
+ end
13
+
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ module PPE_API
2
+ class PolygonGeom
3
+ include ::HappyMapper
4
+
5
+ element :id, Integer
6
+ element :created_at, DateTime, :tag=>'created-at'
7
+ element :updated_at, DateTime, :tag=>'updated-at'
8
+ element :the_geom, String
9
+
10
+ def geometry_json
11
+ JSON.parse(@the_geom)
12
+ end
13
+
14
+ end
15
+ end
@@ -0,0 +1,108 @@
1
+ module PPE_API
2
+ class ProtectedArea
3
+ include ::HappyMapper
4
+
5
+ @@simple_atts = ["english_name", "id", "local_name", "state", "status_date", "total_area", "total_area_marine", "valid_from", "legally_reclassified", "legally_reduced", "legally_extended"]
6
+ @@xml_atts = ["english_name", "id", "local_name", "status_date", "total_area", "total_area_marine", "legally_reclassified", "legally_reduced", "legally_extended", "geometry_as_hex_ewkb", "countries", "dataset", "iucn_category", "designation"]
7
+
8
+ tag 'protected-area'
9
+ element :id, Integer
10
+ element :created_at, DateTime, :tag=>'created-at'
11
+ element :updated_at, DateTime, :tag=>'updated-at'
12
+ element :state, String
13
+ element :english_name, String, :tag=>"english-name"
14
+ element :local_name, String, :tag=>"local-name"
15
+ element :total_area, Float, :tag=>"total-area"
16
+ element :total_area_marine, Float, :tag=>"total-area-marine"
17
+ element :status_date, DateTime, :tag=>"status-date"
18
+ element :valid_from, DateTime, :tag=>"valid-from"
19
+ has_one :iucn_category, IucnCategory, :tag=>"iucn-category"
20
+ has_one :legal_status, LegalStatus, :tag=>"legal-status"
21
+ has_one :designation, Designation
22
+ element :legally_extended, Boolean, :tag=>"legally-extended"
23
+ element :legally_reduced, Boolean, :tag=>"legally-reduced"
24
+ element :legally_reclassified, Boolean, :tag=>"legally-reclassified"
25
+ element :geometry_as_hex_ewkb, String, :tag=>"geometry-as-hex-ewkb"
26
+ has_many :countries, Country
27
+ has_one :user, User
28
+ has_one :dataset, Dataset
29
+ has_one :site, Site
30
+
31
+ def countries_iso
32
+ countries.collect{|a| a.iso+", "}.to_s.chop.chop
33
+ end
34
+
35
+ def geometry
36
+ puts "in protected area looking at what i am #{self.inspect}"
37
+ @geometry = GeoRuby::SimpleFeatures::Geometry.from_hex_ewkb(@geometry_as_hex_ewkb) if (!@geometry.nil? && !@geometry_as_hex_ewkb.nil?)
38
+ @geometry
39
+ end
40
+
41
+ def geometry_geo_json
42
+ unless (geometry.nil?)
43
+ if geometry.is_a? GeoRuby::SimpleFeatures::MultiPolygon
44
+ geo = TempGeometry.create(:polygon=>geometry)
45
+ else
46
+ geo = TempGeometry.create(:point=>geometry)
47
+ end
48
+ geo.save!
49
+ json = geo.get_json
50
+ geo.destroy
51
+ json
52
+ end
53
+
54
+ end
55
+
56
+ def get_obj_attributes(attr)
57
+ if attr == "wdpa_code"
58
+ return self.site
59
+ elsif attr == "geometry"
60
+ return self.geometry_as_hex_ewkb
61
+ else
62
+ return self.send(attr)
63
+ end
64
+ end
65
+
66
+ #returns printable attributes
67
+ def get_nonnil_writable_attribute(attr)
68
+ if @@simple_atts.count(attr) > 0
69
+ return self.send(attr)
70
+ elsif attr == "iucn_category"
71
+ return iucn_category ? iucn_category.name : ""
72
+ elsif attr == "designation"
73
+ return designation ? designation.name : ""
74
+ elsif attr == "legal_status"
75
+ return legal_status ? legal_status.name : ""
76
+ elsif attr == "countries"
77
+ return countries.length > 0 ? countries.collect{|a| a.iso+", "}.to_s.chop.chop : ""
78
+ elsif attr == "citation"
79
+ return self.dataset.citation
80
+ elsif attr == "author"
81
+ return self.dataset.author
82
+ elsif attr == "wdpa_code"
83
+ return self.site.id
84
+ end
85
+ return ""
86
+ end
87
+
88
+
89
+ def self.get_by_id(id, has_geom=true)
90
+ if id.to_i != 0
91
+ path = "/api/protected_area/#{id}"
92
+ path = path + "?has_geometry=true" if has_geom
93
+ res, data = ::DR::Config.http.get(path)
94
+ return ProtectedArea.parse(data) unless data.nil? || data.empty?
95
+ end
96
+ return nil
97
+ end
98
+
99
+
100
+ def self.exists?(id)
101
+ !self.get_by_id(id).nil?
102
+ end
103
+
104
+ def to_xml(options={})
105
+ self.as_json.to_xml({:root => "protected-area"}.merge(options))
106
+ end
107
+ end
108
+ end
@@ -0,0 +1,16 @@
1
+ module PPE_API
2
+ class Region
3
+ include ::HappyMapper
4
+
5
+ element :id, Integer
6
+ element :created_at, DateTime, :tag=>'created-at'
7
+ element :updated_at, DateTime, :tag=>'updated-at'
8
+ element :name, String
9
+ element :code, String
10
+
11
+ def to_xml(options={})
12
+ self.as_json.to_xml({:root => "region"}.merge(options))
13
+ end
14
+
15
+ end
16
+ end
@@ -0,0 +1,5 @@
1
+ module PPE_API
2
+ class Search
3
+
4
+ end
5
+ end
@@ -0,0 +1,31 @@
1
+ module PPE_API
2
+ class Site
3
+ include ::HappyMapper
4
+
5
+ element :id, Integer
6
+ element :created_at, DateTime, :tag=>'created-at'
7
+ element :updated_at, DateTime, :tag=>'updated-at'
8
+ element :abstract_pa_id, Integer
9
+ element :state, String
10
+
11
+ def self.get_by_id(id)
12
+ res, data = ::DR::Config.http.get("/api/site/#{id}")
13
+ return Site.parse(data) unless data.nil? || data.empty?
14
+ return nil
15
+ end
16
+
17
+ def self.exists?(id)
18
+ return !self.get_by_id(id).nil?
19
+ end
20
+
21
+ def ==(site)
22
+ return false if site.nil?
23
+ return self.id==site.id
24
+ end
25
+
26
+ def to_xml(options={})
27
+ self.as_json.to_xml({:root => "site"}.merge(options))
28
+ end
29
+
30
+ end
31
+ end
@@ -0,0 +1,40 @@
1
+ module PPE_API
2
+ class User
3
+ include ::HappyMapper
4
+
5
+ element :id, Integer
6
+ element :created_at, DateTime, :tag=>'created-at'
7
+ element :updated_at, DateTime, :tag=>'updated-at'
8
+ element :title, String
9
+ element :first_name, String
10
+ element :last_name, String
11
+ element :organization, String
12
+ element :username, String
13
+ element :email, String
14
+
15
+
16
+ def exports
17
+ Export.find_all_by_user_id(id)
18
+ end
19
+
20
+
21
+ def completed_tasks
22
+ exports.inject(0) do |sum,ex|
23
+ if ex.task_status == DR::Config.import_state_map[:completed]
24
+ sum+=1
25
+ end
26
+ sum
27
+ end
28
+ end
29
+
30
+ def imports
31
+ Import.find_all_by_user_id(id)
32
+ end
33
+
34
+ def to_xml(options={})
35
+ self.as_json.to_xml({:root => "user"}.merge(options))
36
+ end
37
+
38
+
39
+ end
40
+ end
data/lib/ppe_api.rb ADDED
@@ -0,0 +1,17 @@
1
+ require 'happymapper'
2
+ require 'ppe_api/abstract_pa'
3
+ require 'ppe_api/alternative_name'
4
+ require 'ppe_api/apa_relation'
5
+ require 'ppe_api/country'
6
+ require 'ppe_api/dataset'
7
+ require 'ppe_api/designation'
8
+ require 'ppe_api/iucn_category'
9
+ require 'ppe_api/jurisdiction'
10
+ require 'ppe_api/language'
11
+ require 'ppe_api/legal_status'
12
+ require 'ppe_api/point_geom'
13
+ require 'ppe_api/protected_area'
14
+ require 'ppe_api/region'
15
+ require 'ppe_api/search'
16
+ require 'ppe_api/site'
17
+ require 'ppe_api/user'
data/test/factories.rb ADDED
@@ -0,0 +1,106 @@
1
+ Factory.define :abstract_pa, :default_strategy => :build do |t|
2
+ end
3
+
4
+ Factory.define :designation, :default_strategy => :build do |t|
5
+ t.name "World Heritage Site"
6
+ end
7
+
8
+ Factory.define :iucn_category, :default_strategy => :build do |t|
9
+ t.name "Ia"
10
+ t.value 1
11
+ end
12
+
13
+ Factory.define :legal_status, :default_strategy => :build do |t|
14
+ t.name "created"
15
+ end
16
+
17
+ Factory.define :country, :default_strategy => :build do |t|
18
+ t.name "United Kingdom"
19
+ t.iso "GB"
20
+ t.iso_3 "GBR"
21
+ t.association :region
22
+ end
23
+
24
+ Factory.define :region, :default_strategy => :build do |t|
25
+ t.name "Europe"
26
+ t.code "EU"
27
+ end
28
+
29
+
30
+
31
+
32
+ Factory.define :polygon_geom, :default_strategy => :build do |t|
33
+ t.the_geom MultiPolygon.from_polygons([Polygon.from_coordinates([[[12.4,-45.3],[45.4,41.6],[4.456,1.0698],[12.4,-45.3]],[[2.4,5.3],[5.4,1.4263],[14.46,1.06],[2.4,5.3]]]),Polygon.from_coordinates([[[0,0],[4,0],[4,4],[0,4],[0,0]],[[1,1],[3,1],[3,3],[1,3],[1,1]]])], 4326)
34
+ end
35
+
36
+ Factory.define :point_geom, :default_strategy => :build do |t|
37
+ t.the_geom Point.from_coordinates([1,2], 4326)
38
+ end
39
+
40
+ Factory.define :dataset, :default_strategy => :build do |t|
41
+ t.citation "Some dataset name"
42
+ t.author "Galt, J. & Timmy, L."
43
+ t.association :user
44
+ end
45
+
46
+ Factory.define :user, :default_strategy => :build do |t|
47
+ t.title "Mr"
48
+ t.first_name "simon"
49
+ t.last_name "tokumine"
50
+ t.sequence(:username) {|n| "simon#{n}"}
51
+ t.sequence(:email) {|n| "simon#{n}@tokumine.com"}
52
+ t.password "secret"
53
+ t.password_confirmation "secret"
54
+ t.first_login_ip "88.96.173.198"
55
+ t.latitude 53.6167
56
+ t.longitude -2.15
57
+ t.association :country
58
+ end
59
+
60
+ Factory.define :species, :default_strategy => :build do |t|
61
+ t.name "elephant"
62
+ t.url "http://somwere.com"
63
+ t.association :site
64
+ end
65
+
66
+ Factory.define :point_of_interest, :default_strategy => :build do |t|
67
+ t.title "waterfall"
68
+ t.summary "nice waterfall"
69
+ t.url "http://www.google.com"
70
+ end
71
+
72
+ Factory.define :image, :default_strategy => :build do |u|
73
+ u.photo { ActionController::TestUploadedFile.new(File.join(RAILS_ROOT, 'test', 'resources', 'chewie.jpg')) }
74
+ end
75
+
76
+ Factory.define :image_han, :class => :image, :default_strategy => :build do |u|
77
+ u.photo { ActionController::TestUploadedFile.new(File.join(RAILS_ROOT, 'test', 'resources', 'han.jpg')) }
78
+ end
79
+
80
+ Factory.define :site, :default_strategy => :build do |t|
81
+ t.association :abstract_pa
82
+ end
83
+
84
+ Factory.define :protected_area, :default_strategy => :build do |t|
85
+ t.state "complete"
86
+ t.english_name "Yosemite"
87
+ t.local_name "Yosemite"
88
+ t.total_area 123123
89
+ t.total_area_marine 32432
90
+ t.status_date 10.years.ago
91
+ t.legally_extended true
92
+ t.legally_reduced false
93
+ t.legally_reclassified false
94
+ t.association :site
95
+ t.association :designation
96
+ t.association :iucn_category
97
+ t.association :legal_status
98
+ t.association :polygon_geom
99
+ t.association :point_geom
100
+ t.association :dataset
101
+ t.association :user
102
+ end
103
+
104
+
105
+
106
+
@@ -0,0 +1,62 @@
1
+ ENV["RAILS_ENV"] = "test"
2
+ require File.expand_path(File.dirname(__FILE__) + "/../config/environment")
3
+ require 'test_help'
4
+
5
+ class ActiveSupport::TestCase
6
+ # Transactional fixtures accelerate your tests by wrapping each test method
7
+ # in a transaction that's rolled back on completion. This ensures that the
8
+ # test database remains unchanged so your fixtures don't have to be reloaded
9
+ # between every test method. Fewer database queries means faster tests.
10
+ #
11
+ # Read Mike Clark's excellent walkthrough at
12
+ # http://clarkware.com/cgi/blosxom/2005/10/24#Rails10FastTesting
13
+ #
14
+ # Every Active Record database supports transactions except MyISAM tables
15
+ # in MySQL. Turn off transactional fixtures in this case; however, if you
16
+ # don't care one way or the other, switching from MyISAM to InnoDB tables
17
+ # is recommended.
18
+ #
19
+ # The only drawback to using transactional fixtures is when you actually
20
+ # need to test transactions. Since your test is bracketed by a transaction,
21
+ # any transactions started in your code will be automatically rolled back.
22
+ self.use_transactional_fixtures = true
23
+
24
+ # Instantiated fixtures are slow, but give you @david where otherwise you
25
+ # would need people(:david). If you don't want to migrate your existing
26
+ # test cases which use the @david style and don't mind the speed hit (each
27
+ # instantiated fixtures translates to a database query per test method),
28
+ # then set this back to true.
29
+ self.use_instantiated_fixtures = false
30
+
31
+ # Setup all fixtures in test/fixtures/*.(yml|csv) for all tests in alphabetical order.
32
+ #
33
+ # Note: You'll currently still have to declare fixtures explicitly in integration tests
34
+ # -- they do not yet inherit this setting
35
+ fixtures :all
36
+
37
+ # Add more helper methods to be used by all tests here...
38
+ end
39
+
40
+ class PGconn
41
+ def PGconn.quote_ident(name)
42
+ %("#{name}")
43
+ end
44
+ end
45
+
46
+ class Test::Unit::TestCase
47
+ def self.should_have_attached_file(attachment)
48
+ klass = self.name.gsub(/Test$/, '').constantize
49
+
50
+ context "To support a paperclip attachment named #{attachment}, #{klass}" do
51
+ should_have_db_column("#{attachment}_file_name", :type => :string)
52
+ should_have_db_column("#{attachment}_content_type", :type => :string)
53
+ should_have_db_column("#{attachment}_file_size", :type => :integer)
54
+ end
55
+
56
+ should "have a paperclip attachment named ##{attachment}" do
57
+ assert klass.new.respond_to?(attachment.to_sym),
58
+ "@#{klass.name.underscore} doesn't have a paperclip field named #{attachment}"
59
+ assert_equal Paperclip::Attachment, klass.new.send(attachment.to_sym).class
60
+ end
61
+ end
62
+ end
metadata ADDED
@@ -0,0 +1,83 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ppe_api
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Liz Schwartz
8
+ autorequire: data_rec_gem
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-12-19 00:00:00 -05:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: happymapper
17
+ type: :runtime
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: "0"
24
+ version:
25
+ description:
26
+ email: ""
27
+ executables: []
28
+
29
+ extensions: []
30
+
31
+ extra_rdoc_files: []
32
+
33
+ files:
34
+ - lib/ppe_api/abstract_pa.rb
35
+ - lib/ppe_api/alternative_name.rb
36
+ - lib/ppe_api/apa_relation.rb
37
+ - lib/ppe_api/country.rb
38
+ - lib/ppe_api/dataset.rb
39
+ - lib/ppe_api/designation.rb
40
+ - lib/ppe_api/iucn_category.rb
41
+ - lib/ppe_api/jurisdiction.rb
42
+ - lib/ppe_api/language.rb
43
+ - lib/ppe_api/legal_status.rb
44
+ - lib/ppe_api/point_geom.rb
45
+ - lib/ppe_api/polygon_geom.rb
46
+ - lib/ppe_api/protected_area.rb
47
+ - lib/ppe_api/region.rb
48
+ - lib/ppe_api/search.rb
49
+ - lib/ppe_api/site.rb
50
+ - lib/ppe_api/user.rb
51
+ - lib/ppe_api.rb
52
+ - test/factories.rb
53
+ - test/test_helper.rb
54
+ has_rdoc: true
55
+ homepage:
56
+ licenses: []
57
+
58
+ post_install_message:
59
+ rdoc_options: []
60
+
61
+ require_paths:
62
+ - lib
63
+ required_ruby_version: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: "0"
68
+ version:
69
+ required_rubygems_version: !ruby/object:Gem::Requirement
70
+ requirements:
71
+ - - ">="
72
+ - !ruby/object:Gem::Version
73
+ version: "0"
74
+ version:
75
+ requirements: []
76
+
77
+ rubyforge_project:
78
+ rubygems_version: 1.3.5
79
+ signing_key:
80
+ specification_version: 3
81
+ summary: A package for reading ppe api requests
82
+ test_files: []
83
+