adiwg-mdtranslator 2.0.0rc8 → 2.0.0rc9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (26) hide show
  1. checksums.yaml +4 -4
  2. data/lib/adiwg/mdtranslator/internal/module_coordinates.rb +26 -1
  3. data/lib/adiwg/mdtranslator/version.rb +4 -1
  4. data/lib/adiwg/mdtranslator/writers/html/readme.md +4 -0
  5. data/lib/adiwg/mdtranslator/writers/iso19110/iso19110_writer.rb +53 -42
  6. data/lib/adiwg/mdtranslator/writers/sbJson/readme.md +8 -1
  7. data/lib/adiwg/mdtranslator/writers/sbJson/sbJson_writer.rb +30 -1
  8. data/lib/adiwg/mdtranslator/writers/sbJson/sections/sbJson_browseCategory.rb +39 -0
  9. data/lib/adiwg/mdtranslator/writers/sbJson/sections/sbJson_budget.rb +63 -0
  10. data/lib/adiwg/mdtranslator/writers/sbJson/sections/sbJson_citation.rb +10 -3
  11. data/lib/adiwg/mdtranslator/writers/sbJson/sections/sbJson_codelists.rb +170 -0
  12. data/lib/adiwg/mdtranslator/writers/sbJson/sections/sbJson_contact.rb +119 -40
  13. data/lib/adiwg/mdtranslator/writers/sbJson/sections/sbJson_date.rb +40 -0
  14. data/lib/adiwg/mdtranslator/writers/sbJson/sections/sbJson_facet.rb +47 -24
  15. data/lib/adiwg/mdtranslator/writers/sbJson/sections/sbJson_hours.rb +35 -0
  16. data/lib/adiwg/mdtranslator/writers/sbJson/sections/sbJson_materialRequest.rb +59 -0
  17. data/lib/adiwg/mdtranslator/writers/sbJson/sections/sbJson_parentId.rb +37 -0
  18. data/lib/adiwg/mdtranslator/writers/sbJson/sections/sbJson_project.rb +47 -0
  19. data/lib/adiwg/mdtranslator/writers/sbJson/sections/sbJson_provenance.rb +4 -0
  20. data/lib/adiwg/mdtranslator/writers/sbJson/sections/sbJson_publication.rb +54 -0
  21. data/lib/adiwg/mdtranslator/writers/sbJson/sections/sbJson_sbJson.rb +25 -27
  22. data/lib/adiwg/mdtranslator/writers/sbJson/sections/sbJson_spatial.rb +49 -41
  23. data/lib/adiwg/mdtranslator/writers/sbJson/sections/sbJson_tag.rb +82 -0
  24. data/lib/adiwg/mdtranslator/writers/sbJson/sections/sbJson_webLink.rb +66 -0
  25. metadata +14 -4
  26. data/lib/adiwg/mdtranslator/writers/sbJson/sections/sbJson_base.rb +0 -19
@@ -1,45 +1,124 @@
1
+ # sbJson 1.0 writer
2
+
3
+ # History:
4
+ # Stan Smith 2017-05-25 refactored for mdJson/mdTranslator 2.0
5
+ # Josh Bradley original script
6
+
1
7
  require 'jbuilder'
8
+ require_relative 'sbJson_codelists'
9
+ require_relative 'sbJson_hours'
2
10
 
3
11
  module ADIWG
