ruby-avm-library 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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>