adiwg-mdtranslator 2.0.0rc8 → 2.0.0rc9

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 (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