4
- module Mdtranslator
5
- module Writers
6
- module SbJson
7
- module Contact
8
- def self.build(intObj)
9
- Jbuilder.new do |json|
10
- if intObj[:internal]
11
- json.nil!
12
- else
13
- type = intObj[:indName].nil? ? 'organization' : 'person'
14
- json.name intObj[:indName] || intObj[:orgName]
15
- json.contactType type
16
- json.type intObj[:primaryRole]
17
- json.email intObj[:address][:eMailList][0] unless intObj[:address].empty?
18
- json.organization type == 'person' ? {:displayText => intObj[:orgName]} : nil
19
- json.primaryLocation do
20
- json.officePhone intObj[:phones].collect { |ph|
21
- ph[:phoneNumber] if ph[:phoneServiceType] == 'voice'
22
- }.reject(&:nil?).first
23
- json.faxPhone intObj[:phones].collect { |ph|
24
- ph[:phoneNumber] if ph[:phoneServiceType] == 'fax'
25
- }.reject(&:nil?).first
26
- json.streetAddress do
27
- add = intObj[:address]
28
- unless [:deliveryPoints].empty?
29
- json.line1 add[:deliveryPoints][0]
30
- json.line2 add[:deliveryPoints][1]
31
- end
32
- json.city add[:city]
33
- json.state add[:adminArea]
34
- json.zip add[:postalCode]
35
- json.country add[:country]
36
- end unless intObj[:address].empty?
37
- end
38
- end
39
- end
40
- end
41
- end
12
+ module Mdtranslator
13
+ module Writers
14
+ module SbJson
15
+
16
+ module Contact
17
+
18
+ @Namespace = ADIWG::Mdtranslator::Writers::SbJson
19
+
20
+ def self.get_contact_list(intObj)
21
+
22
+ # gather all responsibility objects in intObj
23
+ aResponsibility = @Namespace.nested_objs_by_element(intObj, 'roleName')
24
+
25
+ # make a list of unique role/party contacts
26
+ aContactList = []
27
+ aResponsibility.each do |hResponsibility|
28
+ role = hResponsibility[:roleName]
29
+ hResponsibility[:parties].each do |hParty|
30
+ aContactList << { :role => role, :index => hParty[:contactIndex] }
31
+ end
32
+ end
33
+
34
+ aContactList = aContactList.uniq
35
+
36
+ end
37
+
38
+ def self.build(hParty)
39
+
40
+ Jbuilder.new do |json|
41
+
42
+ role = hParty[:role]
43
+ hContact = @Namespace.get_contact_by_index(hParty[:index])
44
+
45
+ unless hContact.empty?
46
+
47
+ type = hContact[:isOrganization] ? 'organization' : 'person'
48
+
49
+ orgName = nil
50
+ unless hContact[:memberOfOrgs].empty?
51
+ orgContact = @Namespace.get_contact_by_id(hContact[:memberOfOrgs][0])
52
+ orgName = orgContact[:name]
53
+ end
54
+ logoUrl = nil
55
+ unless hContact[:logos].empty?
56
+ logo0 = hContact[:logos][0]
57
+ unless logo0[:graphicURI].empty?
58
+ logoUrl = logo0[:graphicURI][0][:olResURI]
59
+ end
60
+ end
61
+
62
+ json.name hContact[:name]
63
+ json.contactType type
64
+ json.personalTitle hContact[:positionName] if type == 'person'
65
+ sbRole = Codelists.codelist_iso_to_sb('iso_sb_role', :isoCode => role)
66
+ json.type sbRole = sbRole.nil? ? role : sbRole
67
+ json.email hContact[:eMailList][0] unless hContact[:eMailList].empty?
68
+ json.hours Hours.build(hContact[:hoursOfService]) unless hContact[:hoursOfService].empty?
69
+ json.instructions hContact[:contactInstructions]
70
+ json.tty hContact[:phones].collect {|ph| ph[:phoneNumber] if
71
+ ph[:phoneServiceTypes].include?('tty')}.reject(&:nil?).first
72
+ json.organization {json.displayText orgName} unless orgName.nil?
73
+ json.logoUrl logoUrl unless logoUrl.nil?
74
+
75
+ if !hContact[:addresses].empty? || !hContact[:phones].empty?
76
+ json.primaryLocation do
77
+ unless hContact[:phones].empty?
78
+ json.officePhone hContact[:phones].collect {|ph| ph[:phoneNumber] if
79
+ ph[:phoneServiceTypes].include?('voice')}.reject(&:nil?).first
80
+ json.faxPhone hContact[:phones].collect {|ph| ph[:phoneNumber] if
81
+ ph[:phoneServiceTypes].include?('fax')}.reject(&:nil?).first
82
+ end
83
+ unless hContact[:addresses].empty?
84
+ aAddress = hContact[:addresses]
85
+ json.description aAddress[0][:description]
86
+ aAddress.each do |hAddress|
87
+ if hAddress[:addressTypes].include?('physical')
88
+ json.streetAddress do
89
+ unless hAddress[:deliveryPoints].empty?
90
+ json.line1 hAddress[:deliveryPoints][0]
91
+ json.line2 hAddress[:deliveryPoints][1]
92
+ end
93
+ json.city hAddress[:city]
94
+ json.state hAddress[:adminArea]
95
+ json.zip hAddress[:postalCode]
96
+ json.country hAddress[:country]
97
+ end
98
+ end
99
+ if hAddress[:addressTypes].include?('mailing')
100
+ json.mailAddress do
101
+ unless hAddress[:deliveryPoints].empty?
102
+ json.line1 hAddress[:deliveryPoints][0]
103
+ json.line2 hAddress[:deliveryPoints][1]
104
+ end
105
+ json.city hAddress[:city]
106
+ json.state hAddress[:adminArea]
107
+ json.zip hAddress[:postalCode]
108
+ json.country hAddress[:country]
109
+ end
110
+ end
111
+ end
112
+ end
113
+ end
114
+ end
115
+ end
116
+ end
117
+
118
+ end # build
119
+ end # Module Contacts
120
+
121
+ end
42
122
  end
