hdo-storting-importer 0.1.5 → 0.1.6
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.
- data/hdo-storting-importer.gemspec +1 -0
- data/lib/hdo/storting_importer/fusion_table.rb +1 -1
- data/lib/hdo/storting_importer/promise.rb +73 -25
- data/lib/hdo/storting_importer/schema/promise.json +11 -1
- data/lib/hdo/storting_importer/schema/representative.json +1 -1
- data/lib/hdo/storting_importer/version.rb +1 -1
- data/spec/hdo/storting_importer/promise_spec.rb +5 -4
- metadata +17 -1
@@ -23,6 +23,7 @@ Gem::Specification.new do |gem|
|
|
23
23
|
gem.add_runtime_dependency "unicode_utils"
|
24
24
|
gem.add_runtime_dependency "multi_json"
|
25
25
|
gem.add_runtime_dependency "yajl-ruby"
|
26
|
+
gem.add_runtime_dependency "roo"
|
26
27
|
gem.add_runtime_dependency "jschematic", ">= 0.1.0"
|
27
28
|
|
28
29
|
gem.add_development_dependency 'pry'
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# encoding: UTF-8
|
2
2
|
|
3
|
-
require '
|
3
|
+
require 'roo'
|
4
4
|
|
5
5
|
module Hdo
|
6
6
|
module StortingImporter
|
@@ -8,8 +8,7 @@ module Hdo
|
|
8
8
|
include HasJsonSchema
|
9
9
|
include IvarEquality
|
10
10
|
|
11
|
-
attr_reader :party, :body, :general, :categories, :source, :page
|
12
|
-
attr_accessor :external_id
|
11
|
+
attr_reader :external_id, :party, :body, :general, :categories, :source, :page, :date
|
13
12
|
alias_method :general?, :general
|
14
13
|
alias_method :short_inspect, :inspect
|
15
14
|
|
@@ -23,7 +22,8 @@ module Hdo
|
|
23
22
|
true,
|
24
23
|
["GRUNNSKOLE"],
|
25
24
|
"PP",
|
26
|
-
8
|
25
|
+
8,
|
26
|
+
'2009-06-01'
|
27
27
|
)
|
28
28
|
end
|
29
29
|
|
@@ -31,23 +31,70 @@ module Hdo
|
|
31
31
|
Util.json_pretty example
|
32
32
|
end
|
33
33
|
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
34
|
+
def self.from_xlsx(path)
|
35
|
+
table = Excelx.new(path)
|
36
|
+
raise "empty spreadsheet" unless table.first_row
|
37
|
+
|
38
|
+
errors = []
|
39
|
+
|
40
|
+
# 0 is empty, 1 is header
|
41
|
+
promises = 2.upto(table.last_row).map { |idx|
|
42
|
+
data = table.row(idx)
|
43
|
+
|
44
|
+
Hdo::StortingImporter.logger.info "promise row: #{data.inspect}"
|
45
|
+
|
46
|
+
external_id = data.fetch(0).to_i.to_s
|
47
|
+
date = data.fetch(1)
|
48
|
+
party = data.fetch(2)
|
49
|
+
body = data.fetch(3)
|
50
|
+
general = data.fetch(4).to_s.strip.downcase
|
51
|
+
categories = data.fetch(5)
|
52
|
+
source = data.fetch(6)
|
53
|
+
page = data.fetch(7)
|
54
|
+
|
55
|
+
unless %w[ja nei].include?(general)
|
56
|
+
errors << "row #{external_id}: unexpected value #{general.inspect} for general"
|
57
|
+
next
|
58
|
+
end
|
59
|
+
|
60
|
+
if page.to_s !~ /^\d+(\.\d+)?$/ || page.to_i == 0
|
61
|
+
errors << "row #{external_id}: unexpected value #{page.inspect} for page"
|
62
|
+
next
|
63
|
+
end
|
64
|
+
|
65
|
+
unless party
|
66
|
+
errors << "row #{external_id}: party missing"
|
67
|
+
next
|
68
|
+
end
|
69
|
+
|
70
|
+
unless body =~ /\.$/
|
71
|
+
body << "."
|
72
|
+
end
|
73
|
+
|
74
|
+
promise = new external_id,
|
75
|
+
party,
|
76
|
+
body,
|
77
|
+
general.downcase == "ja",
|
78
|
+
categories,
|
79
|
+
source,
|
80
|
+
Integer(page),
|
81
|
+
date
|
82
|
+
|
83
|
+
begin
|
84
|
+
promise.validate!
|
85
|
+
rescue Hdo::StortingImporter::ValidationError => ex
|
86
|
+
errors << "row #{external_id}: #{ex.message}"
|
87
|
+
next
|
88
|
+
end
|
89
|
+
|
90
|
+
promise
|
91
|
+
}.compact
|
92
|
+
|
93
|
+
if errors.any?
|
94
|
+
raise "found errors:\n#{errors.join("\n")}"
|
48
95
|
end
|
49
96
|
|
50
|
-
|
97
|
+
promises
|
51
98
|
end
|
52
99
|
|
53
100
|
def self.from_hash(hash)
|
@@ -57,12 +104,13 @@ module Hdo
|
|
57
104
|
hash['general'],
|
58
105
|
hash['categories'],
|
59
106
|
hash['source'],
|
60
|
-
hash['page']
|
107
|
+
hash['page'],
|
108
|
+
hash['date']
|
61
109
|
|
62
110
|
pr
|
63
111
|
end
|
64
112
|
|
65
|
-
def initialize(external_id, party, body, general, categories, source, page)
|
113
|
+
def initialize(external_id, party, body, general, categories, source, page, date)
|
66
114
|
@external_id = external_id
|
67
115
|
@party = strip_if_string(party)
|
68
116
|
@body = strip_if_string(body)
|
@@ -70,10 +118,11 @@ module Hdo
|
|
70
118
|
@categories = clean_categories(categories)
|
71
119
|
@source = strip_if_string(source)
|
72
120
|
@page = page
|
121
|
+
@date = date
|
73
122
|
end
|
74
123
|
|
75
124
|
def to_hash
|
76
|
-
|
125
|
+
{
|
77
126
|
'kind' => self.class.kind,
|
78
127
|
'externalId' => @external_id,
|
79
128
|
'party' => @party,
|
@@ -81,10 +130,9 @@ module Hdo
|
|
81
130
|
'categories' => @categories,
|
82
131
|
'source' => @source,
|
83
132
|
'page' => @page,
|
84
|
-
'body' => @body
|
133
|
+
'body' => @body,
|
134
|
+
'date' => @date
|
85
135
|
}
|
86
|
-
|
87
|
-
h
|
88
136
|
end
|
89
137
|
|
90
138
|
private
|
@@ -32,13 +32,23 @@
|
|
32
32
|
},
|
33
33
|
"source": {
|
34
34
|
"type": "string",
|
35
|
-
"description": "The source of the promise.
|
35
|
+
"description": "The source of the promise.",
|
36
36
|
"required": true
|
37
37
|
},
|
38
|
+
"page": {
|
39
|
+
"type": "number",
|
40
|
+
"description": "What page in the source the promise was found on"
|
41
|
+
},
|
38
42
|
"body": {
|
39
43
|
"type": "string",
|
40
44
|
"description": "The body text of the promise.",
|
41
45
|
"required": true
|
46
|
+
},
|
47
|
+
"date": {
|
48
|
+
"type": "string",
|
49
|
+
"description": "The date the promise was made.",
|
50
|
+
"format": "date",
|
51
|
+
"required": true
|
42
52
|
}
|
43
53
|
}
|
44
54
|
}
|
@@ -55,7 +55,7 @@
|
|
55
55
|
"voteResult": {
|
56
56
|
"type": "string",
|
57
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
|
-
"
|
58
|
+
"pattern": "for|against|absent"
|
59
59
|
}
|
60
60
|
}
|
61
61
|
}
|
@@ -18,23 +18,24 @@ module Hdo
|
|
18
18
|
"categories": ["GRUNNSKOLE"],
|
19
19
|
"source": "PP",
|
20
20
|
"page": 8,
|
21
|
-
"body": "Stille strengere krav til orden og oppførsel for å hindre at uro ødelegger undervisningen."
|
21
|
+
"body": "Stille strengere krav til orden og oppførsel for å hindre at uro ødelegger undervisningen.",
|
22
|
+
"date": "2009-06-01"
|
22
23
|
}
|
23
24
|
JSON
|
24
25
|
end
|
25
26
|
|
26
27
|
it 'strips trailing space from the body' do
|
27
|
-
promise = Promise.new("1", "Party", "Body ", true, ["æøå"], "PP", 8)
|
28
|
+
promise = Promise.new("1", "Party", "Body ", true, ["æøå"], "PP", 8, '2012-06-01')
|
28
29
|
promise.body.should == "Body"
|
29
30
|
end
|
30
31
|
|
31
32
|
it 'correctly upcases non-ASCII category names' do
|
32
|
-
promise = Promise.new("1", "Party", "Body", true, ["æøå"], "PP", 8)
|
33
|
+
promise = Promise.new("1", "Party", "Body", true, ["æøå"], "PP", 8, '2012-06-01')
|
33
34
|
promise.categories.should == ["ÆØÅ"]
|
34
35
|
end
|
35
36
|
|
36
37
|
it 'ignores empty categories' do
|
37
|
-
promise = Promise.new("1", "Party", "Body", true, ["FOO", ""], "PP", 8)
|
38
|
+
promise = Promise.new("1", "Party", "Body", true, ["FOO", ""], "PP", 8, '2012-06-01')
|
38
39
|
promise.categories.should == ["FOO"]
|
39
40
|
end
|
40
41
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hdo-storting-importer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.6
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -139,6 +139,22 @@ dependencies:
|
|
139
139
|
- - ! '>='
|
140
140
|
- !ruby/object:Gem::Version
|
141
141
|
version: '0'
|
142
|
+
- !ruby/object:Gem::Dependency
|
143
|
+
name: roo
|
144
|
+
requirement: !ruby/object:Gem::Requirement
|
145
|
+
none: false
|
146
|
+
requirements:
|
147
|
+
- - ! '>='
|
148
|
+
- !ruby/object:Gem::Version
|
149
|
+
version: '0'
|
150
|
+
type: :runtime
|
151
|
+
prerelease: false
|
152
|
+
version_requirements: !ruby/object:Gem::Requirement
|
153
|
+
none: false
|
154
|
+
requirements:
|
155
|
+
- - ! '>='
|
156
|
+
- !ruby/object:Gem::Version
|
157
|
+
version: '0'
|
142
158
|
- !ruby/object:Gem::Dependency
|
143
159
|
name: jschematic
|
144
160
|
requirement: !ruby/object:Gem::Requirement
|