hdo-storting-importer 0.0.8 → 0.0.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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"}]