ruby-avm-library 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. data/.autotest +5 -0
  2. data/.gitignore +5 -0
  3. data/.rspec +5 -0
  4. data/Gemfile +14 -0
  5. data/README.md +56 -0
  6. data/Rakefile +2 -0
  7. data/autotest/discover.rb +2 -0
  8. data/bin/avm2avm +7 -0
  9. data/lib/avm/cli.rb +18 -0
  10. data/lib/avm/contact.rb +40 -0
  11. data/lib/avm/controlled_vocabulary.rb +23 -0
  12. data/lib/avm/coordinate_frame.rb +10 -0
  13. data/lib/avm/coordinate_system_projection.rb +10 -0
  14. data/lib/avm/creator.rb +123 -0
  15. data/lib/avm/image.rb +355 -0
  16. data/lib/avm/image_quality.rb +10 -0
  17. data/lib/avm/image_type.rb +10 -0
  18. data/lib/avm/node.rb +28 -0
  19. data/lib/avm/observation.rb +76 -0
  20. data/lib/avm/spatial_quality.rb +10 -0
  21. data/lib/avm/xmp.rb +157 -0
  22. data/lib/ruby-avm-library.rb +7 -0
  23. data/lib/ruby-avm-library/version.rb +7 -0
  24. data/reek.watchr +12 -0
  25. data/ruby-avm-library.gemspec +27 -0
  26. data/spec/avm/cli_spec.rb +0 -0
  27. data/spec/avm/contact_spec.rb +93 -0
  28. data/spec/avm/creator_spec.rb +268 -0
  29. data/spec/avm/image_spec.rb +350 -0
  30. data/spec/avm/observation_spec.rb +191 -0
  31. data/spec/avm/xmp_spec.rb +154 -0
  32. data/spec/quick_fix_formatter.rb +26 -0
  33. data/spec/sample_files/creator/no_creator.xmp +14 -0
  34. data/spec/sample_files/creator/one_creator.xmp +28 -0
  35. data/spec/sample_files/creator/two_creators.xmp +26 -0
  36. data/spec/sample_files/image/both.xmp +101 -0
  37. data/spec/sample_files/image/light_years.xmp +96 -0
  38. data/spec/sample_files/image/nothing.xmp +18 -0
  39. data/spec/sample_files/image/redshift.xmp +101 -0
  40. data/spec/sample_files/image/single_value_light_years.xmp +96 -0
  41. data/spec/sample_files/observation/none.xmp +5 -0
  42. data/spec/sample_files/observation/one.xmp +17 -0
  43. data/spec/sample_files/observation/two.xmp +17 -0
  44. data/spec/spec_helper.rb +3 -0
  45. metadata +184 -0