43
- end
44
- end
123
+ end
45
124
  end
@@ -0,0 +1,40 @@
1
+ # sbJson 1.0 writer date
2
+
3
+ # History:
4
+ # Stan Smith 2017-06-01 original script
5
+
6
+ require_relative 'sbJson_codelists'
7
+
8
+ module ADIWG
9
+ module Mdtranslator
10
+ module Writers
11
+ module SbJson
12
+
13
+ module Date
14
+
15
+ def self.build(hCitation)
16
+
17
+ aDates = []
18
+
19
+ hCitation[:dates].each do |hDate|
20
+ sbDate = {}
21
+ sbDate[:type] = Codelists.codelist_iso_to_sb('iso_sb_date', :isoCode => hDate[:dateType])
22
+ sbDate[:dateString] = AdiwgDateTimeFun.stringFromDateObject(hDate)
23
+ sbDate[:label] = hDate[:description] unless hDate[:description].nil?
24
+ aDates << sbDate unless sbDate[:type].nil?
25
+ end
26
+
27
+ if aDates.empty?
28
+ return nil
29
+ end
30
+
31
+ aDates
32
+
33
+ end
34
+
35
+ end
36
+
37
+ end
38
+ end
39
+ end
40
+ end
@@ -1,30 +1,53 @@
1
+ # sbJson 1.0 writer facet
2
+
3
+ # History:
4
+ # Stan Smith 2017-06-02 refactored for mdTranslator 2.0
5
+ # Josh Bradley original script
6
+
7
+ require_relative 'sbJson_budget'
8
+ require_relative 'sbJson_project'
9
+ require_relative 'sbJson_publication'
10
+
1
11
  module ADIWG
