hdo-storting-importer 0.0.8 → 0.0.9
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +1 -1
- data/Rakefile +0 -1
- data/features/convert.feature +97 -79
- data/hdo-storting-importer.gemspec +5 -0
- data/lib/hdo/storting_importer/category.rb +16 -56
- data/lib/hdo/storting_importer/cli.rb +6 -34
- data/lib/hdo/storting_importer/committee.rb +13 -24
- data/lib/hdo/storting_importer/converter.rb +4 -9
- data/lib/hdo/storting_importer/district.rb +12 -24
- data/lib/hdo/storting_importer/fusion_table.rb +52 -0
- data/lib/hdo/storting_importer/has_json_schema.rb +85 -0
- data/lib/hdo/storting_importer/issue.rb +29 -60
- data/lib/hdo/storting_importer/party.rb +13 -24
- data/lib/hdo/storting_importer/promise.rb +60 -55
- data/lib/hdo/storting_importer/proposition.rb +61 -0
- data/lib/hdo/storting_importer/representative.rb +37 -70
- data/lib/hdo/storting_importer/schema/category.json +28 -0
- data/lib/hdo/storting_importer/schema/committee.json +21 -0
- data/lib/hdo/storting_importer/schema/district.json +21 -0
- data/lib/hdo/storting_importer/schema/issue.json +62 -0
- data/lib/hdo/storting_importer/schema/party.json +21 -0
- data/lib/hdo/storting_importer/schema/promise.json +42 -0
- data/lib/hdo/storting_importer/schema/proposition.json +34 -0
- data/lib/hdo/storting_importer/schema/representative.json +61 -0
- data/lib/hdo/storting_importer/schema/vote.json +64 -0
- data/lib/hdo/storting_importer/schema.json +5 -0
- data/lib/hdo/storting_importer/util.rb +13 -11
- data/lib/hdo/storting_importer/version.rb +1 -1
- data/lib/hdo/storting_importer/vote.rb +46 -143
- data/lib/hdo/storting_importer.rb +12 -3
- data/spec/fixtures/output/categories.json +1 -0
- data/spec/fixtures/output/committees.json +1 -0
- data/spec/fixtures/output/districts.json +1 -0
- data/spec/fixtures/output/issues.json +1 -0
- data/spec/fixtures/output/parties.json +1 -0
- data/spec/fixtures/output/representatives.json +1 -0
- data/spec/fixtures/output/votes.json +1 -0
- data/spec/hdo/storting_importer/category_spec.rb +29 -33
- data/spec/hdo/storting_importer/committee_spec.rb +29 -16
- data/spec/hdo/storting_importer/converter_spec.rb +3 -3
- data/spec/hdo/storting_importer/district_spec.rb +27 -18
- data/spec/hdo/storting_importer/issue_spec.rb +44 -27
- data/spec/hdo/storting_importer/party_spec.rb +25 -16
- data/spec/hdo/storting_importer/promise_spec.rb +54 -40
- data/spec/hdo/storting_importer/proposition_spec.rb +44 -0
- data/spec/hdo/storting_importer/representative_spec.rb +73 -26
- data/spec/hdo/storting_importer/vote_spec.rb +73 -75
- data/spec/spec_helper.rb +21 -1
- metadata +95 -3
- data/.gitmodules +0 -3
@@ -0,0 +1,21 @@
|
|
1
|
+
{
|
2
|
+
"id": "hdo#party",
|
3
|
+
"description": "a political party",
|
4
|
+
"type":"object",
|
5
|
+
"properties": {
|
6
|
+
"kind": {
|
7
|
+
"type": "string",
|
8
|
+
"description": "This is always 'hdo#party'",
|
9
|
+
"default": "hdo#party",
|
10
|
+
"required": true
|
11
|
+
},
|
12
|
+
"externalId": {
|
13
|
+
"type": "string"
|
14
|
+
},
|
15
|
+
"name": {
|
16
|
+
"description": "The name of the party",
|
17
|
+
"type": "string",
|
18
|
+
"required": true
|
19
|
+
}
|
20
|
+
}
|
21
|
+
}
|
@@ -0,0 +1,42 @@
|
|
1
|
+
{
|
2
|
+
"id": "hdo#promise",
|
3
|
+
"description": "a party promise",
|
4
|
+
"type":"object",
|
5
|
+
"properties": {
|
6
|
+
"kind": {
|
7
|
+
"type": "string",
|
8
|
+
"description": "This is always 'hdo#promise'",
|
9
|
+
"default": "hdo#promise",
|
10
|
+
"required": true
|
11
|
+
},
|
12
|
+
"externalId": {
|
13
|
+
"type": "string"
|
14
|
+
},
|
15
|
+
"party": {
|
16
|
+
"type": "string",
|
17
|
+
"description": "The external id of the party.",
|
18
|
+
"required": true
|
19
|
+
},
|
20
|
+
"general": {
|
21
|
+
"type": "boolean",
|
22
|
+
"description": "Whether this is considered a general promise (i.e. can be ambigious whether it has been fulfilled).",
|
23
|
+
"required": true
|
24
|
+
},
|
25
|
+
"categories": {
|
26
|
+
"type": "array",
|
27
|
+
"description": "List of category names.",
|
28
|
+
"items": { "type": "string" },
|
29
|
+
"required": true
|
30
|
+
},
|
31
|
+
"source": {
|
32
|
+
"type": "string",
|
33
|
+
"description": "The source of the promise. (TODO: this should always be a URL)",
|
34
|
+
"required": true
|
35
|
+
},
|
36
|
+
"body": {
|
37
|
+
"type": "string",
|
38
|
+
"description": "The body text of the promise.",
|
39
|
+
"required": true
|
40
|
+
}
|
41
|
+
}
|
42
|
+
}
|
@@ -0,0 +1,34 @@
|
|
1
|
+
{
|
2
|
+
"id": "hdo#proposition",
|
3
|
+
"description": "a proposition being voted over",
|
4
|
+
"type":"object",
|
5
|
+
"properties": {
|
6
|
+
"kind": {
|
7
|
+
"type": "string",
|
8
|
+
"description": "This is always 'hdo#proposition'",
|
9
|
+
"default": "hdo#proposition",
|
10
|
+
"required": true
|
11
|
+
},
|
12
|
+
"externalId": {
|
13
|
+
"type": "string"
|
14
|
+
},
|
15
|
+
"description": {
|
16
|
+
"type": "string",
|
17
|
+
"description": "A short description of the proposition.",
|
18
|
+
"required": true
|
19
|
+
},
|
20
|
+
"onBehalfOf": {
|
21
|
+
"type": "string",
|
22
|
+
"description": "Description of who is behind the proposition.",
|
23
|
+
"required": true
|
24
|
+
},
|
25
|
+
"body": {
|
26
|
+
"type": "string",
|
27
|
+
"description": "The full text of the proposition.",
|
28
|
+
"required": true
|
29
|
+
},
|
30
|
+
"deliveredBy": {
|
31
|
+
"$ref": "hdo#representative"
|
32
|
+
}
|
33
|
+
}
|
34
|
+
}
|
@@ -0,0 +1,61 @@
|
|
1
|
+
{
|
2
|
+
"id": "hdo#representative",
|
3
|
+
"description": "a member of parliament",
|
4
|
+
"type":"object",
|
5
|
+
"properties": {
|
6
|
+
"kind": {
|
7
|
+
"type": "string",
|
8
|
+
"description": "This is always 'hdo#representative'",
|
9
|
+
"default": "hdo#representative",
|
10
|
+
"required": true
|
11
|
+
},
|
12
|
+
"externalId": {
|
13
|
+
"type": "string"
|
14
|
+
},
|
15
|
+
"firstName": {
|
16
|
+
"type": "string",
|
17
|
+
"description": "The first name of the representative",
|
18
|
+
"required": true
|
19
|
+
},
|
20
|
+
"lastName": {
|
21
|
+
"type": "string",
|
22
|
+
"description": "The first name of the representative",
|
23
|
+
"required": true
|
24
|
+
},
|
25
|
+
"period": {
|
26
|
+
"type": "string",
|
27
|
+
"description": "An identifier for the period the representative is elected for.",
|
28
|
+
"required": true
|
29
|
+
},
|
30
|
+
"district": {
|
31
|
+
"type": "string",
|
32
|
+
"description": "The electoral district the representative belongs to. Must match the 'name' field of the district type.",
|
33
|
+
"required": true
|
34
|
+
},
|
35
|
+
"party": {
|
36
|
+
"type": "string",
|
37
|
+
"description": "The name of the representative's party.",
|
38
|
+
"required": true
|
39
|
+
},
|
40
|
+
"committees": {
|
41
|
+
"type": "array",
|
42
|
+
"description": "A list of committees the representative is a member of. This should match the 'name' field of the committee type.",
|
43
|
+
"items": { "type": "string"},
|
44
|
+
"required": true
|
45
|
+
},
|
46
|
+
"dateOfBirth": {
|
47
|
+
"type": "string",
|
48
|
+
"description": "The representative's birth date.",
|
49
|
+
"required": true
|
50
|
+
},
|
51
|
+
"dateOfDeath": {
|
52
|
+
"type": "string",
|
53
|
+
"description": "The representative's death date."
|
54
|
+
},
|
55
|
+
"voteResult": {
|
56
|
+
"type": "string",
|
57
|
+
"description": "If this representative object is part of a hdo#vote, this property describes how the representative voted. Valid values are for|against|absent.",
|
58
|
+
"format": "for|against|absent"
|
59
|
+
}
|
60
|
+
}
|
61
|
+
}
|
@@ -0,0 +1,64 @@
|
|
1
|
+
{
|
2
|
+
"id": "hdo#vote",
|
3
|
+
"description": "a vote in parliament, including results and propositions",
|
4
|
+
"type":"object",
|
5
|
+
"properties": {
|
6
|
+
"kind": {
|
7
|
+
"type": "string",
|
8
|
+
"description": "This is always 'hdo#vote'",
|
9
|
+
"default": "hdo#vote",
|
10
|
+
"required": true
|
11
|
+
},
|
12
|
+
"externalId": {
|
13
|
+
"type": "string"
|
14
|
+
},
|
15
|
+
"externalIssueId": {
|
16
|
+
"type": "string",
|
17
|
+
"description": "External ID of the issue being voted on (TODO: this is an 'append', since one vote may have multiple issues).",
|
18
|
+
"required": true
|
19
|
+
},
|
20
|
+
"counts": {
|
21
|
+
"type": "object",
|
22
|
+
"description": "Count of for, against or absent representatives.",
|
23
|
+
"required": true,
|
24
|
+
"properties": {
|
25
|
+
"for": { "type": "number" },
|
26
|
+
"against": { "type": "number" },
|
27
|
+
"absent": { "type": "number" }
|
28
|
+
}
|
29
|
+
},
|
30
|
+
"personal": {
|
31
|
+
"type": "boolean",
|
32
|
+
"description": "Whether the vote was done using the voting system. If not, we attempt to infer the representative list from other votes on the same day.",
|
33
|
+
"required": true
|
34
|
+
},
|
35
|
+
"enacted": {
|
36
|
+
"type": "boolean",
|
37
|
+
"description": "Whether the proposal was enacted.",
|
38
|
+
"required": true
|
39
|
+
},
|
40
|
+
"subject": {
|
41
|
+
"type": "string",
|
42
|
+
"description": "The subject of the vote.",
|
43
|
+
"required": true
|
44
|
+
},
|
45
|
+
"time": {
|
46
|
+
"type": "string",
|
47
|
+
"description": "The timestamp for the vote.",
|
48
|
+
"required": true
|
49
|
+
},
|
50
|
+
"method": {
|
51
|
+
"type": "string",
|
52
|
+
"description": "Not entirely what sure this is at the moment."
|
53
|
+
},
|
54
|
+
"resultType": {
|
55
|
+
"type": "string",
|
56
|
+
"description": "Not entirely what sure this is at the moment."
|
57
|
+
},
|
58
|
+
"representatives": {
|
59
|
+
"type": "array",
|
60
|
+
"description": "An element with each representative's vote. The object should contain a set of <a href='#input-format-representative'><representative></a> objects with the property 'voteResult', for which valid values are 'for', 'against', 'absent'.",
|
61
|
+
"items": { "$ref": "hdo#representative" }
|
62
|
+
}
|
63
|
+
}
|
64
|
+
}
|
@@ -5,17 +5,6 @@ module Hdo
|
|
5
5
|
module Util
|
6
6
|
module_function
|
7
7
|
|
8
|
-
def builder
|
9
|
-
xml = Builder::XmlMarkup.new :indent => 2
|
10
|
-
|
11
|
-
if block_given?
|
12
|
-
yield xml
|
13
|
-
return xml.target!
|
14
|
-
end
|
15
|
-
|
16
|
-
xml
|
17
|
-
end
|
18
|
-
|
19
8
|
def remove_newlines(str)
|
20
9
|
str.gsub(/\r?\n/, '')
|
21
10
|
end
|
@@ -37,6 +26,19 @@ module Hdo
|
|
37
26
|
q
|
38
27
|
end
|
39
28
|
|
29
|
+
def json_pretty(obj)
|
30
|
+
case obj
|
31
|
+
when Array
|
32
|
+
obj.map! { |e| e.respond_to?(:to_hash) ? e.to_hash : e }
|
33
|
+
when Hash
|
34
|
+
# do nothing
|
35
|
+
else
|
36
|
+
obj = obj.to_hash if obj.respond_to?(:to_hash)
|
37
|
+
end
|
38
|
+
|
39
|
+
Yajl::Encoder.encode obj, :pretty => true, :indent => " "
|
40
|
+
end
|
41
|
+
|
40
42
|
end
|
41
43
|
end
|
42
44
|
end
|
@@ -3,6 +3,7 @@
|
|
3
3
|
module Hdo
|
4
4
|
module StortingImporter
|
5
5
|
class Vote
|
6
|
+
include HasJsonSchema
|
6
7
|
include IvarEquality
|
7
8
|
include Inspectable
|
8
9
|
|
@@ -13,29 +14,7 @@ module Hdo
|
|
13
14
|
alias_method :personal?, :personal
|
14
15
|
alias_method :enacted?, :enacted
|
15
16
|
|
16
|
-
|
17
|
-
'vote'
|
18
|
-
end
|
19
|
-
|
20
|
-
def self.description
|
21
|
-
'a parliamentary vote'
|
22
|
-
end
|
23
|
-
|
24
|
-
def self.fields
|
25
|
-
[
|
26
|
-
EXTERNAL_ID_FIELD,
|
27
|
-
Field.new(:externalIssueId, true, :string, "The id (matching the issue's externalId) of the issue being voted on."),
|
28
|
-
Field.new(:counts, true, :element, "An element with <for>, <against> and <absent> counts (see example)."),
|
29
|
-
Field.new(:enacted, true, :boolean, "Whether the proposal was enacted."),
|
30
|
-
Field.new(:personal, true, :boolean, "Whether the vote was done using the voting system. If not, we attempt to infer the representative list from other votes on the same day."),
|
31
|
-
Field.new(:subject, true, :string, "The subject of the vote."),
|
32
|
-
Field.new(:method, true, :string, "??"),
|
33
|
-
Field.new(:resultType, true, :string, "??"),
|
34
|
-
Field.new(:time, true, :string, "The timestamp for the vote."),
|
35
|
-
Field.new(:representatives, true, :element, "An element with each representative's vote. The element should contain a set of <a href='#input-format-representative'><representative></a> elements with an extra subnode 'voteResult', where valid values are 'for', 'against', 'absent'. See example."),
|
36
|
-
Field.new(:propositions, false, :element, "An element with each proposition being voted over. The element should contain a set of <a href='#input-format-proposition'><proposition></a> elements. See example."),
|
37
|
-
]
|
38
|
-
end
|
17
|
+
schema_path StortingImporter.lib.join("hdo/storting_importer/schema/vote.json").to_s
|
39
18
|
|
40
19
|
def self.example
|
41
20
|
vote = new('2175', '51448', true, false, 'Forslag 24 - 26 på vegne av Per Olaf Lundteigen', 'ikke_spesifisert', 'ikke_spesifisert', '2012-04-12T16:37:27.053', 2, 96, 71)
|
@@ -44,15 +23,15 @@ module Hdo
|
|
44
23
|
rep.vote_result = 'for'
|
45
24
|
vote.representatives << rep
|
46
25
|
|
47
|
-
prop =
|
26
|
+
prop = Proposition.example
|
48
27
|
|
49
28
|
vote.propositions << prop
|
50
29
|
|
51
30
|
vote
|
52
31
|
end
|
53
32
|
|
54
|
-
def self.
|
55
|
-
example
|
33
|
+
def self.json_example
|
34
|
+
Util.json_pretty example
|
56
35
|
end
|
57
36
|
|
58
37
|
def self.from_storting_doc(doc)
|
@@ -80,26 +59,26 @@ module Hdo
|
|
80
59
|
end
|
81
60
|
end
|
82
61
|
|
83
|
-
def self.
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
62
|
+
def self.from_hash(hash)
|
63
|
+
counts = hash.fetch("counts")
|
64
|
+
|
65
|
+
args = [
|
66
|
+
hash.fetch("externalId"),
|
67
|
+
hash.fetch("externalIssueId"),
|
68
|
+
hash.fetch("personal"),
|
69
|
+
hash.fetch("enacted"),
|
70
|
+
hash.fetch("subject"),
|
71
|
+
hash.fetch("method"),
|
72
|
+
hash.fetch("resultType"),
|
73
|
+
hash.fetch("time"),
|
74
|
+
counts.fetch("for"),
|
75
|
+
counts.fetch("against"),
|
76
|
+
counts.fetch("absent")
|
77
|
+
]
|
99
78
|
|
100
|
-
vote = new
|
101
|
-
vote.
|
102
|
-
vote.
|
79
|
+
vote = new(*args)
|
80
|
+
vote.representatives = hash.fetch('representatives').map { |e| Representative.from_hash(e) }
|
81
|
+
vote.propositions = hash.fetch('propositions').map { |e| Proposition.from_hash(e) }
|
103
82
|
|
104
83
|
vote
|
105
84
|
end
|
@@ -159,108 +138,32 @@ module Hdo
|
|
159
138
|
end
|
160
139
|
end
|
161
140
|
|
162
|
-
def
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
vote.representatives do |reps|
|
179
|
-
representatives.each do |rep|
|
180
|
-
rep.to_hdo_xml(reps)
|
181
|
-
end
|
182
|
-
end
|
183
|
-
|
184
|
-
vote.propositions do |props|
|
185
|
-
propositions.each do |prop|
|
186
|
-
prop.to_hdo_xml(props)
|
187
|
-
end
|
188
|
-
end
|
189
|
-
end
|
141
|
+
def to_hash
|
142
|
+
{
|
143
|
+
:kind => self.class.kind,
|
144
|
+
:externalId => @external_id,
|
145
|
+
:externalIssueId => @external_issue_id,
|
146
|
+
:counts => @counts.to_hash,
|
147
|
+
:personal => @personal,
|
148
|
+
:enacted => @enacted,
|
149
|
+
:subject => @subject,
|
150
|
+
:method => @method,
|
151
|
+
:resultType => @result_type,
|
152
|
+
:time => @time,
|
153
|
+
:representatives => @representatives.map(&:to_hash),
|
154
|
+
:propositions => @propositions.map(&:to_hash)
|
155
|
+
}
|
190
156
|
end
|
191
157
|
|
192
158
|
class Counts < Struct.new(:for, :against, :absent)
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
attr_reader :external_id, :description, :on_behalf_of, :body, :delivered_by
|
200
|
-
|
201
|
-
def self.type_name
|
202
|
-
'proposition'
|
203
|
-
end
|
204
|
-
|
205
|
-
def self.example
|
206
|
-
new('1234', 'description', 'on behalf of', 'body', Representative.example)
|
207
|
-
end
|
208
|
-
|
209
|
-
def self.description
|
210
|
-
'a proposition being voted over'
|
211
|
-
end
|
212
|
-
|
213
|
-
def self.fields
|
214
|
-
[
|
215
|
-
EXTERNAL_ID_FIELD,
|
216
|
-
Field.new(:description, true, :string, 'A short description of the proposition.'),
|
217
|
-
Field.new(:deliveredBy, true, :string, "The representative that delivered the proposition. The element should contain a <a href='#input-format-representative'><representative></a> element."),
|
218
|
-
Field.new(:onBehalfOf, true, :string, "Description of who is behind the proposition."),
|
219
|
-
Field.new(:body, true, :string, "The full text of the proposition."),
|
220
|
-
]
|
221
|
-
end
|
222
|
-
|
223
|
-
def self.xml_example(builder = Util.builder)
|
224
|
-
example.to_hdo_xml(builder)
|
225
|
-
end
|
226
|
-
|
227
|
-
def self.from_hdo_node(node)
|
228
|
-
external_id = node.css("externalId").first.text
|
229
|
-
description = node.css("description").first.text
|
230
|
-
on_behalf_of = node.css("onBehalfOf").first.text
|
231
|
-
body = node.css("body").first.text
|
232
|
-
|
233
|
-
delivered_by_node = node.css("deliveredBy representative").first
|
234
|
-
delivered_by = Representative.from_hdo_node(delivered_by_node) if delivered_by_node
|
235
|
-
|
236
|
-
new external_id, description, on_behalf_of, body, delivered_by
|
237
|
-
end
|
238
|
-
|
239
|
-
def initialize(external_id, description, on_behalf_of, body, delivered_by)
|
240
|
-
@external_id = external_id
|
241
|
-
@description = description
|
242
|
-
@on_behalf_of = on_behalf_of
|
243
|
-
@body = body
|
244
|
-
@delivered_by = delivered_by
|
245
|
-
end
|
246
|
-
|
247
|
-
def short_inspect
|
248
|
-
short_inspect_string :include => [:external_id, :description, :on_behalf_of]
|
159
|
+
def to_hash
|
160
|
+
{
|
161
|
+
:for => self.for,
|
162
|
+
:against => against,
|
163
|
+
:absent => absent
|
164
|
+
}
|
249
165
|
end
|
250
|
-
|
251
|
-
def to_hdo_xml(builder)
|
252
|
-
builder.proposition do |pr|
|
253
|
-
pr.externalId external_id
|
254
|
-
pr.description description
|
255
|
-
pr.onBehalfOf on_behalf_of
|
256
|
-
pr.body body
|
257
|
-
|
258
|
-
pr.deliveredBy do |db|
|
259
|
-
delivered_by.to_hdo_xml(db) if delivered_by
|
260
|
-
end
|
261
|
-
end
|
262
|
-
end
|
263
|
-
end # Proposition
|
166
|
+
end
|
264
167
|
|
265
168
|
end # Vote
|
266
169
|
end
|
@@ -9,11 +9,17 @@ require 'builder'
|
|
9
9
|
require 'unicode_utils'
|
10
10
|
require 'uri'
|
11
11
|
require 'multi_json'
|
12
|
+
require 'yajl/json_gem'
|
13
|
+
require 'jschematic'
|
12
14
|
|
13
15
|
module Hdo
|
14
16
|
module StortingImporter
|
15
17
|
def self.root
|
16
|
-
@root ||= File.expand_path("../../..", __FILE__)
|
18
|
+
@root ||= Pathname.new(File.expand_path("../../..", __FILE__))
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.lib
|
22
|
+
@lib ||= Pathname.new(File.expand_path("../..", __FILE__))
|
17
23
|
end
|
18
24
|
|
19
25
|
def self.types
|
@@ -25,7 +31,7 @@ module Hdo
|
|
25
31
|
Category,
|
26
32
|
Issue,
|
27
33
|
Vote,
|
28
|
-
|
34
|
+
Proposition,
|
29
35
|
Promise
|
30
36
|
]
|
31
37
|
end
|
@@ -51,7 +57,7 @@ module Hdo
|
|
51
57
|
end
|
52
58
|
|
53
59
|
types.each_with_index do |type, type_idx|
|
54
|
-
out.puts "\x1b[1m#{type.
|
60
|
+
out.puts "\x1b[1m#{type.kind}\x1b[0m\n"
|
55
61
|
|
56
62
|
type.fields.each_with_index do |field, field_idx|
|
57
63
|
|
@@ -100,7 +106,9 @@ end
|
|
100
106
|
require 'hdo/storting_importer/core_ext/enumerable'
|
101
107
|
require 'hdo/storting_importer/ivar_equality'
|
102
108
|
require 'hdo/storting_importer/inspectable'
|
109
|
+
require 'hdo/storting_importer/has_json_schema'
|
103
110
|
require 'hdo/storting_importer/util'
|
111
|
+
require 'hdo/storting_importer/fusion_table'
|
104
112
|
|
105
113
|
require 'hdo/storting_importer/data_source'
|
106
114
|
require 'hdo/storting_importer/disk_data_source'
|
@@ -114,6 +122,7 @@ require 'hdo/storting_importer/issue'
|
|
114
122
|
require 'hdo/storting_importer/party'
|
115
123
|
require 'hdo/storting_importer/promise'
|
116
124
|
require 'hdo/storting_importer/representative'
|
125
|
+
require 'hdo/storting_importer/proposition'
|
117
126
|
require 'hdo/storting_importer/vote'
|
118
127
|
|
119
128
|
require 'hdo/storting_importer/converter'
|
@@ -0,0 +1 @@
|
|
1
|
+
[{"kind":"hdo#category","externalId":"5","name":"ARBEIDSLIV","subCategories":[{"kind":"hdo#category","externalId":"205","name":"ARBEIDSMILJØ"},{"kind":"hdo#category","externalId":"94","name":"ARBEIDSVILKÅR"},{"kind":"hdo#category","externalId":"95","name":"LØNN"},{"kind":"hdo#category","externalId":"7","name":"SYSSELSETTING"}]},{"kind":"hdo#category","externalId":"173","name":"EFTA/EU","subCategories":[{"kind":"hdo#category","externalId":"173","name":"EFTA/EU"},{"kind":"hdo#category","externalId":"170","name":"EUROPARÅDET"},{"kind":"hdo#category","externalId":"168","name":"FN"},{"kind":"hdo#category","externalId":"169","name":"FN-STYRKER"},{"kind":"hdo#category","externalId":"180","name":"FREDSARBEID"},{"kind":"hdo#category","externalId":"165","name":"GRENSESPØRSMÅL"},{"kind":"hdo#category","externalId":"200","name":"INTERNASJONAL RETT"},{"kind":"hdo#category","externalId":"22","name":"INTERNASJONALT SAMARBEID"},{"kind":"hdo#category","externalId":"167","name":"MENNESKERETTIGHETER"},{"kind":"hdo#category","externalId":"177","name":"NATO"},{"kind":"hdo#category","externalId":"171","name":"NORDISK SAMARBEID"},{"kind":"hdo#category","externalId":"175","name":"POLAROMRÅDER"},{"kind":"hdo#category","externalId":"176","name":"SVALBARD"},{"kind":"hdo#category","externalId":"166","name":"TRAKTATER"},{"kind":"hdo#category","externalId":"174","name":"UTVIKLINGSHJELP"},{"kind":"hdo#category","externalId":"172","name":"ØKONOMISK SAMARBEID"}]},{"kind":"hdo#category","externalId":"4","name":"ENERGI","subCategories":[{"kind":"hdo#category","externalId":"72","name":"ATOMKRAFT"},{"kind":"hdo#category","externalId":"71","name":"ELEKTRISITET"},{"kind":"hdo#category","externalId":"74","name":"OLJE"},{"kind":"hdo#category","externalId":"75","name":"OLJEOMSETNING"},{"kind":"hdo#category","externalId":"190","name":"OLJEUTVINNING"},{"kind":"hdo#category","externalId":"178","name":"STATOIL ASA"},{"kind":"hdo#category","externalId":"73","name":"VASSDRAGSREGULERING"}]},{"kind":"hdo#category","externalId":"40","name":"FAMILIE","subCategories":[{"kind":"hdo#category","externalId":"41","name":"BARN"},{"kind":"hdo#category","externalId":"42","name":"BARNEHAGER"},{"kind":"hdo#category","externalId":"43","name":"BARNEVERN"},{"kind":"hdo#category","externalId":"24","name":"LIKESTILLING"}]},{"kind":"hdo#category","externalId":"187","name":"FINANSER","subCategories":[{"kind":"hdo#category","externalId":"192","name":"AKSJER"},{"kind":"hdo#category","externalId":"80","name":"AVGIFTER"},{"kind":"hdo#category","externalId":"87","name":"BANKER"},{"kind":"hdo#category","externalId":"50","name":"FORSIKRING"},{"kind":"hdo#category","externalId":"81","name":"MERVERDIAVGIFT"},{"kind":"hdo#category","externalId":"88","name":"NORGES BANK"},{"kind":"hdo#category","externalId":"83","name":"PRISER OG KONKURRANSEFORHOLD"},{"kind":"hdo#category","externalId":"53","name":"SKATTEADMINISTRASJON"},{"kind":"hdo#category","externalId":"54","name":"SKATTEAVTALER"},{"kind":"hdo#category","externalId":"57","name":"SKATTEFRADRAG"},{"kind":"hdo#category","externalId":"58","name":"SKATTER"},{"kind":"hdo#category","externalId":"89","name":"STATSBANKER"},{"kind":"hdo#category","externalId":"185","name":"STATSBUDSJETTET"},{"kind":"hdo#category","externalId":"86","name":"STATSLÅN"},{"kind":"hdo#category","externalId":"191","name":"SÆRAVGIFTER"},{"kind":"hdo#category","externalId":"82","name":"TOLL"}]},{"kind":"hdo#category","externalId":"8","name":"FISKERIER","subCategories":[{"kind":"hdo#category","externalId":"9","name":"FANGST"},{"kind":"hdo#category","externalId":"91","name":"FISKEOMSETNING"},{"kind":"hdo#category","externalId":"92","name":"HAVBRUK"}]},{"kind":"hdo#category","externalId":"45","name":"FORSKNING"},{"kind":"hdo#category","externalId":"59","name":"FORSVAR","subCategories":[{"kind":"hdo#category","externalId":"93","name":"ATOMVÅPEN"},{"kind":"hdo#category","externalId":"60","name":"FORSVARSMATERIELL"},{"kind":"hdo#category","externalId":"193","name":"MILITÆRT PERSONELL"}]},{"kind":"hdo#category","externalId":"61","name":"HELSEVESEN","subCategories":[{"kind":"hdo#category","externalId":"188","name":"FOLKEHELSE"},{"kind":"hdo#category","externalId":"49","name":"FUNKSJONSHEMMEDE"},{"kind":"hdo#category","externalId":"62","name":"HELSEINSTITUSJONER"},{"kind":"hdo#category","externalId":"64","name":"HELSEPERSONELL"},{"kind":"hdo#category","externalId":"65","name":"SVANGERSKAP"},{"kind":"hdo#category","externalId":"66","name":"SYKDOMMER"},{"kind":"hdo#category","externalId":"63","name":"SYKEHUS"}]},{"kind":"hdo#category","externalId":"2","name":"KOMMUNIKASJON","subCategories":[{"kind":"hdo#category","externalId":"111","name":"FERGER"},{"kind":"hdo#category","externalId":"107","name":"JERNBANER"},{"kind":"hdo#category","externalId":"109","name":"LUFTFART"},{"kind":"hdo#category","externalId":"3","name":"POST"},{"kind":"hdo#category","externalId":"106","name":"SAMFERDSEL"},{"kind":"hdo#category","externalId":"179","name":"TELEKOMMUNIKASJONER"},{"kind":"hdo#category","externalId":"47","name":"VEGTRAFIKK"},{"kind":"hdo#category","externalId":"189","name":"VEGVESEN"}]},{"kind":"hdo#category","externalId":"6","name":"KULTUR","subCategories":[{"kind":"hdo#category","externalId":"67","name":"BIBLIOTEK OG LITTERATUR"},{"kind":"hdo#category","externalId":"127","name":"IDRETT"},{"kind":"hdo#category","externalId":"70","name":"KRINGKASTING"},{"kind":"hdo#category","externalId":"121","name":"KULTURVERN"},{"kind":"hdo#category","externalId":"68","name":"KUNST"},{"kind":"hdo#category","externalId":"142","name":"LOTTERI OG SPILL"},{"kind":"hdo#category","externalId":"122","name":"MASSEMEDIER"},{"kind":"hdo#category","externalId":"126","name":"NORSK RIKSKRINGKASTING"},{"kind":"hdo#category","externalId":"124","name":"SPRÅK"},{"kind":"hdo#category","externalId":"125","name":"UNGDOMSARBEID"}]},{"kind":"hdo#category","externalId":"46","name":"LANDBRUK","subCategories":[{"kind":"hdo#category","externalId":"129","name":"HUSDYR"},{"kind":"hdo#category","externalId":"128","name":"JORDBRUK"},{"kind":"hdo#category","externalId":"69","name":"LANDBRUKSPRODUKTER"},{"kind":"hdo#category","externalId":"132","name":"REINDRIFT"},{"kind":"hdo#category","externalId":"196","name":"SKOGBRUK"},{"kind":"hdo#category","externalId":"133","name":"VETERINÆRVESEN"}]},{"kind":"hdo#category","externalId":"184","name":"LOKALFORVALTNING","subCategories":[{"kind":"hdo#category","externalId":"38","name":"BOLIGSAKER"},{"kind":"hdo#category","externalId":"136","name":"BYGNINGSVESEN"},{"kind":"hdo#category","externalId":"220","name":"DISTRIKTSPOLITIKK"},{"kind":"hdo#category","externalId":"37","name":"FYLKER"},{"kind":"hdo#category","externalId":"134","name":"FYLKESKOMMUNENES ØKONOMI"},{"kind":"hdo#category","externalId":"138","name":"HUSBANKEN"},{"kind":"hdo#category","externalId":"18","name":"INNVANDRERE"},{"kind":"hdo#category","externalId":"135","name":"KOMMUNENES ØKONOMI"},{"kind":"hdo#category","externalId":"52","name":"KOMMUNER"},{"kind":"hdo#category","externalId":"39","name":"SAMER"}]},{"kind":"hdo#category","externalId":"139","name":"MILJØVERN","subCategories":[{"kind":"hdo#category","externalId":"21","name":"FORURENSNING"},{"kind":"hdo#category","externalId":"140","name":"KARTVERK"},{"kind":"hdo#category","externalId":"131","name":"NATURSKADER"},{"kind":"hdo#category","externalId":"23","name":"NATURVERN"}]},{"kind":"hdo#category","externalId":"113","name":"NÆRINGSLIV","subCategories":[{"kind":"hdo#category","externalId":"115","name":"BERGVERK"},{"kind":"hdo#category","externalId":"98","name":"FORBRUKERSAKER"},{"kind":"hdo#category","externalId":"20","name":"HANDEL"},{"kind":"hdo#category","externalId":"223","name":"INDUSTRI"},{"kind":"hdo#category","externalId":"114","name":"NÆRINGSUTVIKLING"},{"kind":"hdo#category","externalId":"112","name":"REISELIVSNÆRING"},{"kind":"hdo#category","externalId":"119","name":"STATSBEDRIFTER"},{"kind":"hdo#category","externalId":"99","name":"UTENRIKSHANDEL"},{"kind":"hdo#category","externalId":"97","name":"VAREHANDEL"},{"kind":"hdo#category","externalId":"195","name":"VERFTSINDUSTRI"}]},{"kind":"hdo#category","externalId":"11","name":"RETTSVESEN","subCategories":[{"kind":"hdo#category","externalId":"12","name":"DOMSTOLER"},{"kind":"hdo#category","externalId":"19","name":"FENGSLER"},{"kind":"hdo#category","externalId":"16","name":"KRIMINALOMSORG"},{"kind":"hdo#category","externalId":"17","name":"PERSONVERN"},{"kind":"hdo#category","externalId":"141","name":"POLITI OG PÅTALEMYNDIGHET"},{"kind":"hdo#category","externalId":"15","name":"REDNINGSTJENESTE"},{"kind":"hdo#category","externalId":"181","name":"SIVIL BEREDSKAP"},{"kind":"hdo#category","externalId":"198","name":"SIVILE VERNEPLIKTIGE"},{"kind":"hdo#category","externalId":"13","name":"SIVILRETT"},{"kind":"hdo#category","externalId":"14","name":"STRAFFERETT"}]},{"kind":"hdo#category","externalId":"143","name":"SJØFART","subCategories":[{"kind":"hdo#category","externalId":"147","name":"HAVNER"},{"kind":"hdo#category","externalId":"146","name":"SIKKERHET TIL SJØS"},{"kind":"hdo#category","externalId":"145","name":"SJØFOLK"}]},{"kind":"hdo#category","externalId":"10","name":"SOSIALVESEN","subCategories":[{"kind":"hdo#category","externalId":"148","name":"BARNETRYGD"},{"kind":"hdo#category","externalId":"48","name":"ELDREOMSORG"},{"kind":"hdo#category","externalId":"211","name":"RUSMIDLER"},{"kind":"hdo#category","externalId":"186","name":"TRYGDER"}]},{"kind":"hdo#category","externalId":"151","name":"STATSFORFATNING","subCategories":[{"kind":"hdo#category","externalId":"221","name":"GRUNNLOVEN"},{"kind":"hdo#category","externalId":"182","name":"KONGEN"},{"kind":"hdo#category","externalId":"154","name":"POLITISKE PARTIER"},{"kind":"hdo#category","externalId":"25","name":"REGJERINGEN"},{"kind":"hdo#category","externalId":"28","name":"RETTFERDSVEDERLAG"},{"kind":"hdo#category","externalId":"29","name":"RIKSREVISJONEN"},{"kind":"hdo#category","externalId":"203","name":"STORTINGET"},{"kind":"hdo#category","externalId":"222","name":"STORTINGETS FORRETNINGSORDEN"},{"kind":"hdo#category","externalId":"153","name":"STORTINGETS OMBUDSMANN FOR FORVALTNINGEN"},{"kind":"hdo#category","externalId":"26","name":"STORTINGSREPRESENTANTER"},{"kind":"hdo#category","externalId":"30","name":"VALG"}]},{"kind":"hdo#category","externalId":"155","name":"STATSFORVALTNING","subCategories":[{"kind":"hdo#category","externalId":"51","name":"DEPARTEMENTER"},{"kind":"hdo#category","externalId":"44","name":"STATENS PERSONALPOLITIKK"},{"kind":"hdo#category","externalId":"157","name":"STATSEIENDOMMER"}]},{"kind":"hdo#category","externalId":"105","name":"TROSSAMFUNN","subCategories":[{"kind":"hdo#category","externalId":"1","name":"DEN NORSKE KIRKE"}]},{"kind":"hdo#category","externalId":"32","name":"UTDANNING","subCategories":[{"kind":"hdo#category","externalId":"183","name":"GRUNNSKOLE"},{"kind":"hdo#category","externalId":"160","name":"HØGSKOLER"},{"kind":"hdo#category","externalId":"159","name":"HØYERE UTDANNING"},{"kind":"hdo#category","externalId":"33","name":"PRIVATSKOLER"},{"kind":"hdo#category","externalId":"31","name":"SKOLER"},{"kind":"hdo#category","externalId":"34","name":"SPESIALUNDERVISNING"},{"kind":"hdo#category","externalId":"36","name":"STUDIEFINANSIERING"},{"kind":"hdo#category","externalId":"35","name":"UNIVERSITETER"},{"kind":"hdo#category","externalId":"158","name":"VIDEREGÅENDE SKOLER"},{"kind":"hdo#category","externalId":"212","name":"VOKSENOPPLÆRING"}]},{"kind":"hdo#category","externalId":"163","name":"UTENRIKSSAKER","subCategories":[{"kind":"hdo#category","externalId":"173","name":"EFTA/EU"},{"kind":"hdo#category","externalId":"170","name":"EUROPARÅDET"},{"kind":"hdo#category","externalId":"168","name":"FN"},{"kind":"hdo#category","externalId":"169","name":"FN-STYRKER"},{"kind":"hdo#category","externalId":"180","name":"FREDSARBEID"},{"kind":"hdo#category","externalId":"165","name":"GRENSESPØRSMÅL"},{"kind":"hdo#category","externalId":"200","name":"INTERNASJONAL RETT"},{"kind":"hdo#category","externalId":"22","name":"INTERNASJONALT SAMARBEID"},{"kind":"hdo#category","externalId":"167","name":"MENNESKERETTIGHETER"},{"kind":"hdo#category","externalId":"177","name":"NATO"},{"kind":"hdo#category","externalId":"171","name":"NORDISK SAMARBEID"},{"kind":"hdo#category","externalId":"175","name":"POLAROMRÅDER"},{"kind":"hdo#category","externalId":"176","name":"SVALBARD"},{"kind":"hdo#category","externalId":"166","name":"TRAKTATER"},{"kind":"hdo#category","externalId":"174","name":"UTVIKLINGSHJELP"},{"kind":"hdo#category","externalId":"172","name":"ØKONOMISK SAMARBEID"}]}]
|
@@ -0,0 +1 @@
|
|
1
|
+
[{"kind":"hdo#committee","externalId":"ARBSOS","name":"Arbeids- og sosialkomiteen"},{"kind":"hdo#committee","externalId":"SÆRKOM","name":"Den særskilte komité til å behandle redegjørelse fra justisministeren og forsvarsministeren i Stortingets møte 10. november 2011 om angrepene 22. juli"},{"kind":"hdo#committee","externalId":"UUFK","name":"Den utvidede utenriks- og forsvarskomité"},{"kind":"hdo#committee","externalId":"ENERGI","name":"Energi- og miljøkomiteen"},{"kind":"hdo#committee","externalId":"FAMKULT","name":"Familie- og kulturkomiteen"},{"kind":"hdo#committee","externalId":"FINANS","name":"Finanskomiteen"},{"kind":"hdo#committee","externalId":"FULLMAKT","name":"Fullmaktskomiteen"},{"kind":"hdo#committee","externalId":"HELSEOMS","name":"Helse- og omsorgskomiteen"},{"kind":"hdo#committee","externalId":"JUSTIS","name":"Justiskomiteen"},{"kind":"hdo#committee","externalId":"KIRKE","name":"Kirke-, utdannings- og forskningskomiteen"},{"kind":"hdo#committee","externalId":"KOMMFORV","name":"Kommunal- og forvaltningskomiteen"},{"kind":"hdo#committee","externalId":"KONTROLL","name":"Kontroll- og konstitusjonskomiteen"},{"kind":"hdo#committee","externalId":"NÆRING","name":"Næringskomiteen"},{"kind":"hdo#committee","externalId":"PRES","name":"Stortingets presidentskap"},{"kind":"hdo#committee","externalId":"TRANSKOM","name":"Transport- og kommunikasjonskomiteen"},{"kind":"hdo#committee","externalId":"UFK","name":"Utenriks- og forsvarskomiteen"},{"kind":"hdo#committee","externalId":"VALG","name":"Valgkomiteen"}]
|
@@ -0,0 +1 @@
|
|
1
|
+
[{"kind":"hdo#district","externalId":"Ak","name":"Akershus"},{"kind":"hdo#district","externalId":"AA","name":"Aust-Agder"},{"kind":"hdo#district","externalId":"Bu","name":"Buskerud"},{"kind":"hdo#district","externalId":"Fi","name":"Finnmark"},{"kind":"hdo#district","externalId":"He","name":"Hedmark"},{"kind":"hdo#district","externalId":"Ho","name":"Hordaland"},{"kind":"hdo#district","externalId":"MR","name":"Møre og Romsdal"},{"kind":"hdo#district","externalId":"NT","name":"Nord-Trøndelag"},{"kind":"hdo#district","externalId":"No","name":"Nordland"},{"kind":"hdo#district","externalId":"Op","name":"Oppland"},{"kind":"hdo#district","externalId":"Os","name":"Oslo"},{"kind":"hdo#district","externalId":"Ro","name":"Rogaland"},{"kind":"hdo#district","externalId":"SF","name":"Sogn og Fjordane"},{"kind":"hdo#district","externalId":"ST","name":"Sør-Trøndelag"},{"kind":"hdo#district","externalId":"Te","name":"Telemark"},{"kind":"hdo#district","externalId":"Tr","name":"Troms"},{"kind":"hdo#district","externalId":"VA","name":"Vest-Agder"},{"kind":"hdo#district","externalId":"Ve","name":"Vestfold"},{"kind":"hdo#district","externalId":"Øs","name":"Østfold"}]
|