Class: Datasets::CkanDataset
- Inherits:
-
Dataset
- Object
- ActiveRecord::Base
- ApplicationRecord
- Dataset
- Datasets::CkanDataset
- Defined in:
- app/models/datasets/ckan_dataset.rb
Instance Method Summary collapse
- #api_is_live ⇒ Object
- #dataset_exists ⇒ Object
- #parse_url ⇒ Object
- #remove_data ⇒ Object
- #remove_license ⇒ Object
- #remove_sources ⇒ Object
- #remove_tags ⇒ Object
- #save_metadata ⇒ Object
- #set_data ⇒ Object
- #set_license ⇒ Object
- #set_sources ⇒ Object
- #set_tags ⇒ Object
- #validate_url ⇒ Object
Methods inherited from Dataset
Methods included from RecsysHelpers
Instance Method Details
#api_is_live ⇒ Object
127 128 129 130 131 132 |
# File 'app/models/datasets/ckan_dataset.rb', line 127 def api_is_live api = @match[1] + '/api' response = JSON.parse(URI.open(api).read) errors.add(:api, 'is not responding') if response.nil? errors.add(:api, 'version is unknown !') if response['version'] > 3 end |
#dataset_exists ⇒ Object
117 118 119 120 121 122 123 124 125 |
# File 'app/models/datasets/ckan_dataset.rb', line 117 def dataset_exists url = @match[1] + '/api/action/package_show?id=' + @match[3] response = JSON.parse(URI.open(url).read) if response['success'] @dataset = response['result'] else errors.add(:url, 'dataset does not exists') end end |
#parse_url ⇒ Object
144 145 146 |
# File 'app/models/datasets/ckan_dataset.rb', line 144 def parse_url @match = %r{^((https|http)://[a-zA-Z0-9.]*)/dataset/(\S*)}.match(url) end |
#remove_data ⇒ Object
21 22 23 |
# File 'app/models/datasets/ckan_dataset.rb', line 21 def remove_data data.all(&:destroy) end |
#remove_license ⇒ Object
33 34 35 |
# File 'app/models/datasets/ckan_dataset.rb', line 33 def remove_license license.destroy end |
#remove_sources ⇒ Object
29 30 31 |
# File 'app/models/datasets/ckan_dataset.rb', line 29 def remove_sources sources.all(&:destroy) end |
#remove_tags ⇒ Object
25 26 27 |
# File 'app/models/datasets/ckan_dataset.rb', line 25 def .all(&:destroy) end |
#save_metadata ⇒ Object
37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
# File 'app/models/datasets/ckan_dataset.rb', line 37 def unless errors.count > 0 self.title = @dataset['title'] self.short_title = @dataset['name'] self.description = @dataset['description'] self.provider = %r{(http|https)://([a-zA-Z0-9.]*).*}.match(url)[2] self.provider_id = @dataset['id'] self.provider_type = 'CKAN' self.provider_url = @match[1] self. = @dataset['author'] self. = @dataset['author_email'] self.provider_version = @dataset['version'] self.provider_created_at = @dataset['metadata_created'] self.provider_updated_at = @dataset['metadata_modified'] end end |
#set_data ⇒ Object
79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 |
# File 'app/models/datasets/ckan_dataset.rb', line 79 def set_data @dataset['resources'].each do |resource| data = Datum.new data.title = resource['name'] data.description = resource['description'] data.url = resource['url'] data.format = resource['format'] data.filename = resource['filename'] data.provider_id = resource['id'] data.provider_created_at = resource['created'] data.provider_updated_at = resource['last_modified'] data. = data.dataset = self errors.add(:data, 'Error creating datum !') unless data.save! resource['fields']&.each do |field| f = Datafield.new(name: field['name'], title: field['title'], description: field['description'], format: field['format'], unit: field['unit']) f.datum = data data.datafields << f end self.data << data end end |
#set_license ⇒ Object
54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
# File 'app/models/datasets/ckan_dataset.rb', line 54 def set_license api_url = @match[1] + '/api/action/license_list' response = JSON.parse(URI.open(api_url).read) response['result'].each do |result| next unless result['id'] == @dataset['license_id'] license = License.new( title: result['title'], short_title: result['id'], url: result['url'] ) license.licenseable = self self.license = license end end |
#set_sources ⇒ Object
106 107 108 109 110 111 112 113 114 115 |
# File 'app/models/datasets/ckan_dataset.rb', line 106 def set_sources @dataset['sources']&.each do |source_id| url = @match[1] + '/api/action/organization_show?id=' + source_id response = JSON.parse(URI.open(url).read) source_url = provider_url + '/dataset?organization=' + response['result']['name'] source = Source.new(title: response['result']['title'], url: source_url) source.sourceable = self sources << source end end |
#set_tags ⇒ Object
70 71 72 73 74 75 76 77 |
# File 'app/models/datasets/ckan_dataset.rb', line 70 def @dataset['tags'].each do |tag| t = Tag.new(name: tag['name']) t.tagable = self error.add('Error creating tag ?') unless t.save! << t end end |
#validate_url ⇒ Object
134 135 136 137 138 139 140 141 142 |
# File 'app/models/datasets/ckan_dataset.rb', line 134 def validate_url errors.add(:url, 'does not contain http or https protocol') if %r{^(https|http)://}.match(url).nil? if @match.nil? || (@match.length != 4) errors.add(:url, 'is missing or does not match CKAN dataset format') else api_is_live dataset_exists end end |