2
- module Mdtranslator
3
- module Writers
4
- module SbJson
5
- module Facet
6
- def self.build(intObj)
7
- facets = []
8
- if intObj[:resourceType] == 'project'
9
- status = {
10
- completed: 'Completed',
11
- underDevelopment: 'Active',
12
- accepted: 'Approved',
13
- funded: 'Funded',
14
- onGoing: 'In Progress',
15
- proposed: 'Proposed'
16
- }
17
- facets << {
18
- className: 'gov.sciencebase.catalog.item.facet.ProjectFacet',
19
- projectStatus: status[:"#{intObj[:status]}"]
20
- }
12
+ module Mdtranslator
13
+ module Writers
14
+ module SbJson
15
+
16
+ module Facet
17
+
18
+ def self.build(hMetadata)
19
+
20
+ aFacets = []
21
+
22
+ # budget facet
23
+ unless hMetadata[:funding].empty?
24
+ hBudgetFacet = Budget.build(hMetadata[:funding])
25
+ aFacets << hBudgetFacet unless hBudgetFacet.empty?
26
+ end
27
+
28
+ # project facet
29
+ unless hMetadata[:resourceInfo].empty?
30
+ hProjectFacet = Project.build(hMetadata[:resourceInfo])
31
+ aFacets << hProjectFacet unless hProjectFacet.empty?
32
+ end
33
+
34
+ # publication facet (citation)
35
+ unless hMetadata[:resourceInfo].empty?
36
+ hPublicationFacet = Publication.build(hMetadata[:resourceInfo])
37
+ aFacets << hPublicationFacet unless hPublicationFacet.empty?
38
+ end
39
+
40
+ if aFacets.empty?
41
+ return nil
42
+ end
43
+
44
+ aFacets
45
+
46
+ end
21
47
 
22
48
  end
23
49
 
24
- facets
25
- end
26
- end
50
+ end
27
51
  end
28
- end
29
- end
52
+ end
30
53
  end
@@ -0,0 +1,35 @@
1
+ # sbJson 1.0 writer
2
+
3
+ # History:
4
+ # Stan Smith 2017-05-26 original script
5
+
6
+ module ADIWG
7
+ module Mdtranslator
8
+ module Writers
9
+ module SbJson
10
+
11
+ module Hours
12
+
13
+ def self.build(aHours)
14
+
15
+ hours = ''
16
+
17
+ aHours.each do |hour|
18
+ hours += hour + '; '
19
+ end
20
+
21
+ # clean off last semicolon
22
+ if hours.length > 2
23
+ hours = hours[0...-2]
24
+ end
25
+
26
+ hours
27
+
28
+ end
29
+
30
+ end
31
+
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,59 @@
1
+ # sbJson 1.0 writer
2
+
3
+ # History:
4
+ # Stan Smith 2017-05-25 original script
5
+
6
+ module ADIWG
7
+ module Mdtranslator
8
+ module Writers
9
+ module SbJson
10
+
11
+ module MaterialRequest
12
+
13
+ def self.build(aDistribution)
14
+
15
+ materialRequest = ''
16
+
17
+ aDistribution.each do |hDistribution|
18
+ aDistributor = hDistribution[:distributor]
19
+ aDistributor.each do |hDistributor|
20
+ instructions = nil
21
+ unless hDistributor[:orderProcess].empty?
22
+ instructions = hDistributor[:orderProcess][0][:orderingInstructions]
23
+ end
24
+ unless hDistributor[:contact].empty?
25
+ role = hDistributor[:contact][:roleName]
26
+ aParties = hDistributor[:contact][:parties]
27
+ aParties.each do |hParty|
28
+ contactIndex = hParty[:contactIndex]
29
+ unless contactIndex.nil?
30
+ hContact = ADIWG::Mdtranslator::Writers::SbJson.get_contact_by_index(contactIndex)
31
+ unless hContact.empty?
32
+ name = hContact[:name]
33
+ if instructions.nil?
34
+ materialRequest += name + '(' + role + '); '
35
+ else
36
+ materialRequest += name + '(' + role + ' - ' + instructions + '); '
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
44
+
45
+ # clean off last semicolon
46
+ if materialRequest.length > 0
47
+ materialRequest = materialRequest[0...-2]
48
+ end
49
+
50
+ materialRequest
51
+
52
+ end
53
+
54
+ end
55
+
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,37 @@
1
+ # sbJson 1.0 writer
2
+
3
+ # History:
4
+ # Stan Smith 2017-05-25 original script
5
+
6
+ module ADIWG
7
+ module Mdtranslator
8
+ module Writers
9
+ module SbJson
10
+
11
+ module ParentId
12
+
13
+ def self.build(hCitation)
14
+
15
+ parentId = ''
16
+
17
+ hCitation[:identifiers].each_with_index do |hIdentifier, index|
18
+ if index == 0
19
+ parentId = hIdentifier[:identifier]
20
+ end
21
+ unless hIdentifier[:namespace].nil?
22
+ if hIdentifier[:namespace] == 'gov.sciencebase.catalog'
23
+ parentId = hIdentifier[:identifier]
24
+ end
25
+ end
26
+ end
27
+
28
+ parentId
29
+
30
+ end
31
+
32
+ end
33
+
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,47 @@
1
+ # sbJson 1.0 writer project
2
+
3
+ # History:
4
+ # Stan Smith 2017-06-02 original script
5
+
6
+ require_relative 'sbJson_codelists'
7
+
8
+ module ADIWG
9
+ module Mdtranslator
10
+ module Writers
11
+ module SbJson
12
+
13
+ module Project
14
+
15
+ def self.build(hResource)
16
+
17
+ hProject = {}
18
+
19
+ hResource[:resourceTypes].each do |hResourceType|
20
+ if hResourceType[:type] == 'project'
21
+ hProject[:className] = 'gov.sciencebase.catalog.item.facet.ProjectFacet'
22
+ unless hResource[:status].empty?
23
+ status = hResource[:status][0]
24
+ sbStatus = Codelists.codelist_iso_to_sb('iso_sb_progress', :isoCode => status)
25
+ hProject[:projectStatus] = sbStatus
26
+ end
27
+ unless hResource[:shortAbstract].nil?
28
+ hProject[:parts] = [
29
+ {
30
+ type: 'Short Project Description',
31
+ value: hResource[:shortAbstract]
32
+ }
33
+ ]
34
+ end
35
+ end
36
+ end
37
+
38
+ hProject
39
+
40
+ end
41
+
42
+ end
43
+
44
+ end
45
+ end
46
+ end
47
+ end
@@ -27,6 +27,10 @@ module ADIWG
27
27
  end
