-
Notifications
You must be signed in to change notification settings - Fork 15
/
package.rb
53 lines (46 loc) · 1.45 KB
/
package.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
module CKAN
class Package < Model
self.site = "rest/package"
self.search = "search/package"
attr_reader :id
lazy_reader :name, :title, :url, :version, :author, :author_email,
:maintainer, :maintainer_email, :license_id, :notes
def initialize(id)
@id = id
end
def self.find(options=nil)
if options.nil?
@all_packages ||= read_remote_json_data(self.site).map{|id| Package.get(id)}
else
query = "?"
query += options.to_a.
map{|k,v| v.is_a?(Array) ? v.map{|vv| "#{k}=#{URI.encode(vv)}"}.join("&") :
"#{k}=#{URI.encode(v)}"}.join("&")
result = read_remote_json_data(self.search + query)
if result["count"] != result["results"].size
query += "&offset=#{result["results"].size}&limit=#{result["count"] + result["results"].size}"
result["results"] += read_remote_json_data(self.search + query)["results"]
end
result["results"].map{|id| Package.get(id)}
end
end
def resources
read_lazy_data
@mapped_resources ||= @resources.
map do |r|
Resource.new(url: r["url"], format: r["format"], description: r["description"], hash: r["hash"])
end
end
def to_s
"CKAN::Package[#{@id}]"
end
protected
def self.get(id)
@package_map ||= {}
unless @package_map[id]
@package_map[id] = Package.new(id)
end
@package_map[id]
end
end
end