Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

28 response times #169

Open
wants to merge 16 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
35 changes: 35 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1 +1,36 @@
coverage
capybara*.html
\# Compiled source #
###################
*.com
*.class
*.dll
*.exe
*.o
*.so
# Packages #
############
# it's better to unpack these files and commit the raw source
# git has its own built in compression methods
*.7z
*.dmg
*.gz
*.iso
*.jar
*.rar
*.tar
*.zip
# Logs and databases #
######################
*.log
*.sql
*.sqlite
# OS generated files #
######################
.DS_Store
.DS_Store?
._*
.Spotlight-V100
.Trashes
ehthumbs.db
Thumbs.db
7 changes: 7 additions & 0 deletions Gemfile
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ gem 'sinatra', require: 'sinatra/base'
gem 'pg'
gem 'activerecord'
gem 'sinatra-activerecord'
gem 'useragent'

group :development, :test do
gem 'shotgun'
Expand All @@ -12,4 +13,10 @@ group :development, :test do
gem 'capybara'
gem 'launchy'
gem 'rack-test'
gem 'pry'
gem 'database_cleaner'
gem 'simplecov'
gem 'cane'
gem 'reek'
gem 'rake'
end
97 changes: 74 additions & 23 deletions Gemfile.lock
Original file line number Diff line number Diff line change
@@ -1,47 +1,79 @@
GEM
remote: https://rubygems.org/
specs:
activemodel (4.2.5.1)
activesupport (= 4.2.5.1)
builder (~> 3.1)
activerecord (4.2.5.1)
activemodel (= 4.2.5.1)
activesupport (= 4.2.5.1)
arel (~> 6.0)
activesupport (4.2.5.1)
activemodel (5.0.0)
activesupport (= 5.0.0)
activerecord (5.0.0)
activemodel (= 5.0.0)
activesupport (= 5.0.0)
arel (~> 7.0)
activesupport (5.0.0)
concurrent-ruby (~> 1.0, >= 1.0.2)
i18n (~> 0.7)
json (~> 1.7, >= 1.7.7)
minitest (~> 5.1)
thread_safe (~> 0.3, >= 0.3.4)
tzinfo (~> 1.1)
addressable (2.4.0)
arel (6.0.3)
arel (7.0.0)
ast (2.3.0)
axiom-types (0.1.1)
descendants_tracker (~> 0.0.4)
ice_nine (~> 0.11.0)
thread_safe (~> 0.3, >= 0.3.1)
bond (0.5.1)
builder (3.2.2)
capybara (2.6.2)
cane (3.0.0)
parallel
capybara (2.7.1)
addressable
mime-types (>= 1.16)
nokogiri (>= 1.3.3)
rack (>= 1.0.0)
rack-test (>= 0.5.4)
xpath (~> 2.0)
codeclimate-engine-rb (0.3.1)
virtus (~> 1.0)
coderay (1.1.1)
coercible (1.0.0)
descendants_tracker (~> 0.0.1)
concurrent-ruby (1.0.2)
database_cleaner (1.5.3)
descendants_tracker (0.0.4)
thread_safe (~> 0.3, >= 0.3.1)
docile (1.1.5)
equalizer (0.0.11)
i18n (0.7.0)
json (1.8.3)
ice_nine (0.11.2)
json (2.0.1)
launchy (2.4.3)
addressable (~> 2.3)
mime-types (3.0)
method_source (0.8.2)
mime-types (3.1)
mime-types-data (~> 3.2015)
mime-types-data (3.2015.1120)
mini_portile2 (2.0.0)
minitest (5.8.4)
nokogiri (1.6.7.2)
mini_portile2 (~> 2.0.0.rc2)
mime-types-data (3.2016.0521)
mini_portile2 (2.1.0)
minitest (5.9.0)
nokogiri (1.6.8)
mini_portile2 (~> 2.1.0)
pkg-config (~> 1.1.7)
parallel (1.9.0)
parser (2.3.1.2)
ast (~> 2.2)
pg (0.18.4)
pkg-config (1.1.7)
pry (0.10.3)
coderay (~> 1.1.0)
method_source (~> 0.8.1)
slop (~> 3.4)
rack (1.6.4)
rack-protection (1.5.3)
rack
rack-test (0.6.3)
rack (>= 1.0)
rainbow (2.1.0)
rake (11.2.2)
reek (4.1.1)
codeclimate-engine-rb (~> 0.3.1)
parser (~> 2.3.1, >= 2.3.1.2)
rainbow (~> 2.0)
ripl (0.7.1)
bond (~> 0.5.1)
ripl-multi_line (0.3.1)
Expand All @@ -52,22 +84,34 @@ GEM
ripl (>= 0.7.0)
shotgun (0.9.1)
rack (>= 1.0)
simplecov (0.12.0)
docile (~> 1.1.0)
json (>= 1.8, < 3)
simplecov-html (~> 0.10.0)
simplecov-html (0.10.0)
sinatra (1.4.7)
rack (~> 1.5)
rack-protection (~> 1.4)
tilt (>= 1.3, < 3)
sinatra-activerecord (2.0.9)
sinatra-activerecord (2.0.10)
activerecord (>= 3.2)
sinatra (~> 1.0)
slop (3.6.0)
thread_safe (0.3.5)
tilt (2.0.2)
tilt (2.0.5)
tux (0.3.0)
ripl (>= 0.3.5)
ripl-multi_line (>= 0.2.4)
ripl-rack (>= 0.2.0)
sinatra (>= 1.2.1)
tzinfo (1.2.2)
thread_safe (~> 0.1)
useragent (0.16.7)
virtus (1.0.5)
axiom-types (~> 0.1)
coercible (~> 1.0)
descendants_tracker (~> 0.0, >= 0.0.3)
equalizer (~> 0.0, >= 0.0.9)
xpath (2.0.0)
nokogiri (~> 1.3)

