pricecharts

track prices of consumer electronics
Log | Files | Refs | README

commit 48635a970953acdd77cfec23548a1eaaa689533f
parent 6fda03d4780b2cbaa5eaa634d036810fac876f8b
Author: Kyle Milz <kyle@getaddrinfo.net>
Date:   Sat, 21 Mar 2015 15:08:41 -0600

all: use the word retailer instead of vendor

Diffstat:
MPriceChart.pm | 4++--
Mgen_static | 10+++++-----
Mgen_svg | 16++++++++--------
Mprice_scraper | 30+++++++++++++++---------------
Mtt/index.tt | 2+-
Mtt/wrapper.tt | 2+-
6 files changed, 32 insertions(+), 32 deletions(-)

diff --git a/PriceChart.pm b/PriceChart.pm @@ -10,7 +10,7 @@ use Exporter; sub get_config { my $parser = Config::Grammar->new({ - _sections => ["general", "http", "vendors"], + _sections => ["general", "http", "retailers"], general => { _vars => [ 'user_agent', @@ -29,7 +29,7 @@ sub get_config "logs", ], }, - vendors => { + retailers => { _sections => ["/[A-Za-z ]+/"], "/[A-Za-z ]+/" => { _vars => [ diff --git a/gen_static b/gen_static @@ -38,10 +38,10 @@ my $manufacturers_sql = "select distinct manufacturer from products"; my $parts_sql = "select part_num, lower(manufacturer), description from products where manufacturer = ?"; my $m = gen_link_page($manufacturers_sql, $parts_sql, "manufacturers", "Manufacturers"); -# vendors.html, vendors/* -my $vendor_sql = "select distinct vendor from prices"; +# retailers.html, retailers/* +my $retailers_sql = "select distinct vendor from prices"; $parts_sql = "select distinct part_num from prices where vendor = ?"; -my $v = gen_link_page($vendor_sql, $parts_sql, "vendors", "Retailers"); +my $v = gen_link_page($retailers_sql, $parts_sql, "retailers", "Retailers"); # products.html, products/* my $product_sql = "select part_num from products"; @@ -56,7 +56,7 @@ my $new_products = $dbh->selectall_arrayref($sql); # index.html my $n = @$new_products; my $vars = { - num_vendors => $v, + num_retailers => $v, num_manufacturers => $m, num_products => $p, num_new => $n, @@ -65,7 +65,7 @@ my $vars = { $template->process("index.tt", $vars, "index.html") || die "template: " . $template->error() . "\n"; -print "info: $m manufacturers, $p products ($n new), $v vendors\n" if ($args{v}); +print "info: $m manufacturers, $p products ($n new), $v retailers\n" if ($args{v}); $dbh->disconnect(); # generate a page of links to pages of products diff --git a/gen_svg b/gen_svg @@ -36,7 +36,7 @@ my $sql = "select date, price, color from prices where " . my $point_sth = $dbh->prepare($sql); $sql = "select distinct vendor from prices where part_num = ?"; -my $vendor_sth = $dbh->prepare($sql); +my $retailer_sth = $dbh->prepare($sql); $sql = "select manufacturer, part_num, description from products"; my $parts_sth = $dbh->prepare($sql); @@ -64,14 +64,14 @@ while (my ($brand, $part_num, $description) = $parts_sth->fetchrow_array()) { my $svg = SVG->new(viewBox => "0 0 $total_width $total_height"); my ($x_scale, $y_scale) = ($width / $domain, $height / $range); - # render each vendor as a different series - $vendor_sth->execute($part_num); - while (my ($vendor) = $vendor_sth->fetchrow_array()) { + # render each retailer as a different series + $retailer_sth->execute($part_num); + while (my ($retailer) = $retailer_sth->fetchrow_array()) { my (@xs, @ys); my $line_color = "#000"; # gather all points in the series - $point_sth->execute($part_num, $vendor); + $point_sth->execute($part_num, $retailer); while (my ($date, $price, $color) = $point_sth->fetchrow_array) { # transform and clamp real world coordinates push @xs, ($date - $x_min) * $x_scale + $left; @@ -79,7 +79,7 @@ while (my ($brand, $part_num, $description) = $parts_sth->fetchrow_array()) { # small filled in circles to indicate data points my $tag = $svg->anchor( - -href => $cfg->{vendors}{$vendor}{search_url} . $part_num, + -href => $cfg->{retailers}{$retailer}{search_url} . $part_num, target => "new_window" )->circle( cx => $xs[-1], cy => $ys[-1], @@ -99,11 +99,11 @@ while (my ($brand, $part_num, $description) = $parts_sth->fetchrow_array()) { # polyline sucks, spline would look nicer my $tag = $svg->anchor( - -href => $cfg->{vendors}{$vendor}{search_url} . $part_num, + -href => $cfg->{retailers}{$retailer}{search_url} . $part_num, target => "new_window" ); $tag->polyline( - %$points, id => $vendor, + %$points, id => $retailer, style => { "fill-opacity" => 0, fill => "#$line_color", stroke => "#$line_color", "stroke-width" => 2, diff --git a/price_scraper b/price_scraper @@ -66,8 +66,8 @@ my $products_sth = $dbh->prepare($sql); my $timestamp = strftime("%F %T> ", localtime); my ($start, @status, $i) = (time, "", -1); -for my $vendor (sort keys %{$cfg->{"vendors"}}) { - my %props = %{$cfg->{"vendors"}{$vendor}}; +for my $retailer (sort keys %{$cfg->{retailers}}) { + my %props = %{$cfg->{retailers}{$retailer}}; # this could probably be done smarter my $url = $props{"search_url"}; my $color = $props{"color"}; @@ -75,7 +75,7 @@ for my $vendor (sort keys %{$cfg->{"vendors"}}) { my $sale_tag = $props{"price_sale"}; my $desc_tag = $props{"title"}; - my $vendor_start = time; + my $retailer_start = time; $status[++$i] = " "; # for products with short part numbers, also search manufacturer @@ -86,13 +86,13 @@ for my $vendor (sort keys %{$cfg->{"vendors"}}) { $search = uri_escape($part_num); } - # get a page of search results from a vendor + # get a page of search results from a retailer my $search_results = get_dom($url . $search, $ua, $args{v}, $log); next unless defined $search_results; # search search_results for particular html tags that should be prices - my $price_r = get_valid_price($price_tag, $search_results, $vendor); - my $price_s = get_valid_price($sale_tag, $search_results, $vendor); + my $price_r = get_valid_price($price_tag, $search_results, $retailer); + my $price_s = get_valid_price($sale_tag, $search_results, $retailer); next unless ($price_r || $price_s); # choose the lowest that exists @@ -108,20 +108,20 @@ for my $vendor (sort keys %{$cfg->{"vendors"}}) { $desc =~ s/^\s+//; $desc =~ s/\s+$//; if ($desc ne "" && $args{v}) { - my $desc_s = trunc_line($desc, length($vendor) + 8); - print "info: $vendor: $desc_s\n"; + my $desc_s = trunc_line($desc, length($retailer) + 8); + print "info: $retailer: $desc_s\n"; } } # everything looks good - $status[$i] = substr($vendor, 0, 1); + $status[$i] = substr($retailer, 0, 1); next if ($args{n}); - $prices_sth->execute($start, $part_num, $vendor, $color, - $price, time - $vendor_start, $desc); + $prices_sth->execute($start, $part_num, $retailer, $color, + $price, time - $retailer_start, $desc); $products_sth->execute($start, $part_num); - print "info: $vendor: db: inserted \$$price\n" if ($args{v}); + print "info: $retailer: db: inserted \$$price\n" if ($args{v}); } printf $log "%s %-10s %-20s [%s] (%i s)\n", $timestamp, $manufacturer, @@ -138,15 +138,15 @@ sub get_valid_price { my $dom_tag = shift || return undef; my $search_results = shift; - my $vendor = shift; + my $retailer = shift; # break the search_results page down into individual results my @search_prices = $search_results->find($dom_tag)->text_array(); my $num_prices = @search_prices; return undef if ($num_prices == 0); - print "info: $vendor: $dom_tag: $num_prices elements\n" if ($args{v}); - my $hdr = "$vendor: $dom_tag" . "[0]"; + print "info: $retailer: $dom_tag: $num_prices elements\n" if ($args{v}); + my $hdr = "$retailer: $dom_tag" . "[0]"; # do a fuzzy search for digit combinations that look like a price # XXX: uses the first found price in the page diff --git a/tt/index.tt b/tt/index.tt @@ -6,7 +6,7 @@ service for consumer electronics. Currently <b>[% num_products %]</b> products from <b>[% num_manufacturers %]</b> manufacturers are tracked across - <b>[% num_vendors %]</b> retailers.</p> + <b>[% num_retailers %]</b> retailers.</p> <p> To start, try searching for a product or manufacturer in the search box at the top right. </p> diff --git a/tt/wrapper.tt b/tt/wrapper.tt @@ -9,7 +9,7 @@ <body> <a id="title" href="/"><em>Price</em><b>Chart</b></a> <a href="/manufacturers.html">Manufacturers</a> - <a href="/vendors.html">Retailers</a> + <a href="/retailers.html">Retailers</a> <form method="get" action="/search.html"> <fieldset> <input type="text" name="q" />