Class: Datasets::CkanDataset

Inherits:
Dataset show all
Defined in:
app/models/datasets/ckan_dataset.rb

Instance Method Summary collapse

Methods inherited from Dataset

#customdataset

Methods included from RecsysHelpers

#add_edge, #remove_edge

Instance Method Details

#api_is_liveObject



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_existsObject



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_urlObject



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_dataObject



21
22
23
# File 'app/models/datasets/ckan_dataset.rb', line 21

def remove_data
  data.all(&:destroy)
end

#remove_licenseObject



33
34
35
# File 'app/models/datasets/ckan_dataset.rb', line 33

def remove_license
  license.destroy
end

#remove_sourcesObject



29
30
31
# File 'app/models/datasets/ckan_dataset.rb', line 29

def remove_sources
  sources.all(&:destroy)
end

#remove_tagsObject



25
26
27
# File 'app/models/datasets/ckan_dataset.rb', line 25

def remove_tags
  tags.all(&:destroy)
end

#save_metadataObject



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.provider_author = @dataset['author']
    self.provider_authoremail = @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_dataObject



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.author = author
    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_licenseObject



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_sourcesObject



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_tagsObject



70
71
72
73
74
75
76
77
# File 'app/models/datasets/ckan_dataset.rb', line 70

def set_tags
  @dataset['tags'].each do |tag|
    t = Tag.new(name: tag['name'])
    t.tagable = self
    error.add('Error creating tag ?') unless t.save!
    tags << t
  end
end

#validate_urlObject



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