Expand All @@ -76,15 +120,22 @@ PLATFORMS

DEPENDENCIES
activerecord
cane
capybara
database_cleaner
launchy
minitest
pg
pry
rack-test
rake
reek
shotgun
simplecov
sinatra
sinatra-activerecord
tux
useragent

BUNDLED WITH
1.11.2
1.12.3
8 changes: 8 additions & 0 deletions Rakefile
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,15 @@ require "bundler"
Bundler.require

require "sinatra/activerecord/rake"
require "rake/testtask"

Rake::TestTask.new do |t|
t.libs << "test"
t.test_files = FileList['test/*/*.rb']
t.verbose = false
t.warning = false
end
task default: :test #<------ important
namespace :sanitation do
desc "Check line lengths & whitespace with Cane"
task :lines do
Expand Down
5 changes: 5 additions & 0 deletions app/models/ip.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
class Ip < ActiveRecord::Base
validates :address, presence: true

has_many :payload_requests
end
25 changes: 25 additions & 0 deletions app/models/parser.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
require 'pry'

class Parser

def self.parse_json(json)
JSON.parse(json)
end

def self.parse_payload(payload)
parsed_json = parse_json(payload)
{"url" => parsed_json["url"],
"requestedAt" => parsed_json["requestedAt"],
"respondedIn" => parsed_json["respondedIn"],
"referredBy" => parsed_json["referredBy"],
"requestType" => parsed_json["requestType"],
"software_agent" => parse_user_agent(parsed_json["userAgent"]),
"resolutionWidth" => parsed_json["resolutionWidth"],
"resolutionHeight" => parsed_json["resolutionHeight"],
"ip" => parsed_json["ip"]}
end

def self.parse_user_agent(user_agent)
UserAgent.parse(user_agent)
end
end
40 changes: 40 additions & 0 deletions app/models/payload_request.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
class PayloadRequest < ActiveRecord::Base

validates :url_id, presence: true
validates :requested_at, presence: true
validates :responded_in, presence: true
validates :referred_by_id, presence: true
validates :request_type_id, presence: true
validates :software_agent_id, presence: true
validates :ip_id, presence: true
validates :resolution_id, presence: true

belongs_to :url
belongs_to :referrer
belongs_to :request_type
belongs_to :software_agent
belongs_to :resolution
belongs_to :ip

def referrer
Referrer.find(self.referred_by_id)
end

def self.find_max_response_by_url(url)
id = Url.find_by_address(url).id
payloads = PayloadRequest.where(url_id: id)
responses = payloads.map do |payload|
payload.responded_in
end
responses.max
end

def self.find_min_response_by_url(url)
id = Url.find_by_address(url).id
payloads = PayloadRequest.where(url_id: id)
responses = payloads.map do |payload|
payload.responded_in
end
responses.min
end
end
5 changes: 5 additions & 0 deletions app/models/referrer.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
class Referrer < ActiveRecord::Base
validates :address, presence: true

has_many :payload_requests
end
11 changes: 11 additions & 0 deletions app/models/request_type.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
class RequestType < ActiveRecord::Base
validates :verb, presence: true

has_many :payload_requests

def self.most_frequent_type
values = RequestType.pluck(:verb)
values.group_by(&:itself).values.max_by(&:size).first
end

end
12 changes: 12 additions & 0 deletions app/models/resolution.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
class Resolution< ActiveRecord::Base
validates :height, presence: true
validates :width, presence:true

has_many :payload_requests

def self.all_screen_resolutions_across_all_requests
res = Resolution.pluck(:width, :height)
res.map { |r| r.join(" x ") }.join(", ")
end

end
22 changes: 22 additions & 0 deletions app/models/software_agent.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
class SoftwareAgent < ActiveRecord::Base

validates :os, presence:true
validates :browser, presence:true

has_many :payload_requests

def self.web_browser_breakdown
user_agent_id = PayloadRequest.distinct.pluck(:software_agent_id)
user_agent_id.map do |id|
SoftwareAgent.find(id).browser
end
end

def self.web_platform_breakdown
software_agent_id = PayloadRequest.distinct.pluck(:software_agent_id)
software_agent_id.map do |id|
SoftwareAgent.find(id).os
end
end

end
11 changes: 11 additions & 0 deletions app/models/url.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
class Url < ActiveRecord::Base
validates :address, presence:true

has_many :payload_requests

def self.urls_from_most_to_least_requested
urls = Url.pluck(:address)
frequency = urls.inject(Hash.new(0)) { |hash , value | hash[value] += 1; hash }
urls.max_by { |value| frequency[value] }
end
end
15 changes: 15 additions & 0 deletions db/migrate/20160706213537_create_payload_requests.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
class CreatePayloadRequests < ActiveRecord::Migration
def change
create_table :payload_requests do |t|
t.integer :url_id
t.datetime :requested_at
t.integer :responded_in
t.string :referred_by
t.string :request_type
t.string :user_agent
t.string :resolution_width
t.string :resolution_height
t.string :ip
end
end
end
7 changes: 7 additions & 0 deletions db/migrate/20160706214336_create_urls.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
class CreateUrls < ActiveRecord::Migration
def change
create_table :urls do |t|
t.string :address
end
end
end