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.
Files changed (50) hide show
  1. data/Gemfile +1 -1
  2. data/Rakefile +0 -1
  3. data/features/convert.feature +97 -79
  4. data/hdo-storting-importer.gemspec +5 -0
  5. data/lib/hdo/storting_importer/category.rb +16 -56
  6. data/lib/hdo/storting_importer/cli.rb +6 -34
  7. data/lib/hdo/storting_importer/committee.rb +13 -24
  8. data/lib/hdo/storting_importer/converter.rb +4 -9
  9. data/lib/hdo/storting_importer/district.rb +12 -24
  10. data/lib/hdo/storting_importer/fusion_table.rb +52 -0
  11. data/lib/hdo/storting_importer/has_json_schema.rb +85 -0
  12. data/lib/hdo/storting_importer/issue.rb +29 -60
  13. data/lib/hdo/storting_importer/party.rb +13 -24
  14. data/lib/hdo/storting_importer/promise.rb +60 -55
  15. data/lib/hdo/storting_importer/proposition.rb +61 -0
  16. data/lib/hdo/storting_importer/representative.rb +37 -70
  17. data/lib/hdo/storting_importer/schema/category.json +28 -0
  18. data/lib/hdo/storting_importer/schema/committee.json +21 -0
  19. data/lib/hdo/storting_importer/schema/district.json +21 -0
  20. data/lib/hdo/storting_importer/schema/issue.json +62 -0
  21. data/lib/hdo/storting_importer/schema/party.json +21 -0
  22. data/lib/hdo/storting_importer/schema/promise.json +42 -0
  23. data/lib/hdo/storting_importer/schema/proposition.json +34 -0
  24. data/lib/hdo/storting_importer/schema/representative.json +61 -0
  25. data/lib/hdo/storting_importer/schema/vote.json +64 -0
  26. data/lib/hdo/storting_importer/schema.json +5 -0
  27. data/lib/hdo/storting_importer/util.rb +13 -11
  28. data/lib/hdo/storting_importer/version.rb +1 -1
  29. data/lib/hdo/storting_importer/vote.rb +46 -143
  30. data/lib/hdo/storting_importer.rb +12 -3
  31. data/spec/fixtures/output/categories.json +1 -0
  32. data/spec/fixtures/output/committees.json +1 -0
  33. data/spec/fixtures/output/districts.json +1 -0
  34. data/spec/fixtures/output/issues.json +1 -0
  35. data/spec/fixtures/output/parties.json +1 -0
  36. data/spec/fixtures/output/representatives.json +1 -0
  37. data/spec/fixtures/output/votes.json +1 -0
  38. data/spec/hdo/storting_importer/category_spec.rb +29 -33
  39. data/spec/hdo/storting_importer/committee_spec.rb +29 -16
  40. data/spec/hdo/storting_importer/converter_spec.rb +3 -3
  41. data/spec/hdo/storting_importer/district_spec.rb +27 -18
  42. data/spec/hdo/storting_importer/issue_spec.rb +44 -27
  43. data/spec/hdo/storting_importer/party_spec.rb +25 -16
  44. data/spec/hdo/storting_importer/promise_spec.rb +54 -40
  45. data/spec/hdo/storting_importer/proposition_spec.rb +44 -0
  46. data/spec/hdo/storting_importer/representative_spec.rb +73 -26
  47. data/spec/hdo/storting_importer/vote_spec.rb +73 -75
  48. data/spec/spec_helper.rb +21 -1
  49. metadata +95 -3
  50. 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'>&lt;representative&gt;</a> objects with the property 'voteResult', for which valid values are 'for', 'against', 'absent'.",
61
+ "items": { "$ref": "hdo#representative" }
62
+ }
63
+ }
64
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "schemas": {
3
+
4
+ }
5
+ }
@@ -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
@@ -1,5 +1,5 @@
1
1
  module Hdo
2
2
  module StortingImporter
3
- VERSION = "0.0.8"
3
+ VERSION = "0.0.9"
4
4
  end
5
5
  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
- def self.type_name
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'>&lt;representative&gt;</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'>&lt;proposition&gt;</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 = Vote::Proposition.example
26
+ prop = Proposition.example
48
27
 
49
28
  vote.propositions << prop
50
29
 
51
30
  vote
52
31
  end
53
32
 
54
- def self.xml_example(builder = Util.builder)
55
- example.to_hdo_xml(builder)
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.from_hdo_doc(doc)
84
- doc.css("votes > vote").map { |e| from_hdo_node(e) }
85
- end
86
-
87
- def self.from_hdo_node(node)
88
- external_id = node.css("externalId").first.text
89
- external_issue_id = node.css("externalIssueId").first.text
90
- for_count = node.css("counts for").first.text
91
- against_count = node.css("counts against").first.text
92
- absent_count = node.css("counts absent").first.text
93
- personal = node.css("personal").first.text == 'true'
94
- enacted = node.css("enacted").first.text == 'true'
95
- subject = node.css("subject").first.text
96
- method = node.css("method").first.text
97
- result_type = node.css("resultType").first.text
98
- time = node.css("time").first.text
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 external_id, external_issue_id, personal, enacted, subject, method, result_type, time, for_count, against_count, absent_count
101
- vote.propositions = node.css("propositions proposition").map { |e| Proposition.from_hdo_node(e) }
102
- vote.representatives = node.css("representatives representative").map { |e| Representative.from_hdo_node(e) }
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 to_hdo_xml(builder = Util.builder)
163
- builder.vote do |vote|
164
- vote.externalId external_id
165
- vote.externalIssueId external_issue_id
166
- vote.counts do |c|
167
- c.for counts.for
168
- c.against counts.against
169
- c.absent counts.absent
170
- end
171
- vote.personal personal?
172
- vote.enacted enacted?
173
- vote.subject subject
174
- vote.method method
175
- vote.resultType result_type
176
- vote.time time
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
- end
194
-
195
- class Proposition
196
- include IvarEquality
197
- include Inspectable
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'>&lt;representative&gt;</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
- Vote::Proposition,
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.type_name}\x1b[0m\n"
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"}]