factbook-fields 0.1.0
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.
- checksums.yaml +7 -0
- data/CHANGELOG.md +3 -0
- data/Manifest.txt +20 -0
- data/README.md +21 -0
- data/Rakefile +31 -0
- data/data/categories.csv +164 -0
- data/data/comparisons.csv +75 -0
- data/lib/factbook-fields.rb +30 -0
- data/lib/factbook-fields/builder.rb +67 -0
- data/lib/factbook-fields/category.rb +41 -0
- data/lib/factbook-fields/comparisons.rb +49 -0
- data/lib/factbook-fields/field.rb +23 -0
- data/lib/factbook-fields/normalize.rb +42 -0
- data/lib/factbook-fields/profile.rb +57 -0
- data/lib/factbook-fields/version.rb +24 -0
- data/lib/factbook/fields.rb +6 -0
- data/test/helper.rb +10 -0
- data/test/test_builder.rb +30 -0
- data/test/test_comparisons.rb +16 -0
- data/test/test_fields.rb +59 -0
- data/test/test_normalize.rb +21 -0
- metadata +117 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 1cf701b0c031d69ad0ebd0c7828368301135a1346cb5fe2552b4f88682c1c8c5
|
4
|
+
data.tar.gz: a7e0085fb8a08fb2b2de12dd2b86455fcc30b2dabf0021a4615ff347b3391eea
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 82769d5b529d51aebc6c61894ec1ada6ac408dabc5af37d9ea091a4b952349ee63a848f2dd252c28ab34f44a549c303da854efc1092c3bb1e20e776870b8c2ac
|
7
|
+
data.tar.gz: 7aece81108b6f4f36eecc4cba8c953063829e172a80e5a1303d61b5585f7ec7bf4d53a92c3d459197428c1c16f25ee2f7fb1bd7e4a4a79ad17b5a16053138b1f
|
data/CHANGELOG.md
ADDED
data/Manifest.txt
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
CHANGELOG.md
|
2
|
+
Manifest.txt
|
3
|
+
README.md
|
4
|
+
Rakefile
|
5
|
+
data/categories.csv
|
6
|
+
data/comparisons.csv
|
7
|
+
lib/factbook-fields.rb
|
8
|
+
lib/factbook-fields/builder.rb
|
9
|
+
lib/factbook-fields/category.rb
|
10
|
+
lib/factbook-fields/comparisons.rb
|
11
|
+
lib/factbook-fields/field.rb
|
12
|
+
lib/factbook-fields/normalize.rb
|
13
|
+
lib/factbook-fields/profile.rb
|
14
|
+
lib/factbook-fields/version.rb
|
15
|
+
lib/factbook/fields.rb
|
16
|
+
test/helper.rb
|
17
|
+
test/test_builder.rb
|
18
|
+
test/test_comparisons.rb
|
19
|
+
test/test_fields.rb
|
20
|
+
test/test_normalize.rb
|
data/README.md
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
# factbook-fields - world factbook country profile meta data - categories, fields, subfields, and more
|
2
|
+
|
3
|
+
|
4
|
+
* home :: [github.com/factbook/factbook](https://github.com/factbook/factbook)
|
5
|
+
* bugs :: [github.com/factbook/factbook/issues](https://github.com/factbook/factbook/issues)
|
6
|
+
* gem :: [rubygems.org/gems/factbook-fields](https://rubygems.org/gems/factbook-fields)
|
7
|
+
* rdoc :: [rubydoc.info/gems/factbook-fields](http://rubydoc.info/gems/factbook-fields)
|
8
|
+
* forum :: [groups.google.com/group/openmundi](https://groups.google.com/group/openmundi)
|
9
|
+
|
10
|
+
|
11
|
+
## What's the World Factbook?
|
12
|
+
|
13
|
+
See [factbook/factbook.json »](https://github.com/factbook/factbook.json)
|
14
|
+
|
15
|
+
|
16
|
+
|
17
|
+
## Usage
|
18
|
+
|
19
|
+
to be done
|
20
|
+
|
21
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'hoe'
|
2
|
+
require './lib/factbook-fields/version.rb'
|
3
|
+
|
4
|
+
|
5
|
+
Hoe.spec 'factbook-fields' do
|
6
|
+
|
7
|
+
self.version = Factbook::Module::Fields::VERSION
|
8
|
+
|
9
|
+
self.summary = 'factbook-fields - world factbook country profile meta data - categories, fields, subfields, and more'
|
10
|
+
self.description = summary
|
11
|
+
|
12
|
+
self.urls = { home: 'https://github.com/factbook/factbook' }
|
13
|
+
|
14
|
+
self.author = 'Gerald Bauer'
|
15
|
+
self.email = 'openmundi@googlegroups.com'
|
16
|
+
|
17
|
+
# switch extension to .markdown for gihub formatting
|
18
|
+
self.readme_file = 'README.md'
|
19
|
+
self.history_file = 'CHANGELOG.md'
|
20
|
+
|
21
|
+
self.extra_deps = [
|
22
|
+
['factbook-codes' ],
|
23
|
+
]
|
24
|
+
|
25
|
+
self.licenses = ['Public Domain']
|
26
|
+
|
27
|
+
self.spec_extras = {
|
28
|
+
required_ruby_version: '>= 2.2.2'
|
29
|
+
}
|
30
|
+
|
31
|
+
end
|
data/data/categories.csv
ADDED
@@ -0,0 +1,164 @@
|
|
1
|
+
Num,Category,Name,Notes
|
2
|
+
,Introduction,Background,
|
3
|
+
,Geography,Location,
|
4
|
+
,Geography,Geographic coordinates,
|
5
|
+
,Geography,Map references,
|
6
|
+
,Geography,Area,
|
7
|
+
,Geography,Area - comparative,
|
8
|
+
,Geography,Land boundaries,
|
9
|
+
,Geography,Coastline,
|
10
|
+
,Geography,Maritime claims,
|
11
|
+
,Geography,Climate,
|
12
|
+
,Geography,Terrain,
|
13
|
+
,Geography,Elevation extremes,
|
14
|
+
,Geography,Natural resources,
|
15
|
+
,Geography,Land use,
|
16
|
+
,Geography,Irrigated land,
|
17
|
+
,Geography,Total renewable water resources,
|
18
|
+
,Geography,Freshwater withdrawal (domestic/industrial/agricultural),
|
19
|
+
,Geography,Natural hazards,
|
20
|
+
,Geography,Environment - current issues,
|
21
|
+
,Geography,Environment - international agreements,
|
22
|
+
,Geography,Geography - note,
|
23
|
+
,People and Society,Nationality,
|
24
|
+
,People and Society,Ethnic groups,
|
25
|
+
,People and Society,Languages,
|
26
|
+
,People and Society,Religions,
|
27
|
+
,People and Society,Population,
|
28
|
+
,People and Society,Age structure,
|
29
|
+
,People and Society,Dependency ratios,
|
30
|
+
,People and Society,Median age,
|
31
|
+
,People and Society,Population growth rate,
|
32
|
+
,People and Society,Birth rate,
|
33
|
+
,People and Society,Death rate,
|
34
|
+
,People and Society,Net migration rate,
|
35
|
+
,People and Society,Urbanization,
|
36
|
+
,People and Society,Major urban areas - population,
|
37
|
+
,People and Society,Sex ratio,
|
38
|
+
,People and Society,Infant mortality rate,
|
39
|
+
,People and Society,Life expectancy at birth,
|
40
|
+
,People and Society,Total fertility rate,
|
41
|
+
,People and Society,Contraceptive prevalence rate,
|
42
|
+
,People and Society,Health expenditures,
|
43
|
+
,People and Society,Physicians density,
|
44
|
+
,People and Society,Hospital bed density,
|
45
|
+
,People and Society,Drinking water source,
|
46
|
+
,People and Society,Sanitation facility access,
|
47
|
+
,People and Society,HIV/AIDS - adult prevalence rate,
|
48
|
+
,People and Society,HIV/AIDS - people living with HIV/AIDS,
|
49
|
+
,People and Society,HIV/AIDS - deaths,
|
50
|
+
,People and Society,Obesity - adult prevalence rate,
|
51
|
+
,People and Society,Education expenditures,
|
52
|
+
,People and Society,School life expectancy (primary to tertiary education),
|
53
|
+
,People and Society,"Unemployment, youth ages 15-24",
|
54
|
+
,Government,Country name,
|
55
|
+
,Government,Government type,
|
56
|
+
,Government,Capital,
|
57
|
+
,Government,Administrative divisions,
|
58
|
+
,Government,Independence,
|
59
|
+
,Government,National holiday,
|
60
|
+
,Government,Constitution,
|
61
|
+
,Government,Legal system,
|
62
|
+
,Government,International law organization participation,
|
63
|
+
,Government,Suffrage,
|
64
|
+
,Government,Executive branch,
|
65
|
+
,Government,Legislative branch,
|
66
|
+
,Government,Judicial branch,
|
67
|
+
,Government,Political parties and leaders,
|
68
|
+
,Government,Political pressure groups and leaders,
|
69
|
+
,Government,International organization participation,
|
70
|
+
,Government,Diplomatic representation in the US,
|
71
|
+
,Government,Diplomatic representation from the US,
|
72
|
+
,Government,Flag description,
|
73
|
+
,Government,National symbol(s),
|
74
|
+
,Government,National anthem,
|
75
|
+
,Economy,Economy - overview,
|
76
|
+
,Economy,GDP (purchasing power parity),
|
77
|
+
,Economy,GDP (official exchange rate),
|
78
|
+
,Economy,GDP - real growth rate,
|
79
|
+
,Economy,GDP - per capita (PPP),
|
80
|
+
,Economy,Gross national saving,
|
81
|
+
,Economy,"GDP - composition, by end use",
|
82
|
+
,Economy,"GDP - composition, by sector of origin",
|
83
|
+
,Economy,Agriculture - products,
|
84
|
+
,Economy,Industries,
|
85
|
+
,Economy,Industrial production growth rate,
|
86
|
+
,Economy,Labor force,
|
87
|
+
,Economy,Labor force - by occupation,
|
88
|
+
,Economy,Unemployment rate,
|
89
|
+
,Economy,Population below poverty line,
|
90
|
+
,Economy,Household income or consumption by percentage share,
|
91
|
+
,Economy,Distribution of family income - Gini index,
|
92
|
+
,Economy,Budget,
|
93
|
+
,Economy,Taxes and other revenues,
|
94
|
+
,Economy,Budget surplus (+) or deficit (-),
|
95
|
+
,Economy,Public debt,
|
96
|
+
,Economy,Fiscal year,
|
97
|
+
,Economy,Inflation rate (consumer prices),
|
98
|
+
,Economy,Commercial bank prime lending rate,
|
99
|
+
,Economy,Stock of narrow money,
|
100
|
+
,Economy,Stock of broad money,
|
101
|
+
,Economy,Stock of domestic credit,
|
102
|
+
,Economy,Market value of publicly traded shares,
|
103
|
+
,Economy,Current account balance,
|
104
|
+
,Economy,Exports,
|
105
|
+
,Economy,Exports - commodities,
|
106
|
+
,Economy,Exports - partners,
|
107
|
+
,Economy,Imports,
|
108
|
+
,Economy,Imports - commodities,
|
109
|
+
,Economy,Imports - partners,
|
110
|
+
,Economy,Reserves of foreign exchange and gold,
|
111
|
+
,Economy,Debt - external,
|
112
|
+
,Economy,Stock of direct foreign investment - at home,
|
113
|
+
,Economy,Stock of direct foreign investment - abroad,
|
114
|
+
,Economy,Exchange rates,
|
115
|
+
,Energy,Electricity - production,
|
116
|
+
,Energy,Electricity - consumption,
|
117
|
+
,Energy,Electricity - exports,
|
118
|
+
,Energy,Electricity - imports,
|
119
|
+
,Energy,Electricity - installed generating capacity,
|
120
|
+
,Energy,Electricity - from fossil fuels,
|
121
|
+
,Energy,Electricity - from nuclear fuels,
|
122
|
+
,Energy,Electricity - from hydroelectric plants,
|
123
|
+
,Energy,Electricity - from other renewable sources,
|
124
|
+
,Energy,Crude oil - production,
|
125
|
+
,Energy,Crude oil - exports,
|
126
|
+
,Energy,Crude oil - imports,
|
127
|
+
,Energy,Crude oil - proved reserves,
|
128
|
+
,Energy,Refined petroleum products - production,
|
129
|
+
,Energy,Refined petroleum products - consumption,
|
130
|
+
,Energy,Refined petroleum products - exports,
|
131
|
+
,Energy,Refined petroleum products - imports,
|
132
|
+
,Energy,Natural gas - production,
|
133
|
+
,Energy,Natural gas - consumption,
|
134
|
+
,Energy,Natural gas - exports,
|
135
|
+
,Energy,Natural gas - imports,
|
136
|
+
,Energy,Natural gas - proved reserves,
|
137
|
+
,Energy,Carbon dioxide emissions from consumption of energy,
|
138
|
+
,Communications,Telephones - fixed lines,
|
139
|
+
,Communications,Telephones - mobile cellular,
|
140
|
+
,Communications,Telephone system,
|
141
|
+
,Communications,Broadcast media,
|
142
|
+
,Communications,Radio broadcast stations,
|
143
|
+
,Communications,Television broadcast stations,
|
144
|
+
,Communications,Internet country code,
|
145
|
+
,Communications,Internet users,
|
146
|
+
,Transportation,Airports,
|
147
|
+
,Transportation,Airports - with paved runways,
|
148
|
+
,Transportation,Airports - with unpaved runways,
|
149
|
+
,Transportation,Heliports,
|
150
|
+
,Transportation,Pipelines,
|
151
|
+
,Transportation,Railways,
|
152
|
+
,Transportation,Roadways,
|
153
|
+
,Transportation,Waterways,
|
154
|
+
,Transportation,Merchant marine,
|
155
|
+
,Transportation,Ports and terminals,
|
156
|
+
,Military,Military branches,
|
157
|
+
,Military,Military service age and obligation,
|
158
|
+
,Military,Manpower available for military service,
|
159
|
+
,Military,Manpower fit for military service,
|
160
|
+
,Military,Manpower reaching militarily significant age annually,
|
161
|
+
,Military,Military expenditures,
|
162
|
+
,Transnational Issues,Disputes - international,
|
163
|
+
,Transnational Issues,Refugees and internally displaced persons,
|
164
|
+
,Transnational Issues,Illicit drugs,
|
@@ -0,0 +1,75 @@
|
|
1
|
+
Num,Category,Name
|
2
|
+
2147,Geography,Area
|
3
|
+
2119,People and Society,Population
|
4
|
+
2002,People and Society,Population growth rate
|
5
|
+
2054,People and Society,Birth rate
|
6
|
+
2066,People and Society,Death rate
|
7
|
+
2112,People and Society,Net migration rate
|
8
|
+
2223,People and Society,Maternal mortality rate
|
9
|
+
2091,People and Society,Infant mortality rate
|
10
|
+
2102,People and Society,Life expectancy at birth
|
11
|
+
2127,People and Society,Total fertility rate
|
12
|
+
2225,People and Society,Health expenditures
|
13
|
+
2155,People and Society,HIV/AIDS - adult prevalence rate
|
14
|
+
2156,People and Society,HIV/AIDS - people living with HIV/AIDS
|
15
|
+
2157,People and Society,HIV/AIDS - deaths
|
16
|
+
2228,People and Society,Obesity - adult prevalence rate
|
17
|
+
2224,People and Society,Children under the age of 5 years underweight
|
18
|
+
2206,People and Society,Education expenditures
|
19
|
+
2229,People and Society,"Unemployment, youth ages 15-24"
|
20
|
+
2001,Economy,GDP (purchasing power parity)
|
21
|
+
2003,Economy,GDP - real growth rate
|
22
|
+
2004,Economy,GDP - per capita (PPP)
|
23
|
+
2260,Economy,Gross national saving
|
24
|
+
2089,Economy,Industrial production growth rate
|
25
|
+
2095,Economy,Labor force
|
26
|
+
2129,Economy,Unemployment rate
|
27
|
+
2172,Economy,Distribution of family income - Gini index
|
28
|
+
2221,Economy,Taxes and other revenues
|
29
|
+
2222,Economy,Budget surplus (+) or deficit (-)
|
30
|
+
2186,Economy,Public debt
|
31
|
+
2092,Economy,Inflation rate (consumer prices)
|
32
|
+
2207,Economy,Central bank discount rate
|
33
|
+
2208,Economy,Commercial bank prime lending rate
|
34
|
+
2214,Economy,Stock of narrow money
|
35
|
+
2215,Economy,Stock of broad money
|
36
|
+
2211,Economy,Stock of domestic credit
|
37
|
+
2200,Economy,Market value of publicly traded shares
|
38
|
+
2187,Economy,Current account balance
|
39
|
+
2078,Economy,Exports
|
40
|
+
2087,Economy,Imports
|
41
|
+
2188,Economy,Reserves of foreign exchange and gold
|
42
|
+
2079,Economy,Debt - external
|
43
|
+
2198,Economy,Stock of direct foreign investment - at home
|
44
|
+
2199,Economy,Stock of direct foreign investment - abroad
|
45
|
+
2232,Energy,Electricity - production
|
46
|
+
2233,Energy,Electricity - consumption
|
47
|
+
2234,Energy,Electricity - exports
|
48
|
+
2235,Energy,Electricity - imports
|
49
|
+
2236,Energy,Electricity - installed generating capacity
|
50
|
+
2237,Energy,Electricity - from fossil fuels
|
51
|
+
2239,Energy,Electricity - from nuclear fuels
|
52
|
+
2238,Energy,Electricity - from hydroelectric plants
|
53
|
+
2240,Energy,Electricity - from other renewable sources
|
54
|
+
2241,Energy,Crude oil - production
|
55
|
+
2242,Energy,Crude oil - exports
|
56
|
+
2243,Energy,Crude oil - imports
|
57
|
+
2244,Energy,Crude oil - proved reserves
|
58
|
+
2245,Energy,Refined petroleum products - production
|
59
|
+
2246,Energy,Refined petroleum products - consumption
|
60
|
+
2247,Energy,Refined petroleum products - exports
|
61
|
+
2248,Energy,Refined petroleum products - imports
|
62
|
+
2249,Energy,Natural gas - production
|
63
|
+
2250,Energy,Natural gas - consumption
|
64
|
+
2251,Energy,Natural gas - exports
|
65
|
+
2252,Energy,Natural gas - imports
|
66
|
+
2253,Energy,Natural gas - proved reserves
|
67
|
+
2150,Communications,Telephones - fixed lines
|
68
|
+
2151,Communications,Telephones - mobile cellular
|
69
|
+
2153,Communications,Internet users
|
70
|
+
2053,Transportation,Airports
|
71
|
+
2121,Transportation,Railways
|
72
|
+
2085,Transportation,Roadways
|
73
|
+
2093,Transportation,Waterways
|
74
|
+
2108,Transportation,Merchant marine
|
75
|
+
2034,Military,Military expenditures
|
@@ -0,0 +1,30 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
require 'factbook/codes'
|
4
|
+
|
5
|
+
|
6
|
+
# our own code
|
7
|
+
require 'factbook-fields/version' # let it always go first
|
8
|
+
|
9
|
+
require 'factbook-fields/category'
|
10
|
+
require 'factbook-fields/field'
|
11
|
+
require 'factbook-fields/profile'
|
12
|
+
|
13
|
+
require 'factbook-fields/normalize'
|
14
|
+
require 'factbook-fields/builder'
|
15
|
+
|
16
|
+
require 'factbook-fields/comparisons'
|
17
|
+
|
18
|
+
## note: make codes, comparisons available
|
19
|
+
module Factbook
|
20
|
+
## note: load on demand only builtin codes, comparisons, etc.
|
21
|
+
## for now
|
22
|
+
def self.comparisons
|
23
|
+
@@comparisons ||= Comparisons.read_csv( "#{Factbook::Module::Fields.root}/data/comparisons.csv" )
|
24
|
+
end
|
25
|
+
end # module Factbook
|
26
|
+
|
27
|
+
|
28
|
+
|
29
|
+
|
30
|
+
puts Factbook::Module::Fields.banner
|
@@ -0,0 +1,67 @@
|
|
1
|
+
|
2
|
+
module Factbook
|
3
|
+
|
4
|
+
|
5
|
+
######
|
6
|
+
# builder -- lets us rebuild a profile from "dumped" hash
|
7
|
+
|
8
|
+
class ProfileBuilder ## change to DataBuilder or such - why? why not?
|
9
|
+
include LogUtils::Logging
|
10
|
+
include NormalizeHelper ## e.g. normalize_category
|
11
|
+
|
12
|
+
|
13
|
+
attr_reader :profile,
|
14
|
+
:errors ## not used yet -- encoding erros etc.
|
15
|
+
|
16
|
+
|
17
|
+
|
18
|
+
|
19
|
+
|
20
|
+
def initialize( text_or_data )
|
21
|
+
|
22
|
+
data = if text_or_data.is_a?( String )
|
23
|
+
text = text_or_data
|
24
|
+
JSON.parse( text )
|
25
|
+
else ## assume it's already a hash
|
26
|
+
text_or_data
|
27
|
+
end
|
28
|
+
|
29
|
+
|
30
|
+
@profile = Profile.new
|
31
|
+
@errors = [] ## fix/todo: sorry - for now no errors possible/tracked
|
32
|
+
|
33
|
+
data.each do |k1,v1|
|
34
|
+
category_title = k1
|
35
|
+
category_data = v1
|
36
|
+
|
37
|
+
category = Category.new( category_title )
|
38
|
+
|
39
|
+
## get fields
|
40
|
+
category_data.each do |k2,v2|
|
41
|
+
field_title = k2
|
42
|
+
field_data = v2
|
43
|
+
|
44
|
+
field = Field.new( field_title )
|
45
|
+
|
46
|
+
#####
|
47
|
+
## note: run data hash through normalize_title (again)
|
48
|
+
if field_data.is_a?( Hash )
|
49
|
+
new_field_data = {}
|
50
|
+
field_data.each do |k3,v3|
|
51
|
+
new_field_data[ normalize_title(k3) ] = v3
|
52
|
+
end
|
53
|
+
field_data = new_field_data
|
54
|
+
end
|
55
|
+
|
56
|
+
field.data = field_data
|
57
|
+
|
58
|
+
category << field
|
59
|
+
end
|
60
|
+
@profile << category
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
end # class ProfileBuilder
|
65
|
+
|
66
|
+
|
67
|
+
end # module Factbook
|
@@ -0,0 +1,41 @@
|
|
1
|
+
|
2
|
+
module Factbook
|
3
|
+
|
4
|
+
|
5
|
+
class Category
|
6
|
+
include LogUtils::Logging
|
7
|
+
|
8
|
+
attr_reader :title ## use name instead of title - why? why not?
|
9
|
+
|
10
|
+
def initialize( title )
|
11
|
+
@title = title
|
12
|
+
@fields = {}
|
13
|
+
end
|
14
|
+
|
15
|
+
def add( field )
|
16
|
+
@fields[ field.title ] = field
|
17
|
+
end
|
18
|
+
alias_method :<<, :add
|
19
|
+
|
20
|
+
|
21
|
+
def [](key) ### convenience shortcut
|
22
|
+
@fields[ key ]
|
23
|
+
end
|
24
|
+
|
25
|
+
def size() @fields.size; end
|
26
|
+
|
27
|
+
|
28
|
+
|
29
|
+
def data ## convert to hash
|
30
|
+
## todo/fix: how to know when to rebuild?
|
31
|
+
## for now @data MUST be reset to nil manually
|
32
|
+
data = {}
|
33
|
+
@fields.each do |_,field|
|
34
|
+
data[ field.title ] = field.data
|
35
|
+
end
|
36
|
+
data
|
37
|
+
end
|
38
|
+
|
39
|
+
end # class Category
|
40
|
+
|
41
|
+
end # module Factbook
|
@@ -0,0 +1,49 @@
|
|
1
|
+
|
2
|
+
module Factbook
|
3
|
+
|
4
|
+
class Comparisons
|
5
|
+
|
6
|
+
Comparison = Struct.new( :num, ### todo: use no or id or something - why? why not?
|
7
|
+
:category, ## e.g. Geography, People, Economy, etc.
|
8
|
+
:name,
|
9
|
+
)
|
10
|
+
|
11
|
+
def self.read_csv( path )
|
12
|
+
|
13
|
+
rows = CsvHash.read( path )
|
14
|
+
|
15
|
+
pp rows
|
16
|
+
|
17
|
+
recs = []
|
18
|
+
rows.each do |row|
|
19
|
+
pp row
|
20
|
+
rec = Comparison.new
|
21
|
+
rec.num = row['Num'].strip.to_i ## remove leading n trailing whitespaces
|
22
|
+
rec.category = row['Category'].strip
|
23
|
+
rec.name = row['Name'].strip
|
24
|
+
|
25
|
+
pp rec
|
26
|
+
recs << rec
|
27
|
+
end
|
28
|
+
|
29
|
+
new( recs )
|
30
|
+
end
|
31
|
+
|
32
|
+
def initialize( comps )
|
33
|
+
@comps = comps
|
34
|
+
end
|
35
|
+
|
36
|
+
def size() @comps.size; end
|
37
|
+
|
38
|
+
def each
|
39
|
+
@comps.each {|comp| yield( comp ) }
|
40
|
+
end
|
41
|
+
|
42
|
+
def to_a
|
43
|
+
@comps.collect {|comp| comp.num } ## return array of nums -- return something else - why? why not?
|
44
|
+
end
|
45
|
+
|
46
|
+
end # class Comparison
|
47
|
+
|
48
|
+
end # module Factbook
|
49
|
+
|
@@ -0,0 +1,23 @@
|
|
1
|
+
|
2
|
+
module Factbook
|
3
|
+
|
4
|
+
|
5
|
+
class Field
|
6
|
+
include LogUtils::Logging
|
7
|
+
|
8
|
+
attr_reader :title ## use name instead of title - why? why not?
|
9
|
+
|
10
|
+
attr_accessor :data ## hash holding data e.g. { 'text' => '...' etc. }
|
11
|
+
|
12
|
+
def initialize( title )
|
13
|
+
@title = title
|
14
|
+
@data = {}
|
15
|
+
end
|
16
|
+
|
17
|
+
def [](key) ### convenience shortcut
|
18
|
+
@data[ key ]
|
19
|
+
end
|
20
|
+
|
21
|
+
end # class Field
|
22
|
+
|
23
|
+
end # module Factbook
|
@@ -0,0 +1,42 @@
|
|
1
|
+
|
2
|
+
module Factbook
|
3
|
+
module NormalizeHelper
|
4
|
+
|
5
|
+
|
6
|
+
def normalize_title( text )
|
7
|
+
|
8
|
+
## note: fix typos/errors with double colons e.g. note:: (instead of note:)
|
9
|
+
|
10
|
+
text = text.strip
|
11
|
+
text = text.sub( /:+\z/, '' ) # remove trailing : if present -- note: allow (fix) note:: too, thus, use :+
|
12
|
+
text = text.strip
|
13
|
+
|
14
|
+
#######################################
|
15
|
+
### special cases
|
16
|
+
|
17
|
+
## typos e.g ntoe => use note
|
18
|
+
text = 'note' if text == 'ntoe'
|
19
|
+
text = 'investment in fixed capital' if text == 'investment if fixed capital'
|
20
|
+
|
21
|
+
## downcase
|
22
|
+
text = 'lowest point' if text == 'Lowest point'
|
23
|
+
text = 'chief of state' if text == 'Chief of state'
|
24
|
+
|
25
|
+
## spelling variant (use more popular one)
|
26
|
+
text = 'signed, but not ratified' if text == 'signed but not ratified'
|
27
|
+
text = 'vectorborne diseases' if text == 'vectorborne disease'
|
28
|
+
text = 'water contact disease' if text == 'water contact diseases'
|
29
|
+
text = 'food or waterborne diseases' if text == 'food or waterborne disease'
|
30
|
+
text = 'geographic coordinates' if text == 'geographical coordinates'
|
31
|
+
text = 'note' if text == 'notes'
|
32
|
+
text = 'refugees (country of origin)' if text == 'refugees (countries of origin)'
|
33
|
+
|
34
|
+
## border countries (8): -- remove (x) counter
|
35
|
+
text = 'border countries' if text.start_with?( 'border countries')
|
36
|
+
|
37
|
+
text
|
38
|
+
end
|
39
|
+
|
40
|
+
|
41
|
+
end # module NormalizeHelper
|
42
|
+
end # module Factbook
|
@@ -0,0 +1,57 @@
|
|
1
|
+
|
2
|
+
module Factbook
|
3
|
+
|
4
|
+
|
5
|
+
class Profile
|
6
|
+
include LogUtils::Logging
|
7
|
+
|
8
|
+
## attr_reader :categories ## "structured" access e.g. categories/fields/etc.
|
9
|
+
## use each for access by default for categories - why? why not?
|
10
|
+
|
11
|
+
|
12
|
+
def self.read( path ) ## convenience helper
|
13
|
+
text = File.open( path, 'r:utf-8' ) { |f| f.read }
|
14
|
+
b = ProfileBuilder.new( text )
|
15
|
+
b.profile
|
16
|
+
end
|
17
|
+
|
18
|
+
|
19
|
+
def initialize
|
20
|
+
@categories = {}
|
21
|
+
end
|
22
|
+
|
23
|
+
def add( category )
|
24
|
+
@categories[ category.title ] = category
|
25
|
+
end
|
26
|
+
alias_method :<<, :add
|
27
|
+
|
28
|
+
def [](key) ### convenience shortcut
|
29
|
+
if key.is_a?( Integer ) ## allow access by 0,1,2, etc.
|
30
|
+
@categories.values[ key ]
|
31
|
+
else
|
32
|
+
@categories[key]
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def size() @categories.size; end
|
37
|
+
|
38
|
+
|
39
|
+
|
40
|
+
def to_h
|
41
|
+
data = {}
|
42
|
+
@categories.each do |_,category|
|
43
|
+
data[ category.title ] = category.data
|
44
|
+
end
|
45
|
+
data
|
46
|
+
end
|
47
|
+
|
48
|
+
def to_json( minify: false ) ## convenience helper for data.to_json; note: pretty print by default!
|
49
|
+
if minify
|
50
|
+
to_h.to_json
|
51
|
+
else ## note: pretty print by default!
|
52
|
+
JSON.pretty_generate( to_h )
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
end # class Profile
|
57
|
+
end # module Factbook
|
@@ -0,0 +1,24 @@
|
|
1
|
+
|
2
|
+
module Factbook
|
3
|
+
module Module
|
4
|
+
module Fields
|
5
|
+
MAJOR = 0
|
6
|
+
MINOR = 1
|
7
|
+
PATCH = 0
|
8
|
+
VERSION = [MAJOR,MINOR,PATCH].join('.')
|
9
|
+
|
10
|
+
def self.version
|
11
|
+
VERSION
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.banner
|
15
|
+
"factbook-fields/#{VERSION} on Ruby #{RUBY_VERSION} (#{RUBY_RELEASE_DATE}) [#{RUBY_PLATFORM}] in (#{root})"
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.root
|
19
|
+
File.expand_path( File.dirname(File.dirname(File.dirname(__FILE__))) )
|
20
|
+
end
|
21
|
+
|
22
|
+
end # module Fields
|
23
|
+
end # module Module
|
24
|
+
end # module Factbook
|
data/test/helper.rb
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
###
|
2
|
+
# to run use
|
3
|
+
# ruby -I ./lib -I ./test test/test_builder.rb
|
4
|
+
|
5
|
+
|
6
|
+
require 'helper'
|
7
|
+
|
8
|
+
|
9
|
+
class TestBuilder < MiniTest::Test
|
10
|
+
|
11
|
+
def test_read
|
12
|
+
code = 'au'
|
13
|
+
path = "#{Factbook::Module::Fields.root}/../testdata/json/#{code}.json"
|
14
|
+
profile = Factbook::Profile.read( path )
|
15
|
+
|
16
|
+
assert_equal 11, profile.size
|
17
|
+
assert_equal 1, profile[0].size ## e.g. Introduction/Background
|
18
|
+
assert_equal 1, profile['Introduction'].size ## e.g. Introduction/Background
|
19
|
+
|
20
|
+
assert_equal 'Central Europe, north of Italy and Slovenia',
|
21
|
+
profile['Geography']['Location']['text']
|
22
|
+
assert_equal '83,871 sq km',
|
23
|
+
profile['Geography']['Area']['total']['text']
|
24
|
+
|
25
|
+
|
26
|
+
assert true ## assume everthing ok
|
27
|
+
end
|
28
|
+
|
29
|
+
end # class TestBuilder
|
30
|
+
|
@@ -0,0 +1,16 @@
|
|
1
|
+
###
|
2
|
+
# to run use
|
3
|
+
# ruby -I ./lib -I ./test test/test_comparisons.rb
|
4
|
+
|
5
|
+
|
6
|
+
require 'helper'
|
7
|
+
|
8
|
+
|
9
|
+
class TestComparisons < MiniTest::Test
|
10
|
+
|
11
|
+
def test_comparisons
|
12
|
+
assert_equal 74, Factbook.comparisons.size
|
13
|
+
assert_equal 74, Factbook.comparisons.to_a.size
|
14
|
+
end
|
15
|
+
|
16
|
+
end # class TestComparisons
|
data/test/test_fields.rb
ADDED
@@ -0,0 +1,59 @@
|
|
1
|
+
###
|
2
|
+
# to run use
|
3
|
+
# ruby -I ./lib -I ./test test/test_fields.rb
|
4
|
+
|
5
|
+
|
6
|
+
require 'helper'
|
7
|
+
|
8
|
+
|
9
|
+
class TestFields < MiniTest::Test
|
10
|
+
|
11
|
+
def test_fields_new
|
12
|
+
|
13
|
+
field0 = Factbook::Field.new( 'Location' )
|
14
|
+
field0.data = { 'text' => 'Central Europe, north of Italy and Slovenia' }
|
15
|
+
|
16
|
+
field1 = Factbook::Field.new( 'Geographic coordinates' )
|
17
|
+
field1.data = { 'text' => '47 20 N, 13 20 E' }
|
18
|
+
|
19
|
+
category = Factbook::Category.new( 'Geography' )
|
20
|
+
category << field0
|
21
|
+
category << field1
|
22
|
+
|
23
|
+
profile = Factbook::Profile.new
|
24
|
+
profile << category
|
25
|
+
|
26
|
+
|
27
|
+
assert_equal 'Central Europe, north of Italy and Slovenia',
|
28
|
+
profile[ 'Geography' ][ 'Location' ][ 'text' ]
|
29
|
+
|
30
|
+
assert_equal '47 20 N, 13 20 E',
|
31
|
+
profile[ 'Geography' ][ 'Geographic coordinates' ][ 'text' ]
|
32
|
+
|
33
|
+
pp profile
|
34
|
+
|
35
|
+
puts
|
36
|
+
puts "json:"
|
37
|
+
puts profile.to_json
|
38
|
+
end
|
39
|
+
|
40
|
+
|
41
|
+
def test_fields_au
|
42
|
+
# note: use builtin test page (do NOT fetch via internet)
|
43
|
+
code = 'au'
|
44
|
+
path = "#{Factbook::Module::Fields.root}/../testdata/json/#{code}.json"
|
45
|
+
profile = Factbook::Profile.read( path )
|
46
|
+
|
47
|
+
assert_equal '-0.7% (of GDP) (2017 est.)',
|
48
|
+
profile['Economy']['Budget surplus (+) or deficit (-)']['text']
|
49
|
+
assert_equal '0.7%',
|
50
|
+
profile['Economy']['Labor force - by occupation']['agriculture']['text']
|
51
|
+
|
52
|
+
assert_equal 'Enns, Krems, Linz, Vienna (Danube)',
|
53
|
+
profile['Transportation']['Ports and terminals']['river port(s)']['text']
|
54
|
+
end
|
55
|
+
|
56
|
+
|
57
|
+
|
58
|
+
end # class TestFields
|
59
|
+
|
@@ -0,0 +1,21 @@
|
|
1
|
+
###
|
2
|
+
# to run use
|
3
|
+
# ruby -I ./lib -I ./test test/test_normalize.rb
|
4
|
+
|
5
|
+
|
6
|
+
require 'helper'
|
7
|
+
|
8
|
+
|
9
|
+
class TestNormalizer < MiniTest::Test
|
10
|
+
|
11
|
+
include Factbook::NormalizeHelper
|
12
|
+
|
13
|
+
def test_normalize
|
14
|
+
assert_equal 'border countries', normalize_title( 'border countries:' )
|
15
|
+
assert_equal 'border countries', normalize_title( 'border countries: ' )
|
16
|
+
assert_equal 'border countries', normalize_title( 'border countries (8):' )
|
17
|
+
assert_equal 'border countries', normalize_title( 'border countries (10): ' )
|
18
|
+
end
|
19
|
+
|
20
|
+
end # class TestNormalizer
|
21
|
+
|
metadata
ADDED
@@ -0,0 +1,117 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: factbook-fields
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Gerald Bauer
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2021-03-05 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: factbook-codes
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rdoc
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '4.0'
|
34
|
+
- - "<"
|
35
|
+
- !ruby/object:Gem::Version
|
36
|
+
version: '7'
|
37
|
+
type: :development
|
38
|
+
prerelease: false
|
39
|
+
version_requirements: !ruby/object:Gem::Requirement
|
40
|
+
requirements:
|
41
|
+
- - ">="
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '4.0'
|
44
|
+
- - "<"
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '7'
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: hoe
|
49
|
+
requirement: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - "~>"
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '3.22'
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - "~>"
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: '3.22'
|
61
|
+
description: factbook-fields - world factbook country profile meta data - categories,
|
62
|
+
fields, subfields, and more
|
63
|
+
email: openmundi@googlegroups.com
|
64
|
+
executables: []
|
65
|
+
extensions: []
|
66
|
+
extra_rdoc_files:
|
67
|
+
- CHANGELOG.md
|
68
|
+
- Manifest.txt
|
69
|
+
- README.md
|
70
|
+
files:
|
71
|
+
- CHANGELOG.md
|
72
|
+
- Manifest.txt
|
73
|
+
- README.md
|
74
|
+
- Rakefile
|
75
|
+
- data/categories.csv
|
76
|
+
- data/comparisons.csv
|
77
|
+
- lib/factbook-fields.rb
|
78
|
+
- lib/factbook-fields/builder.rb
|
79
|
+
- lib/factbook-fields/category.rb
|
80
|
+
- lib/factbook-fields/comparisons.rb
|
81
|
+
- lib/factbook-fields/field.rb
|
82
|
+
- lib/factbook-fields/normalize.rb
|
83
|
+
- lib/factbook-fields/profile.rb
|
84
|
+
- lib/factbook-fields/version.rb
|
85
|
+
- lib/factbook/fields.rb
|
86
|
+
- test/helper.rb
|
87
|
+
- test/test_builder.rb
|
88
|
+
- test/test_comparisons.rb
|
89
|
+
- test/test_fields.rb
|
90
|
+
- test/test_normalize.rb
|
91
|
+
homepage: https://github.com/factbook/factbook
|
92
|
+
licenses:
|
93
|
+
- Public Domain
|
94
|
+
metadata: {}
|
95
|
+
post_install_message:
|
96
|
+
rdoc_options:
|
97
|
+
- "--main"
|
98
|
+
- README.md
|
99
|
+
require_paths:
|
100
|
+
- lib
|
101
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
102
|
+
requirements:
|
103
|
+
- - ">="
|
104
|
+
- !ruby/object:Gem::Version
|
105
|
+
version: 2.2.2
|
106
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
requirements: []
|
112
|
+
rubygems_version: 3.1.4
|
113
|
+
signing_key:
|
114
|
+
specification_version: 4
|
115
|
+
summary: factbook-fields - world factbook country profile meta data - categories,
|
116
|
+
fields, subfields, and more
|
117
|
+
test_files: []
|