@@ -0,0 +1,191 @@
1
+ require 'spec_helper'
2
+ require 'avm/image'
3
+ require 'avm/observation'
4
+
5
+ describe AVM::Observation do
6
+ let(:image) { AVM::Image.new }
7
+ let(:observation) { image.create_observation(options) }
8
+
9
+ subject { observation }
10
+
11
+ let(:facility) { 'HST' }
12
+ let(:instrument) { 'ACS' }
13
+ let(:color_assignment) { 'Blue' }
14
+ let(:band) { 'em.opt' }
15
+ let(:bandpass) { 'B' }
16
+ let(:wavelength) { 2.5 }
17
+ let(:start_time) { '2010-01-01' }
18
+ let(:start_time_string) { '2010-01-01T00:00' }
19
+ let(:integration_time) { '300' }
20
+ let(:dataset_id) { '12345' }
21
+
22
+ let(:options) { {
23
+ :facility => facility,
24
+ :instrument => instrument,
25
+ :color_assignment => color_assignment,
26
+ :band => band,
27
+ :bandpass => bandpass,
28
+ :wavelength => wavelength,
29
+ :start_time => start_time,
30
+ :integration_time => integration_time,
31
+ :dataset_id => dataset_id,
32
+ } }
33
+
34
+ let(:second_facility) { 'Chandra' }
35
+ let(:second_instrument) { 'X-Ray' }
36
+ let(:second_color_assignment) { 'Green' }
37
+ let(:second_band) { 'em.x-ray' }
38
+ let(:second_bandpass) { 'C' }
39
+ let(:second_wavelength) { nil }
40
+ let(:second_start_time) { '2010-01-02' }
41
+ let(:second_start_time_string) { '2010-01-02T00:00' }
42
+ let(:second_integration_time) { '400' }
43
+ let(:second_dataset_id) { '23456' }
44
+
45
+ let(:second_options) { {
46
+ :facility => second_facility,
47
+ :instrument => second_instrument,
48
+ :color_assignment => second_color_assignment,
49
+ :band => second_band,
50
+ :bandpass => second_bandpass,
51
+ :wavelength => second_wavelength,
52
+ :start_time => second_start_time,
53
+ :integration_time => second_integration_time,
54
+ :dataset_id => second_dataset_id,
55
+ } }
56
+
57
+ def self.check_defaults
58
+ its(:facility) { should == facility }
59
+ its(:instrument) { should == instrument }
60
+ its(:color_assignment) { should == color_assignment }
61
+ its(:band) { should == band }
62
+ its(:bandpass) { should == bandpass }
63
+ its(:wavelength) { should == wavelength }
64
+ its(:start_time) { should == Time.parse(start_time) }
65
+ its(:integration_time) { should == integration_time }
66
+ its(:dataset_id) { should == dataset_id }
67
+
68
+ its(:to_h) { should == {
69
+ :facility => facility,
70
+ :instrument => instrument,
71
+ :color_assignment => color_assignment,
72
+ :band => band,
73
+ :bandpass => bandpass,
74
+ :wavelength => wavelength,
75
+ :start_time => Time.parse(start_time),
76
+ :integration_time => integration_time,
77
+ :dataset_id => dataset_id
78
+ } }
79
+ end
80
+
81
+ context 'defaults' do
82
+ check_defaults
83
+ end
84
+
85
+ describe '.from_xml' do
86
+ let(:image) { AVM::Image.from_xml(File.read(file_path)) }
87
+ let(:observations) { image.observations }
88
+
89
+ subject { observations }
90
+
91
+ context 'no observations' do
92
+ let(:file_path) { 'spec/sample_files/observation/none.xmp' }
93
+
94
+ it { should == [] }
95
+ end
96
+
97
+ context 'one observation' do
98
+ let(:file_path) { 'spec/sample_files/observation/one.xmp' }
99
+
100
+ its(:length) { should == 1 }
101
+
102
+ context 'first observation' do
103
+ subject { observations.first }
104
+
105
+ check_defaults
106
+ end
107
+ end
108
+
109
+ context 'two observations' do
110
+ let(:file_path) { 'spec/sample_files/observation/two.xmp' }
111
+
112
+ its(:length) { should == 2 }
113
+
114
+ context 'first observation' do
115
+ subject { observations.first }
116
+
117
+ check_defaults
118
+ end
119
+
120
+ context 'second observation' do
121
+ subject { observations.last }
122
+
123
+ its(:facility) { should == second_facility }
124
+ its(:instrument) { should == second_instrument }
125
+ its(:color_assignment) { should == second_color_assignment }
126
+ its(:band) { should == second_band }
127
+ its(:bandpass) { should == second_bandpass }
128
+ its(:wavelength) { should == second_wavelength }
129
+ its(:start_time) { should == Time.parse(second_start_time) }
130
+ its(:integration_time) { should == second_integration_time }
131
+ its(:dataset_id) { should == second_dataset_id }
132
+ end
133
+ end
134
+ end
135
+
136
+ describe '.add_to_document' do
137
+ let(:xml) { image.to_xml }
138
+ let(:avm) { xml.at_xpath('//rdf:Description[@rdf:about="AVM"]') }
139
+
140
+ context 'none' do
141
+ it "should not have any observation information" do
142
+ %w{Facility Instrument Spectral.ColorAssignment Spectral.Band Spectral.Bandpass Spectral.CentralWavelength Temporal.StartTime Temporal.IntegrationTime DatasetID}.each do |name|
143
+ avm.at_xpath("//avm:#{name}").should be_nil
144
+ end
145
+ end
146
+ end
147
+
148
+ context 'one' do
149
+ before { observation }
150
+
151
+ it "should have the AVM values" do
152
+ {
153
+ 'Facility' => facility,
154
+ 'Instrument' => instrument,
155
+ 'Spectral.ColorAssignment' => color_assignment,
156
+ 'Spectral.Band' => band,
157
+ 'Spectral.Bandpass' => bandpass,
158
+ 'Spectral.CentralWavelength' => wavelength,
159
+ 'Temporal.StartTime' => start_time_string,
160
+ 'Temporal.IntegrationTime' => integration_time,
161
+ 'DatasetID' => dataset_id
162
+ }.each do |name, value|
163
+ avm.at_xpath("//avm:#{name}").text.should == value.to_s
164
+ end
165
+ end
166
+ end
167
+
168
+ context 'two' do
169
+ let(:second_observation) { image.create_observation(second_options) }
170
+
171
+
172
+ before { observation ; second_observation }
173
+
174
+ it "should have the AVM values" do
175
+ {
176
+ 'Facility' => [ facility, second_facility ].join(','),
177
+ 'Instrument' => [ instrument, second_instrument ].join(','),
178
+ 'Spectral.ColorAssignment' => [ color_assignment, second_color_assignment ].join(','),
179
+ 'Spectral.Band' => [ band, second_band ].join(','),
180
+ 'Spectral.Bandpass' => [ bandpass, second_bandpass ].join(','),
181
+ 'Spectral.CentralWavelength' => [ wavelength, second_wavelength || '-' ].join(','),
182
+ 'Temporal.StartTime' => [ start_time_string, second_start_time_string ].join(','),
183
+ 'Temporal.IntegrationTime' => [ integration_time, second_integration_time ].join(','),
184
+ 'DatasetID' => [ dataset_id, second_dataset_id ].join(',')
185
+ }.each do |name, value|
186
+ avm.at_xpath("//avm:#{name}").text.should == value.to_s
187
+ end
188
+ end
189
+ end
190
+ end
191
+ end
@@ -0,0 +1,154 @@
1
+ require 'spec_helper'
2
+ require 'avm/xmp'
3
+
4
+ describe AVM::XMP do
5
+ let(:xmp) { self.class.describes.new }
6
+
7
+ subject { xmp }
8
+
9
+ describe '#initialize' do
10
+ context 'not a nokogiri document' do
11
+ let(:xmp) { self.class.describes.new("definitely not nokogiri node") }
12
+
13
+ it { expect { xmp }.to raise_error(StandardError, /not a Nokogiri node/) }
14
+ end
15
+ end
16
+
17
+ describe '#get_refs' do
18
+ before {
19
+ xmp.get_refs do |refs|
20
+ refs[:dublin_core] << "<rdf:addedToDublinCore />"
21
+ refs[:iptc] << "<rdf:addedToIPTC />"
22
+ refs[:photoshop] << '<rdf:addedToPhotoshop />'
23
+ refs[:avm] << '<rdf:addedToAVM />'
24
+ end
25
+ }
26
+
27
+ it "should have gotten the refs correctly" do
28
+ xmp.doc.at_xpath('//rdf:Description[@rdf:about="Dublin Core"]//rdf:addedToDublinCore').should_not be_nil
29
+ xmp.doc.at_xpath('//rdf:Description[@rdf:about="IPTC"]//rdf:addedToIPTC').should_not be_nil
30
+ xmp.doc.at_xpath('//rdf:Description[@rdf:about="Photoshop"]//rdf:addedToPhotoshop').should_not be_nil
31
+ xmp.doc.at_xpath('//rdf:Description[@rdf:about="AVM"]//rdf:addedToAVM').should_not be_nil
32
+ end
33
+ end
34
+
35
+ describe 'xml from string' do
36
+ let(:xmp) { self.class.describes.from_string(string) }
37
+ let(:doc) { xmp.doc }
38
+
39
+ describe '.from_string' do
40
+ let(:string) { '<xml xmlns:rdf="cats"><rdf:RDF><node /></rdf:RDF></xml>' }
41
+
42
+ specify { xmp.doc.at_xpath('//node').should_not be_nil }
43
+ end
44
+
45
+ describe '#ensure_namespaces! and #ensure_xmlns' do
46
+ let(:rdf_namespace) { AVM::XMP::REQUIRED_NAMESPACES[:rdf] }
47
+
48
+ def self.all_default_namespaces
49
+ it "should have all the namespaces with the default prefixes" do
50
+ namespaces = doc.document.collect_namespaces
51
+
52
+ namespaces_to_test = AVM::XMP::REQUIRED_NAMESPACES.dup
53
+ yield namespaces_to_test if block_given?
54
+
55
+ namespaces_to_test.each do |prefix, namespace|
56
+ if namespace
57
+ namespaces["xmlns:#{prefix}"].should == namespace
58
+ end
59
+ end
60
+ end
61
+ end
62
+
63
+ before { doc }
64
+
65
+ context 'none of the namespaces exist' do
66
+ let(:string) { '<xml><node /></xml>' }
67
+
68
+ all_default_namespaces
69
+
70
+ specify { xmp.ensure_xmlns('.//rdf:what').should == './/rdf:what' }
71
+ end
72
+
73
+ context 'one namespace exists with the same prefix' do
74
+ let(:string) { %{<xml xmlns:rdf="#{rdf_namespace}"><node /></xml>} }
75
+
76
+ all_default_namespaces
77
+
78
+ specify { xmp.ensure_xmlns('.//rdf:what').should == './/rdf:what' }
79
+ end
80
+
81
+ context 'one namespace exists with a different prefix' do
82
+ let(:string) { %{<xml xmlns:r="#{rdf_namespace}"><node /></xml>} }
83
+
84
+ all_default_namespaces { |namespaces|
85
+ namespaces.delete(:rdf)
86
+ namespaces[:r] = AVM::XMP::REQUIRED_NAMESPACES[:rdf]
87
+ }
88
+
89
+ specify { xmp.ensure_xmlns('.//rdf:what').should == './/r:what' }
90
+ end
91
+ end
92
+ end
93
+
94
+ describe '#ensure_descriptions_findable!' do
95
+ let(:document) { <<-XML }
96
+ <x:xmpmeta xmlns:x="adobe:ns:meta/">
97
+ <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
98
+ #{content}
99
+ </rdf:RDF>
100
+ </x:xmpmeta>
101
+ XML
102
+
103
+ let(:xmp) { self.class.describes.new(Nokogiri::XML(document)) }
104
+
105
+ context 'no nodes within' do
106
+ let(:content) { '' }
107
+
108
+ [ 'Dublin Core', 'IPTC', 'Photoshop', 'AVM' ].each do |which|
109
+ specify { xmp.at_xpath(%{//rdf:Description[@rdf:about="#{which}"]}).children.should be_empty }
110
+ end
111
+ end
112
+
113
+ context 'has identifying nodes within' do
114
+ let(:content) { <<-XML }
115
+ <rdf:Description rdf:about="" xmlns:dc="http://purl.org/dc/elements/1.1/">
116
+ <dc:creator />
117
+ </rdf:Description>
118
+ <rdf:Description rdf:about="" xmlns:Iptc4xmpCore="http://itpc.org/stf/Iptc4xmpCore/1.0/xmlns/">
119
+ <Iptc4xmpCore:CreatorContactInfo rdf:parseType="Resource" />
120
+ </rdf:Description>
121
+ <rdf:Description rdf:about="" xmlns:Photoshop="http://ns.adobe.com/photoshop/1.0/">
122
+ <photoshop:Something />
123
+ </rdf:Description>
124
+ <rdf:Description rdf:about="" xmlns:avm="http://www.communicatingastronomy.org/avm/1.0/">
125
+ <avm:Something />
126
+ </rdf:Description>
127
+ XML
128
+
129
+ [ 'Dublin Core', 'IPTC', 'Photoshop', 'AVM' ].each do |which|
130
+ specify { xmp.at_xpath(%{//rdf:Description[@rdf:about="#{which}"]}).should_not be_nil }
131
+ end
132
+ end
133
+
134
+ context 'has a namespace it should know about with a different prefix' do
135
+ let(:content) { <<-XML }
136
+ <rdf:Description rdf:about="" xmlns:whatever="http://purl.org/dc/elements/1.1/">
137
+ <whatever:creator />
138
+ </rdf:Description>
139
+ XML
140
+
141
+ specify { xmp.at_xpath(%{//rdf:Description[@rdf:about="Dublin Core"]}).should_not be_nil }
142
+ end
143
+
144
+ context 'has a namespace it knows nothing about' do
145
+ let(:content) { <<-XML }
146
+ <rdf:Description rdf:about="" xmlns:whatever="http://example.com">
147
+ <whatever:creator />
148
+ </rdf:Description>
149
+ XML
150
+
151
+ it { expect { xmp }.to_not raise_error }
152
+ end
153
+ end
154
+ end
@@ -0,0 +1,26 @@
1
+ require 'rspec/core/formatters/base_text_formatter'
2
+
3
+ module RSpec
4
+ module Core
5
+ module Formatters
6
+ class QuickFixFormatter < BaseTextFormatter
7
+ def dump_summary(duration, example_count, failure_count, pending_count)
8
+ end
9
+
10
+ def dump_profile
11
+ end
12
+
13
+ def dump_pending
14
+ end
15
+
16
+ def dump_failures
17
+ failed_examples.each do |example|
18
+ output.puts "%s:%s:%s" % [ example.file_path, example.metadata[:line_number], example.metadata[:execution_result][:exception].message ]
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+
26
+
@@ -0,0 +1,14 @@
1
+ <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 4.2.2-c063 53.352624, 2008/07/30-18:05:41 ">
2
+ <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
3
+ <rdf:Description rdf:about=""
4
+ xmlns:dc="http://purl.org/dc/elements/1.1/">
5
+ <dc:creator />
6
+ </rdf:Description>
7
+ <rdf:Description rdf:about=""
8
+ xmlns:Iptc4xmpCore="http://iptc.org/std/Iptc4xmpCore/1.0/xmlns/">
9
+ <Iptc4xmpCore:CreatorContactInfo rdf:parseType="Resource">
10
+ </Iptc4xmpCore:CreatorContactInfo>
11
+ </rdf:Description>
12
+ </rdf:RDF>
13
+ </x:xmpmeta>
14
+
@@ -0,0 +1,28 @@
1
+ <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 4.2.2-c063 53.352624, 2008/07/30-18:05:41 ">
2
+ <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
3
+ <rdf:Description rdf:about=""
4
+ xmlns:dc="http://purl.org/dc/elements/1.1/">
5
+ <dc:creator>
6
+ <rdf:Seq><rdf:li>John Bintz</rdf:li></rdf:Seq>
7
+ </dc:creator>
8
+ <dc:title>
9
+ <rdf:Alt>
10
+ <rdf:li xml:lang="x-default">This is an image</rdf:li>
11
+ </rdf:Alt>
12
+ </dc:title>
13
+ </rdf:Description>
14
+ <rdf:Description rdf:about=""
15
+ xmlns:Iptc4xmpCore="http://iptc.org/std/Iptc4xmpCore/1.0/xmlns/">
16
+ <Iptc4xmpCore:CreatorContactInfo rdf:parseType="Resource">
17
+ <Iptc4xmpCore:CiAdrExtadr>3700 San Martin Drive</Iptc4xmpCore:CiAdrExtadr>
18
+ <Iptc4xmpCore:CiAdrCity>Baltimore</Iptc4xmpCore:CiAdrCity>
19
+ <Iptc4xmpCore:CiAdrRegion>Maryland</Iptc4xmpCore:CiAdrRegion>
20
+ <Iptc4xmpCore:CiAdrPcode>21218</Iptc4xmpCore:CiAdrPcode>
21
+ <Iptc4xmpCore:CiAdrCtry>USA</Iptc4xmpCore:CiAdrCtry>
22
+ <Iptc4xmpCore:CiTelWork>800-555-1234</Iptc4xmpCore:CiTelWork>
23
+ <Iptc4xmpCore:CiEmailWork>bintz@stsci.edu</Iptc4xmpCore:CiEmailWork>
24
+ <Iptc4xmpCore:CiUrlWork>http://hubblesite.org</Iptc4xmpCore:CiUrlWork>
25
+ </Iptc4xmpCore:CreatorContactInfo>
26
+ </rdf:Description>
27
+ </rdf:RDF>
28
+ </x:xmpmeta>
@@ -0,0 +1,26 @@
1
+ <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 4.2.2-c063 53.352624, 2008/07/30-18:05:41 ">
2
+ <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
3
+ <rdf:Description rdf:about=""
4
+ xmlns:dc="http://purl.org/dc/elements/1.1/">
5
+ <dc:creator>
6
+ <rdf:Seq>
7
+ <rdf:li>John Bintz</rdf:li>
8
+ <rdf:li>Aohn Bintz</rdf:li>
9
+ </rdf:Seq>
10
+ </dc:creator>
11
+ </rdf:Description>
12
+ <rdf:Description rdf:about=""
13
+ xmlns:Iptc4xmpCore="http://iptc.org/std/Iptc4xmpCore/1.0/xmlns/">
14
+ <Iptc4xmpCore:CreatorContactInfo rdf:parseType="Resource">
15
+ <Iptc4xmpCore:CiAdrExtadr>3700 San Martin Drive</Iptc4xmpCore:CiAdrExtadr>
16
+ <Iptc4xmpCore:CiAdrCity>Baltimore</Iptc4xmpCore:CiAdrCity>
17
+ <Iptc4xmpCore:CiAdrRegion>Maryland</Iptc4xmpCore:CiAdrRegion>
18
+ <Iptc4xmpCore:CiAdrPcode>21218</Iptc4xmpCore:CiAdrPcode>
19
+ <Iptc4xmpCore:CiAdrCtry>USA</Iptc4xmpCore:CiAdrCtry>
20
+ <Iptc4xmpCore:CiTelWork>800-555-1234,800-555-2345</Iptc4xmpCore:CiTelWork>
21
+ <Iptc4xmpCore:CiEmailWork>bintz@stsci.edu,aohn@stsci.edu</Iptc4xmpCore:CiEmailWork>
22
+ <Iptc4xmpCore:CiUrlWork>http://hubblesite.org</Iptc4xmpCore:CiUrlWork>
23
+ </Iptc4xmpCore:CreatorContactInfo>
24
+ </rdf:Description>
25
+ </rdf:RDF>
26
+ </x:xmpmeta>
@@ -0,0 +1,101 @@
1
+ <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 4.2.2-c063 53.352624, 2008/07/30-18:05:41 ">
2
+ <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
3
+ <rdf:Description rdf:about=""
4
+ xmlns:dc="http://purl.org/dc/elements/1.1/">
5
+ <dc:title>:
6
+ <rdf:Alt>
7
+ <rdf:li xml:lang="x-default">My title</rdf:li>
8
+ </rdf:Alt>
9
+ </dc:title>
10
+ <dc:description>
11
+ <rdf:Alt>
12
+ <rdf:li xml:lang="x-default">Description</rdf:li>
13
+ </rdf:Alt>
14
+ </dc:description>
15
+ <dc:subject>
16
+ <rdf:Bag>
17
+ <rdf:li>Name one</rdf:li>
18
+ <rdf:li>Name two</rdf:li>
19
+ </rdf:Bag>
20
+ </dc:subject>
21
+ </rdf:Description>
22
+ <rdf:Description rdf:about=""
23
+ xmlns:Iptc4xmpCore="http://iptc.org/std/Iptc4xmpCore/1.0/xmlns/">
24
+ <Iptc4xmpCore:CreatorContactInfo rdf:parseType="Resource">
25
+ </Iptc4xmpCore:CreatorContactInfo>
26
+ </rdf:Description>
27
+ <rdf:Description rdf:about=""
28
+ xmlns:photoshop="http://ns.adobe.com/photoshop/1.0/">
29
+ <photoshop:Headline>Headline</photoshop:Headline>
30
+ <photoshop:Credit>Credit</photoshop:Credit>
31
+ <photoshop:DateCreated>2010-01-01</photoshop:DateCreated>
32
+ </rdf:Description>
33
+ <rdf:Description rdf:about=""
34
+ xmlns:avm="http://www.communicatingastronomy.org/avm/1.0/">
35
+ <avm:Spectral.Notes>Spectral Notes</avm:Spectral.Notes>
36
+ <avm:Distance.Notes>Distance Notes</avm:Distance.Notes>
37
+ <avm:ReferenceURL>Reference URL</avm:ReferenceURL>
38
+ <avm:ID>ID</avm:ID>
39
+ <avm:Type>Observation</avm:Type>
40
+ <avm:Image.ProductQuality>Good</avm:Image.ProductQuality>
41
+ <avm:Subject.Category>Category one; Category two</avm:Subject.Category>
42
+ <avm:Distance>
43
+ <rdf:Seq>
44
+ <rdf:li>Light years</rdf:li>
45
+ <rdf:li>Redshift</rdf:li>
46
+ </rdf:Seq>
47
+ </avm:Distance>
48
+ <avm:Spatial.CoordinateFrame>ICRS</avm:Spatial.CoordinateFrame>
49
+ <avm:Spatial.Equinox>100</avm:Spatial.Equinox>
50
+ <avm:Spatial.ReferenceValue>
51
+ <rdf:Seq>
52
+ <rdf:li>100</rdf:li>
53
+ <rdf:li>50</rdf:li>
54
+ </rdf:Seq>
55
+ </avm:Spatial.ReferenceValue>
56
+ <avm:Spatial.ReferenceDimension>
57
+ <rdf:Seq>
58
+ <rdf:li>200</rdf:li>
59
+ <rdf:li>150</rdf:li>
60
+ </rdf:Seq>
61
+ </avm:Spatial.ReferenceDimension>
62
+ <avm:Spatial.ReferencePixel>
63
+ <rdf:Seq>
64
+ <rdf:li>25</rdf:li>
65
+ <rdf:li>15</rdf:li>
66
+ </rdf:Seq>
67
+ </avm:Spatial.ReferencePixel>
68
+ <avm:Spatial.Scale>
69
+ <rdf:Seq>
70
+ <rdf:li>40</rdf:li>
71
+ <rdf:li>35</rdf:li>
72
+ </rdf:Seq>
73
+ </avm:Spatial.Scale>
74
+ <avm:Spatial.Rotation>10</avm:Spatial.Rotation>
75
+ <avm:Spatial.CoordsystemProjection>TAN</avm:Spatial.CoordsystemProjection>
76
+ <avm:Spatial.Quality>Full</avm:Spatial.Quality>
77
+ <avm:Spatial.Notes>Spatial Notes</avm:Spatial.Notes>
78
+ <avm:Spatial.FITSheader>FITS header</avm:Spatial.FITSheader>
79
+ <avm:Spatial.CDMatrix>
80
+ <rdf:Seq>
81
+ <rdf:li>1</rdf:li>
82
+ <rdf:li>2</rdf:li>
83
+ <rdf:li>3</rdf:li>
84
+ <rdf:li>4</rdf:li>
85
+ </rdf:Seq>
86
+ </avm:Spatial.CDMatrix>
87
+ <avm:Publisher>Publisher</avm:Publisher>
88
+ <avm:PublisherID>Publisher ID</avm:PublisherID>
89
+ <avm:ResourceID>Resource ID</avm:ResourceID>
90
+ <avm:ResourceURL>Resource URL</avm:ResourceURL>
91
+ <avm:RelatedResources>
92
+ <rdf:Bag>
93
+ <rdf:li>Resource 1</rdf:li>
94
+ <rdf:li>Resource 2</rdf:li>
95
+ </rdf:Bag>
96
+ </avm:RelatedResources>
97
+ <avm:MetadataDate>2010-01-05</avm:MetadataDate>
98
+ <avm:MetadataVersion>1.2</avm:MetadataVersion>
99
+ </rdf:Description>
100
+ </rdf:RDF>
101
+ </x:xmpmeta>