28
28
  end
29
29
 
30
+ if hProvenance.empty?
31
+ return nil
32
+ end
33
+
30
34
  hProvenance
31
35
 
32
36
  end
@@ -0,0 +1,54 @@
1
+ # sbJson 1.0 writer publication
2
+
3
+ # History:
4
+ # Stan Smith 2017-06-03 original script
5
+
6
+ require 'jbuilder'
7
+ require_relative 'sbJson_codelists'
8
+
9
+ module ADIWG
10
+ module Mdtranslator
11
+ module Writers
12
+ module SbJson
13
+
14
+ module Publication
15
+
16
+ def self.build(hResource)
17
+
18
+ hPublication = {}
19
+
20
+ # citations for publications
21
+ hResource[:resourceTypes].each do |hType|
22
+ type = hType[:type]
23
+ if type == 'sciencePaper' || type == 'publication'
24
+ hCitation = hResource[:citation]
25
+ hPublication[:className] = 'gov.sciencebase.catalog.item.facet.CitationFacet'
26
+ hPublication[:citationType] = type
27
+ unless hCitation.empty?
28
+ unless hCitation[:otherDetails].empty?
29
+ note = hCitation[:otherDetails][0]
30
+ hPublication[:note] = note
31
+ end
32
+ unless hCitation[:series].empty?
33
+ series = hCitation[:series]
34
+ hPublication[:journal] = series[:seriesName] unless series[:seriesName].nil?
35
+ hPublication[:edition] = series[:seriesIssue] unless series[:seriesIssue].nil?
36
+ end
37
+ end
38
+ unless hResource[:defaultResourceLocale].empty?
39
+ language = hResource[:defaultResourceLocale][:languageCode]
40
+ hPublication[:language] = language unless language.nil?
41
+ end
42
+ end
43
+ end
44
+
45
+ hPublication
46
+
47
+ end
48
+
49
+ end
50
+
51
+ end
52
+ end
53
+ end
54
+ end
@@ -10,6 +10,15 @@ require_relative 'sbJson_citation'
10
10
  require_relative 'sbJson_identifier'
