hdo-storting-importer 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +1 -6
- data/README.md +4 -5
- data/features/convert.feature +189 -0
- data/hdo-storting-importer.gemspec +6 -0
- data/lib/hdo/storting_importer/category.rb +57 -0
- data/lib/hdo/storting_importer/cli.rb +76 -97
- data/lib/hdo/storting_importer/committee.rb +20 -0
- data/lib/hdo/storting_importer/district.rb +20 -0
- data/lib/hdo/storting_importer/issue.rb +51 -0
- data/lib/hdo/storting_importer/party.rb +20 -0
- data/lib/hdo/storting_importer/promise.rb +56 -1
- data/lib/hdo/storting_importer/promise_converter.rb +1 -20
- data/lib/hdo/storting_importer/representative.rb +47 -0
- data/lib/hdo/storting_importer/version.rb +1 -1
- data/lib/hdo/storting_importer/vote.rb +73 -0
- data/lib/hdo/storting_importer.rb +3 -1
- data/spec/hdo/storting_importer/category_spec.rb +25 -1
- data/spec/hdo/storting_importer/committee_spec.rb +22 -1
- data/spec/hdo/storting_importer/district_spec.rb +22 -1
- data/spec/hdo/storting_importer/issue_spec.rb +24 -18
- data/spec/hdo/storting_importer/party_spec.rb +21 -1
- data/spec/hdo/storting_importer/promise_spec.rb +56 -0
- data/spec/hdo/storting_importer/representative_spec.rb +24 -7
- data/spec/hdo/storting_importer/vote_spec.rb +41 -29
- metadata +85 -8
- data/features/import.feature +0 -85
- data/features/step_definitions/import_steps.rb +0 -0
- data/lib/hdo/storting_importer/script_importer.rb +0 -20
@@ -5,12 +5,32 @@ module Hdo
|
|
5
5
|
|
6
6
|
attr_reader :external_id, :name
|
7
7
|
|
8
|
+
def self.type_name
|
9
|
+
'party'
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.description
|
13
|
+
'a political party'
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.xml_example(builder = Util.builder)
|
17
|
+
new("DEM", "Democratic Party").to_hdo_xml(builder)
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.fields
|
21
|
+
[EXTERNAL_ID_FIELD, Field.new(:name, true, :string, 'The name of the party.')]
|
22
|
+
end
|
23
|
+
|
8
24
|
def self.from_storting_doc(doc)
|
9
25
|
doc.css("partier_liste parti").map do |node|
|
10
26
|
new node.css("id").first.text, node.css("navn").first.text
|
11
27
|
end
|
12
28
|
end
|
13
29
|
|
30
|
+
def self.from_hdo_doc(doc)
|
31
|
+
doc.css("parties > party").map { |e| from_hdo_node(e) }
|
32
|
+
end
|
33
|
+
|
14
34
|
def self.from_hdo_node(node)
|
15
35
|
new node.css("externalId").first.text, node.css("name").first.text
|
16
36
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
1
3
|
require 'csv'
|
2
4
|
|
3
5
|
module Hdo
|
@@ -6,6 +8,47 @@ module Hdo
|
|
6
8
|
attr_reader :party, :body, :general, :categories, :source, :page
|
7
9
|
alias_method :general?, :general
|
8
10
|
|
11
|
+
def self.type_name
|
12
|
+
'promise'
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.description
|
16
|
+
'a party promise'
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.fields
|
20
|
+
[
|
21
|
+
Field.new(:party, true, :string, 'The external id of the party.'),
|
22
|
+
Field.new(:general, true, :boolean, "Whether this is considered a general promise (i.e. can be ambigious whether it has been fulfilled)."),
|
23
|
+
Field.new(:categories, true, :list, "List of category names (matching names imported in <a href='#input-format-category'><category></a>)"),
|
24
|
+
Field.new(:source, true, :string, "The source of the promise. (TODO: this should always be a URL)"),
|
25
|
+
Field.new(:body, true, :string, "The body text of the promise."),
|
26
|
+
]
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.example
|
30
|
+
new("H", "Stille strengere krav til orden og oppførsel for å hindre at uro ødelegger undervisningen.", true, ["GRUNNSKOLE"], "PP", 8)
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.xml_example(builder = Util.builder)
|
34
|
+
example.to_hdo_xml(builder)
|
35
|
+
end
|
36
|
+
|
37
|
+
def self.from_hdo_doc(doc)
|
38
|
+
doc.css("promises > promise").map { |e| from_hdo_node(e) }
|
39
|
+
end
|
40
|
+
|
41
|
+
def self.from_hdo_node(node)
|
42
|
+
source, page = node.css("source").first.text.split(":")
|
43
|
+
|
44
|
+
new node.css("party").first.text,
|
45
|
+
node.css("body").first.text,
|
46
|
+
node.css("general").first.text == "true",
|
47
|
+
node.css("categories > category").map { |e| e.text },
|
48
|
+
source,
|
49
|
+
page
|
50
|
+
end
|
51
|
+
|
9
52
|
def self.from_csv(str)
|
10
53
|
# cleanup
|
11
54
|
str.gsub!(/\bFrp\b/, "FrP")
|
@@ -28,7 +71,7 @@ module Hdo
|
|
28
71
|
pr[:party].to_s.strip,
|
29
72
|
pr[:body].to_s.strip,
|
30
73
|
pr[:general].to_s.downcase == 'ja',
|
31
|
-
pr[:categories].split(",").map(&:upcase).map(&:strip),
|
74
|
+
pr[:categories].to_s.split(",").map(&:upcase).map(&:strip),
|
32
75
|
pr[:source].to_s.strip,
|
33
76
|
pr[:page].to_s.strip
|
34
77
|
)
|
@@ -44,6 +87,18 @@ module Hdo
|
|
44
87
|
@page = page
|
45
88
|
end
|
46
89
|
|
90
|
+
def to_hdo_xml(builder = Util.builder)
|
91
|
+
builder.promise do |promise|
|
92
|
+
promise.party party
|
93
|
+
promise.general general?
|
94
|
+
promise.categories do |cats|
|
95
|
+
categories.each { |e| cats.category e }
|
96
|
+
end
|
97
|
+
promise.source [source, page].join(":")
|
98
|
+
promise.body body
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
47
102
|
end
|
48
103
|
end
|
49
104
|
end
|
@@ -18,31 +18,12 @@ module Hdo
|
|
18
18
|
builder.promises do |promises|
|
19
19
|
@promises.each do |data|
|
20
20
|
next if data.body == "Løftetekst" || data.body.nil? || data.body.empty?
|
21
|
-
|
21
|
+
data.to_hdo_xml(promises)
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
25
25
|
builder.target!
|
26
26
|
end
|
27
|
-
|
28
|
-
def add_promise(promises, data)
|
29
|
-
promises.promise do |promise|
|
30
|
-
promise.party data.party.strip
|
31
|
-
promise.general data.general
|
32
|
-
promise.categories do |categories|
|
33
|
-
data.categories.each do |name|
|
34
|
-
categories.category name
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
promise.source [data.source, data.page].join(":")
|
39
|
-
promise.body data.body.strip
|
40
|
-
end
|
41
|
-
rescue
|
42
|
-
STDERR.puts data.inspect
|
43
|
-
raise
|
44
|
-
end
|
45
27
|
end
|
46
|
-
|
47
28
|
end
|
48
29
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
1
3
|
module Hdo
|
2
4
|
module StortingImporter
|
3
5
|
class Representative
|
@@ -8,6 +10,47 @@ module Hdo
|
|
8
10
|
|
9
11
|
attr_accessor :vote_result
|
10
12
|
|
13
|
+
def self.type_name
|
14
|
+
'representative'
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.description
|
18
|
+
'a member of parliament'
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.example
|
22
|
+
new(
|
23
|
+
'ADA',
|
24
|
+
'André Oktay',
|
25
|
+
'Dahl',
|
26
|
+
'M',
|
27
|
+
'1975-07-07T00:00:00',
|
28
|
+
'0001-01-01T00:00:00',
|
29
|
+
'Akershus',
|
30
|
+
'Høyre',
|
31
|
+
['Justiskomiteen'],
|
32
|
+
'2011-2012'
|
33
|
+
)
|
34
|
+
end
|
35
|
+
|
36
|
+
def self.xml_example(builder = Util.builder)
|
37
|
+
example.to_hdo_xml(builder)
|
38
|
+
end
|
39
|
+
|
40
|
+
def self.fields
|
41
|
+
[
|
42
|
+
EXTERNAL_ID_FIELD,
|
43
|
+
Field.new(:firstName, true, :string, 'The first name of the representative.'),
|
44
|
+
Field.new(:lastName, true, :string, 'The last name of the representative.'),
|
45
|
+
Field.new(:period, true, :string, "An identifier for the period the representative is elected for."),
|
46
|
+
Field.new(:district, true, :string, "The electoral district the representative belongs to. Must match the 'name' field of the district type."),
|
47
|
+
Field.new(:party, true, :string, "The name of the representative's party."),
|
48
|
+
Field.new(:committee, true, :list, "A (possibly empty) list of committees the representative is a member of. This should match the 'name' field of the committee type."),
|
49
|
+
Field.new(:dateOfBirth, true, :string, "The representative's birth date."),
|
50
|
+
Field.new(:dateOfDeath, false, :string, "The representative's death date."),
|
51
|
+
]
|
52
|
+
end
|
53
|
+
|
11
54
|
def self.from_storting_doc(doc)
|
12
55
|
nodes = doc.css("dagensrepresentant")
|
13
56
|
nodes += doc.css("representant")
|
@@ -39,6 +82,10 @@ module Hdo
|
|
39
82
|
)
|
40
83
|
end
|
41
84
|
|
85
|
+
def self.from_hdo_doc(doc)
|
86
|
+
doc.css("representatives > representative").map { |e| from_hdo_node e }
|
87
|
+
end
|
88
|
+
|
42
89
|
def self.from_hdo_node(node)
|
43
90
|
district_node = node.css("district").first
|
44
91
|
district = district_node ? district_node.text : ''
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
1
3
|
module Hdo
|
2
4
|
module StortingImporter
|
3
5
|
class Vote
|
@@ -10,6 +12,47 @@ module Hdo
|
|
10
12
|
alias_method :personal?, :personal
|
11
13
|
alias_method :enacted?, :enacted
|
12
14
|
|
15
|
+
def self.type_name
|
16
|
+
'vote'
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.description
|
20
|
+
'a parliamentary vote'
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.fields
|
24
|
+
[
|
25
|
+
EXTERNAL_ID_FIELD,
|
26
|
+
Field.new(:externalIssueId, true, :string, "The id (matching the issue's externalId) of the issue being voted on."),
|
27
|
+
Field.new(:counts, true, :element, "An element with <for>, <against> and <absent> counts (see example)."),
|
28
|
+
Field.new(:enacted, true, :boolean, "Whether the proposal was enacted."),
|
29
|
+
Field.new(:subject, true, :string, "The subject of the vote."),
|
30
|
+
Field.new(:method, true, :string, "??"),
|
31
|
+
Field.new(:resultType, true, :string, "??"),
|
32
|
+
Field.new(:time, true, :string, "The timestamp for the vote."),
|
33
|
+
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."),
|
34
|
+
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."),
|
35
|
+
]
|
36
|
+
end
|
37
|
+
|
38
|
+
def self.example
|
39
|
+
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)
|
40
|
+
|
41
|
+
rep = Representative.example
|
42
|
+
rep.vote_result = 'for'
|
43
|
+
vote.representatives << rep
|
44
|
+
|
45
|
+
prop = Vote::Proposition.example
|
46
|
+
|
47
|
+
vote.propositions << prop
|
48
|
+
|
49
|
+
vote
|
50
|
+
end
|
51
|
+
|
52
|
+
def self.xml_example(builder = Util.builder)
|
53
|
+
example.to_hdo_xml(builder)
|
54
|
+
end
|
55
|
+
|
13
56
|
def self.from_storting_doc(doc)
|
14
57
|
issue_id = doc.css("sak_id").first.text
|
15
58
|
|
@@ -35,6 +78,10 @@ module Hdo
|
|
35
78
|
end
|
36
79
|
end
|
37
80
|
|
81
|
+
def self.from_hdo_doc(doc)
|
82
|
+
doc.css("votes > vote").map { |e| from_hdo_node(e) }
|
83
|
+
end
|
84
|
+
|
38
85
|
def self.from_hdo_node(node)
|
39
86
|
external_id = node.css("externalId").first.text
|
40
87
|
external_issue_id = node.css("externalIssueId").first.text
|
@@ -140,6 +187,32 @@ module Hdo
|
|
140
187
|
end
|
141
188
|
|
142
189
|
class Proposition < Struct.new(:external_id, :description, :on_behalf_of, :body, :delivered_by)
|
190
|
+
def self.type_name
|
191
|
+
'proposition'
|
192
|
+
end
|
193
|
+
|
194
|
+
def self.example
|
195
|
+
new('1234', 'description', 'on behalf of', 'body', Representative.example)
|
196
|
+
end
|
197
|
+
|
198
|
+
def self.description
|
199
|
+
'a proposition being voted over'
|
200
|
+
end
|
201
|
+
|
202
|
+
def self.fields
|
203
|
+
[
|
204
|
+
EXTERNAL_ID_FIELD,
|
205
|
+
Field.new(:description, true, :string, 'A short description of the proposition.'),
|
206
|
+
Field.new(:deliveredBy, true, :string, "The representative that delivered the proposition. The element should contain a <a href='#input-format-representative'><representative></a> element."),
|
207
|
+
Field.new(:onBehalfOf, true, :string, "Description of who is behind the proposition."),
|
208
|
+
Field.new(:body, true, :string, "The full text of the proposition."),
|
209
|
+
]
|
210
|
+
end
|
211
|
+
|
212
|
+
def self.xml_example(builder = Util.builder)
|
213
|
+
example.to_hdo_xml(builder)
|
214
|
+
end
|
215
|
+
|
143
216
|
def self.from_hdo_node(node)
|
144
217
|
external_id = node.css("externalId").first.text
|
145
218
|
description = node.css("description").first.text
|
@@ -3,6 +3,9 @@ module Hdo
|
|
3
3
|
def self.root
|
4
4
|
@root ||= File.expand_path("../../..", __FILE__)
|
5
5
|
end
|
6
|
+
|
7
|
+
Field = Struct.new(:name, :required, :type, :description)
|
8
|
+
EXTERNAL_ID_FIELD = Field.new(:externalId, false, :string, 'An optional external id, matching potential id fields in the input data. This is useful if you want to reimport previous data without creating duplicates.')
|
6
9
|
end
|
7
10
|
end
|
8
11
|
|
@@ -22,7 +25,6 @@ require 'hdo/storting_importer/data_source'
|
|
22
25
|
require 'hdo/storting_importer/disk_data_source'
|
23
26
|
require 'hdo/storting_importer/api_data_source'
|
24
27
|
require 'hdo/storting_importer/parsing_data_source'
|
25
|
-
require 'hdo/storting_importer/script_importer'
|
26
28
|
|
27
29
|
require 'hdo/storting_importer/category'
|
28
30
|
require 'hdo/storting_importer/committee'
|
@@ -64,13 +64,37 @@ module Hdo
|
|
64
64
|
XML
|
65
65
|
end
|
66
66
|
|
67
|
-
it 'can deserialize HDO XML' do
|
67
|
+
it 'can deserialize a HDO XML node' do
|
68
68
|
orig = Category.new("5", "ARBEIDSLIV")
|
69
69
|
orig.children << Category.new("3", "LØNN")
|
70
70
|
|
71
71
|
Category.from_hdo_node(parse(orig.to_hdo_xml)).should == orig
|
72
72
|
end
|
73
73
|
|
74
|
+
it 'can deserialize a HDO XML doc' do
|
75
|
+
orig = Category.new("5", "ARBEIDSLIV")
|
76
|
+
orig.children << Category.new("3", "LØNN")
|
77
|
+
|
78
|
+
Category.from_hdo_doc(parse("<categories>#{orig.to_hdo_xml}</categories>")).should == [orig]
|
79
|
+
end
|
80
|
+
|
81
|
+
it 'has a type name' do
|
82
|
+
Category.type_name.should == 'category'
|
83
|
+
end
|
84
|
+
|
85
|
+
it 'has a description' do
|
86
|
+
Category.description.should be_kind_of(String)
|
87
|
+
end
|
88
|
+
|
89
|
+
it 'has an XML example' do
|
90
|
+
Category.xml_example.should be_kind_of(String)
|
91
|
+
end
|
92
|
+
|
93
|
+
it 'has a list of fields' do
|
94
|
+
Category.fields.should_not be_empty
|
95
|
+
end
|
96
|
+
|
97
|
+
|
74
98
|
end
|
75
99
|
end
|
76
100
|
end
|
@@ -35,11 +35,32 @@ module Hdo
|
|
35
35
|
XML
|
36
36
|
end
|
37
37
|
|
38
|
-
it 'can deserialize HDO XML' do
|
38
|
+
it 'can deserialize a HDO XML node' do
|
39
39
|
com = Committee.new("ARBSOS", 'Arbeids- og sosialkomiteen')
|
40
40
|
Committee.from_hdo_node(parse(com.to_hdo_xml)).should == com
|
41
41
|
end
|
42
42
|
|
43
|
+
it 'can deserialize a HDO XML doc' do
|
44
|
+
com = Committee.new("ARBSOS", 'Arbeids- og sosialkomiteen')
|
45
|
+
Committee.from_hdo_doc(parse("<committees>#{com.to_hdo_xml}</committees>")).should == [com]
|
46
|
+
end
|
47
|
+
|
48
|
+
it 'has a type name' do
|
49
|
+
Committee.type_name.should == 'committee'
|
50
|
+
end
|
51
|
+
|
52
|
+
it 'has a description' do
|
53
|
+
Committee.description.should be_kind_of(String)
|
54
|
+
end
|
55
|
+
|
56
|
+
it 'has an XML example' do
|
57
|
+
Committee.xml_example.should be_kind_of(String)
|
58
|
+
end
|
59
|
+
|
60
|
+
it 'has a list of fields' do
|
61
|
+
Committee.fields.should_not be_empty
|
62
|
+
end
|
63
|
+
|
43
64
|
|
44
65
|
end
|
45
66
|
end
|
@@ -43,11 +43,32 @@ module Hdo
|
|
43
43
|
XML
|
44
44
|
end
|
45
45
|
|
46
|
-
it 'can deserialize HDO XML' do
|
46
|
+
it 'can deserialize a HDO XML node' do
|
47
47
|
orig = District.new("Ak", "Akershus")
|
48
48
|
District.from_hdo_node(parse(orig.to_hdo_xml)).should == orig
|
49
49
|
end
|
50
50
|
|
51
|
+
it 'can deserialize a HDO XML doc' do
|
52
|
+
orig = District.new("Ak", "Akershus")
|
53
|
+
District.from_hdo_doc(parse("<districts>#{orig.to_hdo_xml}</districts>")).should == [orig]
|
54
|
+
end
|
55
|
+
|
56
|
+
it 'has a type name' do
|
57
|
+
District.type_name.should == 'district'
|
58
|
+
end
|
59
|
+
|
60
|
+
it 'has a description' do
|
61
|
+
District.description.should be_kind_of(String)
|
62
|
+
end
|
63
|
+
|
64
|
+
it 'has an XML example' do
|
65
|
+
District.xml_example.should be_kind_of(String)
|
66
|
+
end
|
67
|
+
|
68
|
+
it 'has a list of fields' do
|
69
|
+
District.fields.should_not be_empty
|
70
|
+
end
|
71
|
+
|
51
72
|
|
52
73
|
end
|
53
74
|
end
|
@@ -5,21 +5,6 @@ module Hdo
|
|
5
5
|
module StortingImporter
|
6
6
|
describe Issue do
|
7
7
|
|
8
|
-
def create_issue
|
9
|
-
Issue.new(
|
10
|
-
"53520",
|
11
|
-
"Inngåelse av avtale om opprettelse av sekretariatet for Den nordlige dimensjons partnerskap for helse og livskvalitet (NDPHS)",
|
12
|
-
"Samtykke til inngåelse av avtale av 25. november 2011 om opprettelse av sekretariatet for Den nordlige dimensjons partnerskap for helse og livskvalitet (NDPHS)",
|
13
|
-
"alminneligsak",
|
14
|
-
"mottatt",
|
15
|
-
"2012-04-20T00:00:00",
|
16
|
-
"Prop. 90 S (2011-2012)",
|
17
|
-
"proposisjon",
|
18
|
-
"Transport- og kommunikasjonskomiteen",
|
19
|
-
['UTENRIKSSAKER', 'TRAKTATER', 'NORDISK SAMARBEID']
|
20
|
-
)
|
21
|
-
end
|
22
|
-
|
23
8
|
it 'builds issues from Storting XML list' do
|
24
9
|
xml = <<-XML
|
25
10
|
<?xml version="1.0" encoding="utf-8"?>
|
@@ -85,7 +70,7 @@ module Hdo
|
|
85
70
|
end
|
86
71
|
|
87
72
|
it 'can serialize as HDO XML' do
|
88
|
-
|
73
|
+
Issue.example.to_hdo_xml.should == <<-XML
|
89
74
|
<issue>
|
90
75
|
<externalId>53520</externalId>
|
91
76
|
<summary>Inngåelse av avtale om opprettelse av sekretariatet for Den nordlige dimensjons partnerskap for helse og livskvalitet (NDPHS)</summary>
|
@@ -105,11 +90,32 @@ module Hdo
|
|
105
90
|
XML
|
106
91
|
end
|
107
92
|
|
108
|
-
it 'can deserialize HDO XML' do
|
109
|
-
orig =
|
93
|
+
it 'can deserialize an HDO XML node' do
|
94
|
+
orig = Issue.example
|
110
95
|
Issue.from_hdo_node(parse(orig.to_hdo_xml)).should == orig
|
111
96
|
end
|
112
97
|
|
98
|
+
it 'can deserialize an HDO XML doc' do
|
99
|
+
orig = Issue.example
|
100
|
+
Issue.from_hdo_doc(parse("<issues>#{orig.to_hdo_xml}</issues>")).should == [orig]
|
101
|
+
end
|
102
|
+
|
103
|
+
it 'has a type name' do
|
104
|
+
Issue.type_name.should == 'issue'
|
105
|
+
end
|
106
|
+
|
107
|
+
it 'has a description' do
|
108
|
+
Issue.description.should be_kind_of(String)
|
109
|
+
end
|
110
|
+
|
111
|
+
it 'has an XML example' do
|
112
|
+
Issue.xml_example.should be_kind_of(String)
|
113
|
+
end
|
114
|
+
|
115
|
+
it 'has a list of fields' do
|
116
|
+
Issue.fields.should_not be_empty
|
117
|
+
end
|
118
|
+
|
113
119
|
end
|
114
120
|
end
|
115
121
|
end
|
@@ -41,11 +41,31 @@ module Hdo
|
|
41
41
|
XML
|
42
42
|
end
|
43
43
|
|
44
|
-
it 'can deserialize HDO XML' do
|
44
|
+
it 'can deserialize a HDO XML node' do
|
45
45
|
orig = Party.new('Sp', 'Senterpartiet')
|
46
46
|
Party.from_hdo_node(parse(orig.to_hdo_xml)).should == orig
|
47
47
|
end
|
48
48
|
|
49
|
+
it 'can deserialize a HDO XML doc' do
|
50
|
+
orig = Party.new('Sp', 'Senterpartiet')
|
51
|
+
Party.from_hdo_doc(parse("<parties>#{orig.to_hdo_xml}</parties>")).should == [orig]
|
52
|
+
end
|
53
|
+
|
54
|
+
it 'has a type name' do
|
55
|
+
Party.type_name.should == 'party'
|
56
|
+
end
|
57
|
+
|
58
|
+
it 'has a description' do
|
59
|
+
Party.description.should be_kind_of(String)
|
60
|
+
end
|
61
|
+
|
62
|
+
it 'has an XML example' do
|
63
|
+
Party.xml_example.should be_kind_of(String)
|
64
|
+
end
|
65
|
+
|
66
|
+
it 'has a list of fields' do
|
67
|
+
Party.fields.should_not be_empty
|
68
|
+
end
|
49
69
|
|
50
70
|
end
|
51
71
|
end
|
@@ -33,6 +33,62 @@ module Hdo
|
|
33
33
|
prom.page.should == '10'
|
34
34
|
end
|
35
35
|
|
36
|
+
it 'serializes to HDO XML' do
|
37
|
+
Promise.example.to_hdo_xml.should == <<-XML
|
38
|
+
<promise>
|
39
|
+
<party>H</party>
|
40
|
+
<general>true</general>
|
41
|
+
<categories>
|
42
|
+
<category>GRUNNSKOLE</category>
|
43
|
+
</categories>
|
44
|
+
<source>PP:8</source>
|
45
|
+
<body>Stille strengere krav til orden og oppførsel for å hindre at uro ødelegger undervisningen.</body>
|
46
|
+
</promise>
|
47
|
+
XML
|
48
|
+
end
|
49
|
+
|
50
|
+
it 'deserializes from HDO XML' do
|
51
|
+
promises = Promise.from_hdo_doc(parse(<<-XML))
|
52
|
+
<promises>
|
53
|
+
<promise>
|
54
|
+
<party>H</party>
|
55
|
+
<general>true</general>
|
56
|
+
<categories>
|
57
|
+
<category>GRUNNSKOLE</category>
|
58
|
+
</categories>
|
59
|
+
<source>PP:8</source>
|
60
|
+
<body>Stille strengere krav til orden og oppførsel for å hindre at uro ødelegger undervisningen.</body>
|
61
|
+
</promise>
|
62
|
+
</promises>
|
63
|
+
XML
|
64
|
+
|
65
|
+
promises.size.should == 1
|
66
|
+
promise = promises.first
|
67
|
+
|
68
|
+
promise.party.should == "H"
|
69
|
+
promise.should be_general
|
70
|
+
promise.categories.should == ["GRUNNSKOLE"]
|
71
|
+
promise.source.should == "PP"
|
72
|
+
promise.page.should == "8"
|
73
|
+
promise.body.should == "Stille strengere krav til orden og oppførsel for å hindre at uro ødelegger undervisningen."
|
74
|
+
end
|
75
|
+
|
76
|
+
it 'has a description' do
|
77
|
+
Promise.description.should be_kind_of(String)
|
78
|
+
end
|
79
|
+
|
80
|
+
it 'has fields' do
|
81
|
+
Promise.fields.should_not be_empty
|
82
|
+
end
|
83
|
+
|
84
|
+
it 'has a type name' do
|
85
|
+
Promise.type_name.should == 'promise'
|
86
|
+
end
|
87
|
+
|
88
|
+
it 'has a an XML example' do
|
89
|
+
Promise.xml_example.should be_kind_of(String)
|
90
|
+
end
|
91
|
+
|
36
92
|
end
|
37
93
|
end
|
38
94
|
end
|
@@ -4,10 +4,6 @@ module Hdo
|
|
4
4
|
module StortingImporter
|
5
5
|
describe Representative do
|
6
6
|
|
7
|
-
def create_representative
|
8
|
-
Representative.new('ADA', 'André Oktay', 'Dahl', 'M', '1975-07-07T00:00:00', '0001-01-01T00:00:00', 'Akershus', 'Høyre', ['Justiskomiteen'], '2011-2012')
|
9
|
-
end
|
10
|
-
|
11
7
|
it "builds representatives from the Storting XML list" do
|
12
8
|
xml = <<-XML
|
13
9
|
<?xml version="1.0" encoding="utf-8"?>
|
@@ -52,7 +48,7 @@ module Hdo
|
|
52
48
|
end
|
53
49
|
|
54
50
|
it 'converts itself into HDO XML' do
|
55
|
-
rep =
|
51
|
+
rep = Representative.example
|
56
52
|
rep.to_hdo_xml.should == <<-XML
|
57
53
|
<representative>
|
58
54
|
<externalId>ADA</externalId>
|
@@ -71,11 +67,32 @@ module Hdo
|
|
71
67
|
XML
|
72
68
|
end
|
73
69
|
|
74
|
-
it 'can deserialize HDO XML' do
|
75
|
-
rep =
|
70
|
+
it 'can deserialize a HDO XML node' do
|
71
|
+
rep = Representative.example
|
76
72
|
Representative.from_hdo_node(parse(rep.to_hdo_xml)).should == rep
|
77
73
|
end
|
78
74
|
|
75
|
+
it 'can deserialize a HDO XML doc' do
|
76
|
+
rep = Representative.example
|
77
|
+
Representative.from_hdo_doc(parse("<representatives>#{rep.to_hdo_xml}</representatives>")).should == [rep]
|
78
|
+
end
|
79
|
+
|
80
|
+
it 'has a type name' do
|
81
|
+
Representative.type_name.should == 'representative'
|
82
|
+
end
|
83
|
+
|
84
|
+
it 'has a description' do
|
85
|
+
Representative.description.should be_kind_of(String)
|
86
|
+
end
|
87
|
+
|
88
|
+
it 'has an XML example' do
|
89
|
+
Representative.xml_example.should be_kind_of(String)
|
90
|
+
end
|
91
|
+
|
92
|
+
it 'has a list of fields' do
|
93
|
+
Representative.fields.should_not be_empty
|
94
|
+
end
|
95
|
+
|
79
96
|
end
|
80
97
|
end
|
81
98
|
end
|