pagespeed 0.0.1 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.rspec +2 -0
- data/Gemfile +4 -0
- data/README.md +36 -31
- data/Rakefile +9 -0
- data/lib/pagespeed/cli.rb +28 -24
- data/lib/pagespeed/parser.rb +14 -13
- data/lib/pagespeed/request.rb +14 -13
- data/lib/pagespeed/version.rb +1 -1
- data/spec/pagespeed/cli_spec.rb +37 -0
- data/spec/spec_helper.rb +17 -0
- metadata +29 -47
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: d7ab645c3e17ee15826119bd35b8d4fd47049b96
|
4
|
+
data.tar.gz: 5b7892fc13b1a78e24dcf3cd98643ed39fd1f9d4
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 80eefaf2ff3eea612a6e7c11ad327ed1f5531b18e59a7aa769e50da78ac12575990f6f2a23bcfc091b27880349a19aae733971753fdef62e43e5e02c57a4d33c
|
7
|
+
data.tar.gz: bf5eec7059b177e0a297e378b1bc423ebbe79c95891fa2868691c71107a14a709afc971ef36ac7a7d0efc068125795342f61af14ef72f4c4a86d23f980bb74a2
|
data/.rspec
ADDED
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,34 +1,39 @@
|
|
1
|
-
|
1
|
+
A Ruby library for the Google PageSpeed API.
|
2
2
|
|
3
3
|
## Usage
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
5
|
+
### Command Line
|
6
|
+
|
7
|
+
```bash
|
8
|
+
$ pagespeed add-key YOUR_API_KEY
|
9
|
+
$ pagespeed -u blahed.com
|
10
|
+
- Avoid landing page redirects
|
11
|
+
- Enable compression
|
12
|
+
- Leverage browser caching
|
13
|
+
- Reduce server response time
|
14
|
+
- Minify CSS
|
15
|
+
- Minify HTML
|
16
|
+
- Minify JavaScript
|
17
|
+
- Eliminate render-blocking JavaScript and CSS in above-the-fold content
|
18
|
+
- Optimize images
|
19
|
+
- Prioritize visible content
|
20
|
+
|
21
|
+
Total Score: 87/100 (desktop)
|
22
|
+
```
|
23
|
+
|
24
|
+
### Ruby API
|
25
|
+
|
26
|
+
```ruby
|
27
|
+
require 'pagespeed'
|
28
|
+
|
29
|
+
request = PageSpeed::Request.new("google.com", 'YOUR_API_KEY', 'desktop')
|
30
|
+
request.pagespeed
|
31
|
+
```
|
32
|
+
|
33
|
+
## Contributers
|
34
|
+
|
35
|
+
- [blahed][1]
|
36
|
+
- [danriti][2]
|
37
|
+
|
38
|
+
[1]: https://github.com/blahed
|
39
|
+
[2]: https://github.com/danriti
|
data/Rakefile
CHANGED
data/lib/pagespeed/cli.rb
CHANGED
@@ -2,27 +2,30 @@ require 'optparse'
|
|
2
2
|
|
3
3
|
module PageSpeed
|
4
4
|
class CLI
|
5
|
-
|
5
|
+
|
6
6
|
class << self
|
7
7
|
KEY_PATH = File.join(ENV['HOME'], '.pagespeed_api_key')
|
8
|
-
|
9
|
-
Usage:
|
10
|
-
pagespeed google.com
|
11
|
-
|
12
|
-
Description:
|
13
|
-
pagespeed pulls in results for a given website from the google pagespeed api
|
14
|
-
|
15
|
-
USAGE
|
16
|
-
|
8
|
+
|
17
9
|
# parse and set the options
|
18
|
-
def set_options
|
10
|
+
def set_options(args)
|
11
|
+
# set default options
|
12
|
+
options = {}
|
13
|
+
options['strategy'] = 'desktop'
|
14
|
+
|
19
15
|
@opts = OptionParser.new do |opts|
|
20
|
-
opts.banner =
|
16
|
+
opts.banner = "Usage: pagespeed [url] [options]"
|
21
17
|
|
22
18
|
opts.separator ''
|
23
19
|
|
20
|
+
opts.on( '-s', '--strategy [STRATEGY]', 'The strategy to use when analyzing the page. Valid values are \'desktop\' and \'mobile\'.') do |s|
|
21
|
+
if s == nil
|
22
|
+
print_usage_and_exit!
|
23
|
+
end
|
24
|
+
options['strategy'] = s
|
25
|
+
end
|
26
|
+
|
24
27
|
opts.on('-v', '--version', 'Show the pagespeed version and exit') do
|
25
|
-
puts "
|
28
|
+
puts "pagespeed v#{PageSpeed::VERSION}"
|
26
29
|
exit
|
27
30
|
end
|
28
31
|
|
@@ -30,17 +33,19 @@ module PageSpeed
|
|
30
33
|
puts opts
|
31
34
|
exit
|
32
35
|
end
|
36
|
+
|
33
37
|
end
|
34
38
|
|
35
|
-
@opts.parse!
|
39
|
+
@opts.parse!(args)
|
40
|
+
options
|
36
41
|
end
|
37
|
-
|
42
|
+
|
38
43
|
# print out the options banner and exit
|
39
44
|
def print_usage_and_exit!
|
40
45
|
puts @opts
|
41
46
|
exit
|
42
47
|
end
|
43
|
-
|
48
|
+
|
44
49
|
# get the api key from ~/.pagespeed_api_key
|
45
50
|
# if we can't find it, show a user how to get one
|
46
51
|
def get_api_key
|
@@ -58,28 +63,27 @@ module PageSpeed
|
|
58
63
|
exit
|
59
64
|
end
|
60
65
|
end
|
61
|
-
|
66
|
+
|
62
67
|
# save the api key at ~/.pagespeed_api_key
|
63
68
|
def save_api_key(key)
|
64
69
|
File.open(KEY_PATH, 'w') { |f| f.write(key) }
|
65
70
|
end
|
66
|
-
|
71
|
+
|
67
72
|
# parse the options and make the pagespeed request
|
68
73
|
def run!(argv)
|
69
|
-
set_options
|
70
|
-
|
74
|
+
opts = set_options(argv)
|
75
|
+
|
71
76
|
if argv.size == 1
|
72
77
|
api_key = get_api_key
|
73
|
-
request = PageSpeed::Request.new(argv[0], api_key)
|
78
|
+
request = PageSpeed::Request.new(argv[0], api_key, opts['strategy'])
|
74
79
|
request.pagespeed
|
75
80
|
elsif argv.size == 2 && argv[0] == 'add-key'
|
76
81
|
save_api_key(argv[1])
|
77
82
|
else
|
78
83
|
print_usage_and_exit!
|
79
84
|
end
|
80
|
-
|
81
85
|
end
|
82
|
-
|
83
|
-
end
|
86
|
+
|
87
|
+
end
|
84
88
|
end
|
85
89
|
end
|
data/lib/pagespeed/parser.rb
CHANGED
@@ -3,38 +3,39 @@ require 'json'
|
|
3
3
|
module PageSpeed
|
4
4
|
class Parser
|
5
5
|
class << self
|
6
|
-
|
6
|
+
|
7
7
|
# parse the response and print it real pretty
|
8
8
|
def parse(result)
|
9
9
|
result = JSON.parse(result)
|
10
10
|
code = result['responseCode']
|
11
11
|
total_score = result['score']
|
12
|
-
|
12
|
+
strategy = result['request']['strategy']
|
13
|
+
|
13
14
|
fail(code, result['title']) unless code == 200
|
14
|
-
|
15
|
+
|
15
16
|
result['formattedResults']['ruleResults'].each do |name, rule|
|
16
17
|
score = rule['ruleScore']
|
17
18
|
colorize(score)
|
18
19
|
puts " #{pad_score(score)} - #{rule['localizedRuleName']}"
|
19
20
|
end
|
20
|
-
|
21
|
+
|
21
22
|
colorize(total_score)
|
22
|
-
puts " \nTotal Score: #{total_score}"
|
23
|
+
puts " \nTotal Score: #{total_score}/100 (#{strategy})"
|
23
24
|
decolorize
|
24
25
|
end
|
25
|
-
|
26
|
+
|
26
27
|
private
|
27
|
-
|
28
|
+
|
28
29
|
# fail with the appropriate code/message
|
29
30
|
def fail(code, title)
|
30
31
|
puts "\033[31m#{title}\033[0m"
|
31
32
|
exit
|
32
33
|
end
|
33
|
-
|
34
|
+
|
34
35
|
# pad the score to make it extra readable
|
35
36
|
def pad_score(score)
|
36
37
|
score = score.to_s
|
37
|
-
|
38
|
+
|
38
39
|
case score.length
|
39
40
|
when 3
|
40
41
|
score
|
@@ -44,7 +45,7 @@ module PageSpeed
|
|
44
45
|
' ' + score
|
45
46
|
end
|
46
47
|
end
|
47
|
-
|
48
|
+
|
48
49
|
# colorize the good the bad and the ugly
|
49
50
|
def colorize(score)
|
50
51
|
case score.to_i
|
@@ -56,12 +57,12 @@ module PageSpeed
|
|
56
57
|
print "\033[31m"
|
57
58
|
end
|
58
59
|
end
|
59
|
-
|
60
|
+
|
60
61
|
# reset colors
|
61
62
|
def decolorize
|
62
63
|
print "\033[0m"
|
63
64
|
end
|
64
|
-
|
65
|
+
|
65
66
|
end
|
66
67
|
end
|
67
|
-
end
|
68
|
+
end
|
data/lib/pagespeed/request.rb
CHANGED
@@ -4,48 +4,49 @@ require 'uri'
|
|
4
4
|
module PageSpeed
|
5
5
|
class Request
|
6
6
|
PAGESPEED_API_URL = 'https://www.googleapis.com/pagespeedonline/v1/runPagespeed'
|
7
|
-
|
7
|
+
|
8
8
|
attr_accessor :url, :api_key
|
9
|
-
|
10
|
-
def initialize(url, api_key)
|
9
|
+
|
10
|
+
def initialize(url, api_key, strategy)
|
11
11
|
@url = url =~ /^https?:\/\// ? url : ('http://' + url )
|
12
12
|
@api_key = api_key
|
13
|
+
@strategy = strategy
|
13
14
|
@uri = build_request_uri
|
14
15
|
end
|
15
|
-
|
16
|
+
|
16
17
|
def pagespeed
|
17
18
|
http = Net::HTTP.new(@uri.host, @uri.port)
|
18
19
|
http.use_ssl = true
|
19
20
|
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
20
|
-
|
21
|
+
|
21
22
|
request = Net::HTTP::Get.new(@uri.request_uri)
|
22
23
|
response = http.request(request)
|
23
|
-
|
24
|
+
|
24
25
|
if response.code.to_i == 200
|
25
26
|
PageSpeed::Parser.parse(response.body)
|
26
27
|
else
|
27
28
|
status_error(response)
|
28
29
|
end
|
29
|
-
|
30
|
+
|
30
31
|
rescue Exception => e
|
31
32
|
puts e.message
|
32
33
|
puts e.backtrace.join("\n")
|
33
34
|
puts "\033[31mUh oh, didn't work. Maybe the host is down or the url is wrong... or perhaps google is down :("
|
34
35
|
exit
|
35
36
|
end
|
36
|
-
|
37
|
+
|
37
38
|
def status_error(response)
|
38
39
|
puts "#{response.code}"
|
39
40
|
exit
|
40
41
|
end
|
41
|
-
|
42
|
+
|
42
43
|
private
|
43
|
-
|
44
|
+
|
44
45
|
def build_request_uri
|
45
46
|
uri = URI.parse(PAGESPEED_API_URL)
|
46
|
-
uri.query = "url=#{@url}&key=#{@api_key}"
|
47
|
+
uri.query = "url=#{@url}&strategy=#{@strategy}&key=#{@api_key}"
|
47
48
|
uri
|
48
49
|
end
|
49
|
-
|
50
|
+
|
50
51
|
end
|
51
|
-
end
|
52
|
+
end
|
data/lib/pagespeed/version.rb
CHANGED
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'pagespeed'
|
2
|
+
|
3
|
+
describe PageSpeed::CLI do
|
4
|
+
subject(:cli) { described_class }
|
5
|
+
|
6
|
+
before do
|
7
|
+
IO.any_instance.stub(:puts) # globally
|
8
|
+
end
|
9
|
+
|
10
|
+
it "has no parameters" do
|
11
|
+
actual = cli.set_options([])
|
12
|
+
expect(actual).to eq({"strategy" => "desktop"})
|
13
|
+
end
|
14
|
+
|
15
|
+
it "has help parameter" do
|
16
|
+
lambda { cli.set_options(["-h"]) }.should raise_error SystemExit
|
17
|
+
end
|
18
|
+
|
19
|
+
it "has version parameter" do
|
20
|
+
lambda { cli.set_options(["-v"]) }.should raise_error SystemExit
|
21
|
+
end
|
22
|
+
|
23
|
+
it "has incomplete strategy parameter" do
|
24
|
+
lambda { cli.set_options(["-s"]) }.should raise_error SystemExit
|
25
|
+
end
|
26
|
+
|
27
|
+
it "has complete strategy parameter" do
|
28
|
+
actual = cli.set_options(["-s", "mobile"])
|
29
|
+
expect(actual).to eq({"strategy" => "mobile"})
|
30
|
+
end
|
31
|
+
|
32
|
+
it "has positional url argument" do
|
33
|
+
actual = cli.set_options(["google.com"])
|
34
|
+
expect(actual).to eq({"strategy" => "desktop"})
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
# This file was generated by the `rspec --init` command. Conventionally, all
|
2
|
+
# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
|
3
|
+
# Require this file using `require "spec_helper"` to ensure that it is only
|
4
|
+
# loaded once.
|
5
|
+
#
|
6
|
+
# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
|
7
|
+
RSpec.configure do |config|
|
8
|
+
config.treat_symbols_as_metadata_keys_with_true_values = true
|
9
|
+
config.run_all_when_everything_filtered = true
|
10
|
+
config.filter_run :focus
|
11
|
+
|
12
|
+
# Run specs in random order to surface order dependencies. If you find an
|
13
|
+
# order dependency and want to debug it, you can fix the order by providing
|
14
|
+
# the seed, which is printed after each run.
|
15
|
+
# --seed 1234
|
16
|
+
config.order = 'random'
|
17
|
+
end
|
metadata
CHANGED
@@ -1,35 +1,25 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: pagespeed
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
prerelease:
|
6
|
-
segments:
|
7
|
-
- 0
|
8
|
-
- 0
|
9
|
-
- 1
|
10
|
-
version: 0.0.1
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
11
5
|
platform: ruby
|
12
|
-
authors:
|
6
|
+
authors:
|
13
7
|
- blahed
|
14
8
|
autorequire:
|
15
9
|
bindir: bin
|
16
10
|
cert_chain: []
|
17
|
-
|
18
|
-
date: 2011-07-28 00:00:00 -04:00
|
19
|
-
default_executable:
|
11
|
+
date: 2014-03-14 00:00:00.000000000 Z
|
20
12
|
dependencies: []
|
21
|
-
|
22
|
-
|
23
|
-
email:
|
13
|
+
description: ''
|
14
|
+
email:
|
24
15
|
- tdunn13@gmail.com
|
25
|
-
executables:
|
16
|
+
executables:
|
26
17
|
- pagespeed
|
27
18
|
extensions: []
|
28
|
-
|
29
19
|
extra_rdoc_files: []
|
30
|
-
|
31
|
-
|
32
|
-
- .
|
20
|
+
files:
|
21
|
+
- ".gitignore"
|
22
|
+
- ".rspec"
|
33
23
|
- Gemfile
|
34
24
|
- LICENSE
|
35
25
|
- README.md
|
@@ -41,39 +31,31 @@ files:
|
|
41
31
|
- lib/pagespeed/request.rb
|
42
32
|
- lib/pagespeed/version.rb
|
43
33
|
- pagespeed.gemspec
|
44
|
-
|
45
|
-
|
34
|
+
- spec/pagespeed/cli_spec.rb
|
35
|
+
- spec/spec_helper.rb
|
36
|
+
homepage: ''
|
46
37
|
licenses: []
|
47
|
-
|
38
|
+
metadata: {}
|
48
39
|
post_install_message:
|
49
40
|
rdoc_options: []
|
50
|
-
|
51
|
-
require_paths:
|
41
|
+
require_paths:
|
52
42
|
- lib
|
53
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
54
|
-
|
55
|
-
requirements:
|
43
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
56
45
|
- - ">="
|
57
|
-
- !ruby/object:Gem::Version
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
version: "0"
|
62
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
63
|
-
none: false
|
64
|
-
requirements:
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
49
|
+
requirements:
|
65
50
|
- - ">="
|
66
|
-
- !ruby/object:Gem::Version
|
67
|
-
|
68
|
-
segments:
|
69
|
-
- 0
|
70
|
-
version: "0"
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: '0'
|
71
53
|
requirements: []
|
72
|
-
|
73
54
|
rubyforge_project: pagespeed
|
74
|
-
rubygems_version:
|
55
|
+
rubygems_version: 2.2.0
|
75
56
|
signing_key:
|
76
|
-
specification_version:
|
57
|
+
specification_version: 4
|
77
58
|
summary: Pulls google pagespeed results for a given site
|
78
|
-
test_files:
|
79
|
-
|
59
|
+
test_files:
|
60
|
+
- spec/pagespeed/cli_spec.rb
|
61
|
+
- spec/spec_helper.rb
|