11
11
  require_relative 'sbJson_rights'
12
12
  require_relative 'sbJson_provenance'
13
+ require_relative 'sbJson_materialRequest'
14
+ require_relative 'sbJson_parentId'
15
+ require_relative 'sbJson_contact'
16
+ require_relative 'sbJson_webLink'
17
+ require_relative 'sbJson_browseCategory'
18
+ require_relative 'sbJson_tag'
19
+ require_relative 'sbJson_date'
20
+ require_relative 'sbJson_spatial'
21
+ require_relative 'sbJson_facet'
13
22
 
14
23
  module ADIWG
15
24
  module Mdtranslator
@@ -20,44 +29,33 @@ module ADIWG
20
29
 
21
30
  metadataInfo = intObj[:metadata][:metadataInfo]
22
31
  resourceInfo = intObj[:metadata][:resourceInfo]
32
+ distributorInfo = intObj[:metadata][:distributorInfo]
23
33
  hCitation = resourceInfo[:citation]
24
34
 
25
35
  @Namespace = ADIWG::Mdtranslator::Writers::SbJson
26
36
 
27
37
  Jbuilder.new do |json|
28
38
 
29
- # id
30
39
  json.id Id.build(intObj)
31
-
32
- # title / alternateTitles (incorporates subTitle)
33
- unless hCitation.empty?
34
- json.title hCitation[:title]
35
- json.alternateTitles hCitation[:alternateTitles] unless hCitation[:alternateTitles].empty?
36
- end
37
-
38
- # body / summary
40
+ json.title hCitation[:title] unless hCitation.empty?
41
+ json.alternateTitles hCitation[:alternateTitles] unless hCitation[:alternateTitles].empty?
39
42
  json.body resourceInfo[:abstract]
40
43
  json.summary resourceInfo[:shortAbstract]
41
-
42
- # citation / identifier
43
- unless hCitation.empty?
44
- json.citation Citation.build(hCitation)
45
- json.identifiers @Namespace.json_map(hCitation[:identifiers], Identifier)
46
- end
47
-
48
- # purpose
44
+ json.citation Citation.build(hCitation) unless hCitation.empty?
45
+ json.identifiers @Namespace.json_map(hCitation[:identifiers], Identifier) unless hCitation.empty?
49
46
  json.purpose resourceInfo[:purpose]
50
-
51
- # rights
52
- unless resourceInfo[:constraints].empty?
53
- json.rights Rights.build(resourceInfo[:constraints])
54
- end
55
-
56
- # provenance
47
+ json.rights Rights.build(resourceInfo[:constraints]) unless resourceInfo[:constraints].empty?
57
48
  json.provenance Provenance.build(metadataInfo)
58
-
59
- # material requisition instructions
60
- json.materialRequisitionInstructions
49
+ json.materialRequestInstructions MaterialRequest.build(distributorInfo) unless distributorInfo.empty?
50
+ json.parentId ParentId.build(metadataInfo[:parentMetadata]) unless metadataInfo[:parentMetadata].empty?
51
+ aContactList = Contact.get_contact_list(intObj)
52
+ json.contacts @Namespace.json_map(aContactList, Contact) unless aContactList.empty?
53
+ json.webLinks WebLink.build(intObj[:metadata])
54
+ json.browseCategories BrowseCategory.build(resourceInfo[:resourceTypes])
55
+ json.tags Tag.build(resourceInfo)
56
+ json.dates Date.build(hCitation) unless hCitation.empty?
57
+ json.spatial Spatial.build(resourceInfo[:extents]) unless resourceInfo[:extents].empty?
58
+ json.facets Facet.build(intObj[:metadata])
61
59
 
62
60
  end
63
61