adwords_location 0.0.3
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/lib/adwords_location/location.rb +121 -0
- data/lib/adwords_location.rb +1 -0
- data/lib/data/adwords_api_cities_dma_regions_2014-05-21.csv +17012 -0
- data/lib/data/adwords_api_location_criteria_2014-05-21.csv +84776 -0
- metadata +48 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: a07d9ade4c72aef5c7e48a4ea85fd460fe1be206
|
4
|
+
data.tar.gz: d6983e9933b3537669d4c5c96b0e5d50e23512c3
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: f94f0bc590548e8640e8b87fa59864046acea6e8da7e8460965a16223467e0298c3662fa8a883ccc841052866f849916d9712689ee49e5c24bcf0ea68515727e
|
7
|
+
data.tar.gz: 43dda2ec4700a84903e5302f94e5fb613c400bd8c14eecd32728da88cf5a1234ee10b83e526aa84f677d8daffb0d8be2acdf555aefaa976535b4023b0d03cc8a
|
@@ -0,0 +1,121 @@
|
|
1
|
+
require 'csv'
|
2
|
+
|
3
|
+
module AdWords
|
4
|
+
|
5
|
+
Location = Struct.new(:criteria_id, :name, :canonical_name, :parent_id, :country_code, :target_type, :status) do
|
6
|
+
|
7
|
+
def description
|
8
|
+
"#{canonical_name} (#{target_type})"
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.all
|
12
|
+
data.drop(1).map do |row|
|
13
|
+
AdWords::Location.new(row[0].to_i, row[1], row[2], row[3].to_i, row[4], row[5], row[6])
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def self.data
|
20
|
+
adwords_location_file = 'adwords_api_location_criteria_2014-05-21.csv'
|
21
|
+
@data ||= CSV.read(File.join(File.dirname(__FILE__), '..', 'data', adwords_location_file))
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
City2DMA = Struct.new(:city, :criteria_id, :state, :dma_region, :dma_region_code) do
|
27
|
+
|
28
|
+
def ==(other)
|
29
|
+
self.criteria_id == other.criteria_id && self.dma_region_code == other.dma_region_code
|
30
|
+
end
|
31
|
+
|
32
|
+
def description
|
33
|
+
"#{dma_region}, #{state}"
|
34
|
+
end
|
35
|
+
|
36
|
+
def self.all
|
37
|
+
data.drop(1).map do |row|
|
38
|
+
AdWords::City2DMA.new(row[0], row[1].to_i, row[2], row[3], row[4].to_i)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
private
|
43
|
+
|
44
|
+
def self.data
|
45
|
+
adwords_dma_file = 'adwords_api_cities_dma_regions_2014-05-21.csv'
|
46
|
+
@data ||= CSV.read(File.join(File.dirname(__FILE__), '..', 'data', adwords_dma_file))
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
|
51
|
+
class LocationDb
|
52
|
+
|
53
|
+
attr_reader :location_records, :location_records_by_name, :city_to_dma_records
|
54
|
+
|
55
|
+
def initialize
|
56
|
+
@location_records = {}
|
57
|
+
@location_records_by_name = {}
|
58
|
+
records = Location.all
|
59
|
+
records.each do |r|
|
60
|
+
@location_records[r.criteria_id] = r
|
61
|
+
@location_records_by_name[r.name] = r
|
62
|
+
end
|
63
|
+
@location_records.freeze
|
64
|
+
@location_records_by_name.freeze
|
65
|
+
|
66
|
+
@city_to_dma_records = {}
|
67
|
+
cities = City2DMA.all
|
68
|
+
cities.each do |r|
|
69
|
+
@city_to_dma_records[r.criteria_id] ||= []
|
70
|
+
@city_to_dma_records[r.criteria_id] << r unless @city_to_dma_records[r.criteria_id].include? r
|
71
|
+
end
|
72
|
+
@city_to_dma_records.freeze
|
73
|
+
end
|
74
|
+
|
75
|
+
def criteria_ids
|
76
|
+
@location_records.keys
|
77
|
+
end
|
78
|
+
|
79
|
+
def find(criteria_id)
|
80
|
+
@location_records[criteria_id.to_i]
|
81
|
+
end
|
82
|
+
|
83
|
+
def find_by_name(name)
|
84
|
+
@location_records_by_name[name]
|
85
|
+
end
|
86
|
+
|
87
|
+
def path(criteria_id)
|
88
|
+
path = []
|
89
|
+
location = find criteria_id
|
90
|
+
while location do
|
91
|
+
path << location.criteria_id
|
92
|
+
location = find location.parent_id
|
93
|
+
end
|
94
|
+
path
|
95
|
+
end
|
96
|
+
|
97
|
+
def city_dmas(criteria_id)
|
98
|
+
@city_to_dma_records[criteria_id.to_i]
|
99
|
+
end
|
100
|
+
|
101
|
+
def lookup_table
|
102
|
+
ltable = {}
|
103
|
+
criteria_ids.map do |id|
|
104
|
+
path = path(id)
|
105
|
+
city_dmas = (city_dmas(id) || [])
|
106
|
+
dma_criteria_ids = city_dmas.map { |dma| find_by_name(dma.dma_region)[:criteria_id]}
|
107
|
+
ltable[id] = path + dma_criteria_ids
|
108
|
+
end
|
109
|
+
ltable
|
110
|
+
end
|
111
|
+
|
112
|
+
def output_lookup_table
|
113
|
+
lookup_table.each do |id, values|
|
114
|
+
puts values.join(',')
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
end
|
119
|
+
|
120
|
+
end
|
121
|
+
|
@@ -0,0 +1 @@
|
|
1
|
+
require_relative 'adwords_location/location'
|