fluoride-analyzer 0.0.1 → 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 +4 -4
- data/lib/fluoride-analyzer/parser.rb +4 -111
- data/lib/fluoride-analyzer/patterner.rb +110 -0
- data/lib/fluoride-analyzer/rails/railtie.rb +22 -3
- data/lib/fluoride-analyzer/tasklib.rb +67 -0
- data/spec/railtie_spec.rb +5 -10
- metadata +21 -18
- data/lib/fluoride-analyzer/tasks.rake +0 -46
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 346f52ff1fd2fb22d297f582892ed92065498073
|
4
|
+
data.tar.gz: 5a722a444c509742fa9af7cf4aae28f34e96fe99
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 43c36586731fa31f93d4ecab90333d0e22720fd679e63bdb653186d34fb05da860a5ccae7df3d72b479cc9896df445e02e5ff46703086f4de43961001187476c
|
7
|
+
data.tar.gz: 031192dc1b4b66d5bba7b6928c22dfd568049014a459208ab773c1dd14a0d9451af627b1d35ab3a0aa0c183a5ba3513de997076e019f55c45e89cdecf65d6df0
|
@@ -1,11 +1,13 @@
|
|
1
1
|
require 'fluoride-analyzer'
|
2
2
|
require 'rack'
|
3
3
|
require 'yaml'
|
4
|
+
require 'fluoride-analyzer/patterner'
|
5
|
+
|
4
6
|
#Also: Rails and ActionDispatch::Request
|
5
7
|
|
6
8
|
module Fluoride::Analyzer
|
7
9
|
class Parser
|
8
|
-
attr_accessor :files, :limit
|
10
|
+
attr_accessor :files, :limit
|
9
11
|
attr_reader :exceptions, :results, :counts
|
10
12
|
|
11
13
|
def initialize
|
@@ -19,7 +21,7 @@ module Fluoride::Analyzer
|
|
19
21
|
@results = Hash.new do|results, pattern| #PATH PATTERN
|
20
22
|
results[pattern] = Hash.new do |by_method, method| #METHOD
|
21
23
|
by_method[method] = Hash.new do |records, status| #STATUS CODE
|
22
|
-
|
24
|
+
records[status] = Hash.new do |record, key| #formatted record
|
23
25
|
record[key] = []
|
24
26
|
end
|
25
27
|
end
|
@@ -93,115 +95,6 @@ module Fluoride::Analyzer
|
|
93
95
|
{ 'post_params' => form_hash }
|
94
96
|
end
|
95
97
|
|
96
|
-
RoutePattern = Struct.new(:route, :matches, :params, :path_spec, :segment_keys)
|
97
|
-
|
98
|
-
class Patterner
|
99
|
-
def self.for(rails_routes)
|
100
|
-
if rails_routes.respond_to? :recognize_path
|
101
|
-
Rails4.new(rails_routes)
|
102
|
-
else
|
103
|
-
Rails3.new(rails_routes)
|
104
|
-
end
|
105
|
-
end
|
106
|
-
|
107
|
-
def base_env
|
108
|
-
@base_env ||= {
|
109
|
-
"HTTP_REFERER" => '',
|
110
|
-
"HTTP_COOKIE" => '',
|
111
|
-
"HTTP_AUTHORIZATION" => '',
|
112
|
-
"REQUEST_METHOD" => "GET",
|
113
|
-
'HTTP_HOST' => '',
|
114
|
-
'SERVER_NAME' => '',
|
115
|
-
'SERVER_ADDR' => '',
|
116
|
-
'SERVER_PORT' => '80',
|
117
|
-
"SCRIPT_NAME" => '',
|
118
|
-
"QUERY_STRING" => '',
|
119
|
-
'rack.input' => '' #body
|
120
|
-
}
|
121
|
-
end
|
122
|
-
|
123
|
-
def initialize(rails_routes)
|
124
|
-
@rails_routes = rails_routes
|
125
|
-
end
|
126
|
-
attr_reader :rails_routes
|
127
|
-
|
128
|
-
def build_request(result_env)
|
129
|
-
ActionDispatch::Request.new(base_env.merge(request_env))
|
130
|
-
end
|
131
|
-
|
132
|
-
def route_map
|
133
|
-
@route_map ||=
|
134
|
-
begin
|
135
|
-
ad_routes_array = rails_routes.routes
|
136
|
-
rack_routes_array = rails_routes.set.instance_eval{ @routes }
|
137
|
-
Hash[ rack_routes_array.zip(ad_routes_array) ]
|
138
|
-
end
|
139
|
-
end
|
140
|
-
|
141
|
-
def route_set
|
142
|
-
@route_set ||=
|
143
|
-
begin
|
144
|
-
set = rails_routes.set
|
145
|
-
set
|
146
|
-
end
|
147
|
-
end
|
148
|
-
|
149
|
-
class Rails3 < Patterner
|
150
|
-
def build(env)
|
151
|
-
req = build_request(env)
|
152
|
-
route, matches, params = route_set.recognize(req)
|
153
|
-
|
154
|
-
path_spec = :unrecognized
|
155
|
-
segment_keys = {}
|
156
|
-
|
157
|
-
if route_map.has_key?(route)
|
158
|
-
rails_route = route_map[route]
|
159
|
-
path_spec = rails_route.path
|
160
|
-
segment_keys = rails_route.segment_keys
|
161
|
-
end
|
162
|
-
|
163
|
-
RoutePattern.new(route, matches, params, path_spec, segment_keys)
|
164
|
-
end
|
165
|
-
end
|
166
|
-
|
167
|
-
class Rails4 < Patterner
|
168
|
-
def route_set
|
169
|
-
@route_set ||=
|
170
|
-
begin
|
171
|
-
set = Rails.application.routes.router
|
172
|
-
set
|
173
|
-
end
|
174
|
-
end
|
175
|
-
|
176
|
-
def build_request(request_env)
|
177
|
-
ActionDispatch::Request.new(base_env.merge(request_env))
|
178
|
-
end
|
179
|
-
|
180
|
-
def build(env)
|
181
|
-
req = build_request(env)
|
182
|
-
pattern = nil
|
183
|
-
route_set.recognize(req) do |route, matches, params|
|
184
|
-
rails_route = route_map[route]
|
185
|
-
|
186
|
-
path_spec = :unrecognized
|
187
|
-
segment_keys = {}
|
188
|
-
|
189
|
-
if route_map.has_key?(route)
|
190
|
-
rails_route = route_map[route]
|
191
|
-
path_spec = rails_route.path.spec.to_s
|
192
|
-
segment_keys = rails_route.segment_keys
|
193
|
-
end
|
194
|
-
|
195
|
-
pattern = RoutePattern.new(route, matches, params, path_spec, segment_keys)
|
196
|
-
end
|
197
|
-
if pattern.nil?
|
198
|
-
pattern = RoutePattern.new(nil,nil,nil,nil,nil)
|
199
|
-
end
|
200
|
-
pattern
|
201
|
-
end
|
202
|
-
end
|
203
|
-
end
|
204
|
-
|
205
98
|
def patterner
|
206
99
|
@patterner ||= Patterner.for(Rails.application.routes)
|
207
100
|
end
|
@@ -0,0 +1,110 @@
|
|
1
|
+
module Fluoride::Analyzer
|
2
|
+
RoutePattern = Struct.new(:route, :matches, :params, :path_spec, :segment_keys)
|
3
|
+
|
4
|
+
class Patterner
|
5
|
+
def self.for(rails_routes)
|
6
|
+
if rails_routes.respond_to? :recognize_path
|
7
|
+
Rails4.new(rails_routes)
|
8
|
+
else
|
9
|
+
Rails3.new(rails_routes)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def base_env
|
14
|
+
@base_env ||= {
|
15
|
+
"HTTP_REFERER" => '',
|
16
|
+
"HTTP_COOKIE" => '',
|
17
|
+
"HTTP_AUTHORIZATION" => '',
|
18
|
+
"REQUEST_METHOD" => "GET",
|
19
|
+
'HTTP_HOST' => '',
|
20
|
+
'SERVER_NAME' => '',
|
21
|
+
'SERVER_ADDR' => '',
|
22
|
+
'SERVER_PORT' => '80',
|
23
|
+
"SCRIPT_NAME" => '',
|
24
|
+
"QUERY_STRING" => '',
|
25
|
+
'rack.input' => '' #body
|
26
|
+
}
|
27
|
+
end
|
28
|
+
|
29
|
+
def initialize(rails_routes)
|
30
|
+
@rails_routes = rails_routes
|
31
|
+
end
|
32
|
+
attr_reader :rails_routes
|
33
|
+
|
34
|
+
def build_request(result_env)
|
35
|
+
ActionDispatch::Request.new(base_env.merge(request_env))
|
36
|
+
end
|
37
|
+
|
38
|
+
def route_map
|
39
|
+
@route_map ||=
|
40
|
+
begin
|
41
|
+
ad_routes_array = rails_routes.routes
|
42
|
+
rack_routes_array = rails_routes.set.instance_eval{ @routes }
|
43
|
+
Hash[ rack_routes_array.zip(ad_routes_array) ]
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def route_set
|
48
|
+
@route_set ||=
|
49
|
+
begin
|
50
|
+
set = rails_routes.set
|
51
|
+
set
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
class Rails3 < Patterner
|
56
|
+
def build(env)
|
57
|
+
req = build_request(env)
|
58
|
+
route, matches, params = route_set.recognize(req)
|
59
|
+
|
60
|
+
path_spec = :unrecognized
|
61
|
+
segment_keys = {}
|
62
|
+
|
63
|
+
if route_map.has_key?(route)
|
64
|
+
rails_route = route_map[route]
|
65
|
+
path_spec = rails_route.path
|
66
|
+
segment_keys = rails_route.segment_keys
|
67
|
+
end
|
68
|
+
|
69
|
+
RoutePattern.new(route, matches, params, path_spec, segment_keys)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
class Rails4 < Patterner
|
74
|
+
def route_set
|
75
|
+
@route_set ||=
|
76
|
+
begin
|
77
|
+
set = Rails.application.routes.router
|
78
|
+
set
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
def build_request(request_env)
|
83
|
+
ActionDispatch::Request.new(base_env.merge(request_env))
|
84
|
+
end
|
85
|
+
|
86
|
+
def build(env)
|
87
|
+
req = build_request(env)
|
88
|
+
pattern = nil
|
89
|
+
route_set.recognize(req) do |route, matches, params|
|
90
|
+
rails_route = route_map[route]
|
91
|
+
|
92
|
+
path_spec = :unrecognized
|
93
|
+
segment_keys = {}
|
94
|
+
|
95
|
+
if route_map.has_key?(route)
|
96
|
+
rails_route = route_map[route]
|
97
|
+
path_spec = rails_route.path.spec.to_s
|
98
|
+
segment_keys = rails_route.segment_keys
|
99
|
+
end
|
100
|
+
|
101
|
+
pattern = RoutePattern.new(route, matches, params, path_spec, segment_keys)
|
102
|
+
end
|
103
|
+
if pattern.nil?
|
104
|
+
pattern = RoutePattern.new(nil,nil,nil,nil,nil)
|
105
|
+
end
|
106
|
+
pattern
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
@@ -3,12 +3,31 @@ require 'fluoride-analyzer'
|
|
3
3
|
module Fluoride
|
4
4
|
module Analyzer
|
5
5
|
class Railtie < ::Rails::Railtie
|
6
|
-
|
6
|
+
config.fluoride_path = %w{
|
7
|
+
.
|
8
|
+
~/.config/fluoride
|
9
|
+
~/.fluoride
|
10
|
+
}
|
7
11
|
|
8
12
|
rake_tasks do
|
9
|
-
|
10
|
-
|
13
|
+
require 'fluoride-analyzer/tasklib'
|
14
|
+
|
15
|
+
configs = Valise::define do
|
16
|
+
config.fluoride_path.each do |path|
|
17
|
+
ro path
|
18
|
+
end
|
19
|
+
ro(from_here("../../../default_configs"))
|
20
|
+
|
21
|
+
handle "*.yaml", :yaml, :hash_merge
|
22
|
+
handle "*.yml", :yaml, :hash_merge
|
23
|
+
end
|
11
24
|
|
25
|
+
analyzer_config = configs.contents("analyzer.yml")
|
26
|
+
|
27
|
+
Fluoride::Analyzer::Tasklib.new do |task|
|
28
|
+
task.from_hash(analyzer_config)
|
29
|
+
end
|
30
|
+
end
|
12
31
|
end
|
13
32
|
end
|
14
33
|
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
require 'fluoride-analyzer/request-templater'
|
2
|
+
require 'mattock'
|
3
|
+
|
4
|
+
module Fluoride::Analyzer
|
5
|
+
class Tasklib < ::Mattock::Tasklib
|
6
|
+
default_namespace "fluoride:analyzer"
|
7
|
+
|
8
|
+
setting :limit, nil
|
9
|
+
dir( :fluoride, "fluoride",
|
10
|
+
path( :results, "results.yml"),
|
11
|
+
dir( :request_recordings, "recorded-requests"),
|
12
|
+
dir( :request_specs, "spec/requests"))
|
13
|
+
|
14
|
+
setting :recordings_list
|
15
|
+
|
16
|
+
def resolve_configuration
|
17
|
+
super
|
18
|
+
resolve_paths
|
19
|
+
self.recordings_list ||= FileList[ "#{request_recordings.abspath}/*.yml" ]
|
20
|
+
end
|
21
|
+
|
22
|
+
def define
|
23
|
+
in_namespace do
|
24
|
+
directory request_specs.abspath
|
25
|
+
|
26
|
+
desc "Delete and rebuild request specs based on Fluoride collections"
|
27
|
+
task :rebuild_request_specs => [:clobber_request_specs, :template_request_specs]
|
28
|
+
|
29
|
+
task :clobber_request_specs do
|
30
|
+
sh("rm -rf #{request_specs.abspath}/*")
|
31
|
+
end
|
32
|
+
|
33
|
+
file results.abspath => [:environment] + recordings_list do |task|
|
34
|
+
parser = Fluoride::Analyzer::Parser.new
|
35
|
+
|
36
|
+
recordings_list.find_all do |prereq|
|
37
|
+
next unless File.file?(prereq) && __FILE__ != prereq
|
38
|
+
parser.parse_stream(File.read(prereq))
|
39
|
+
end
|
40
|
+
|
41
|
+
parser.limit = limit
|
42
|
+
|
43
|
+
File.open(results.abspath, "w") do |target_file|
|
44
|
+
target_file.write(YAML.dump(parser.formatted_results))
|
45
|
+
end
|
46
|
+
|
47
|
+
puts "Found #{parser.formatted_results.keys.length} unique requests"
|
48
|
+
end
|
49
|
+
|
50
|
+
desc "Produce request specs that reproduce Fluoride collections"
|
51
|
+
task :template_request_specs => [request_specs.abspath, results.abspath] do
|
52
|
+
templater = Fluoride::Analyzer::RequestTemplater.new
|
53
|
+
|
54
|
+
templater.template_string = File::read(File::expand_path(
|
55
|
+
"../../../default_config/templates/request_spec.erb", __FILE__))
|
56
|
+
templater.results = YAML.load(File.read(results.abspath))
|
57
|
+
templater.go do |filename, contents|
|
58
|
+
path = File.join(request_specs.abspath, filename)
|
59
|
+
File.open(path, "w") do |spec_file|
|
60
|
+
spec_file.write(contents)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
data/spec/railtie_spec.rb
CHANGED
@@ -2,26 +2,21 @@ require "action_controller/railtie"
|
|
2
2
|
require 'fluoride-analyzer/rails'
|
3
3
|
|
4
4
|
describe Fluoride::Analyzer::Railtie do
|
5
|
-
|
6
|
-
def config(app)
|
7
|
-
|
8
|
-
end
|
9
|
-
|
10
|
-
let :rails_application do
|
5
|
+
let! :rails_application do
|
11
6
|
Class.new(::Rails::Application).tap do |app|
|
12
7
|
app.configure do
|
13
8
|
config.active_support.deprecation = :stderr
|
14
9
|
config.eager_load = false
|
15
10
|
end
|
16
|
-
config(app)
|
17
11
|
app.initialize!
|
18
|
-
end
|
12
|
+
end.load_tasks
|
19
13
|
end
|
20
14
|
|
21
15
|
after :each do
|
22
16
|
Rails.application = nil #because Rails has ideas of it's own, silly thing
|
23
17
|
end
|
24
18
|
|
25
|
-
it "should add rake tasks"
|
26
|
-
|
19
|
+
it "should add rake tasks" do
|
20
|
+
expect(Rake::Task["fluoride:analyzer:rebuild_request_specs"]).not_to be_nil
|
21
|
+
end
|
27
22
|
end
|
metadata
CHANGED
@@ -1,15 +1,16 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fluoride-analyzer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Judson Lester
|
8
8
|
- Evan Down
|
9
|
+
- Patricia Ho
|
9
10
|
autorequire:
|
10
11
|
bindir: bin
|
11
12
|
cert_chain: []
|
12
|
-
date:
|
13
|
+
date: 2015-01-13 00:00:00.000000000 Z
|
13
14
|
dependencies:
|
14
15
|
- !ruby/object:Gem::Dependency
|
15
16
|
name: mattock
|
@@ -42,32 +43,34 @@ dependencies:
|
|
42
43
|
description: |2
|
43
44
|
Part of the Fluoride suite - tools for making your black box a bit whiter
|
44
45
|
email:
|
45
|
-
-
|
46
|
+
- judson@lrdesign.com
|
46
47
|
- evan@lrdesign.com
|
48
|
+
- patricia@lrdesign.com
|
47
49
|
executables: []
|
48
50
|
extensions: []
|
49
51
|
extra_rdoc_files: []
|
50
52
|
files:
|
51
|
-
- lib/fluoride-analyzer
|
52
|
-
- lib/fluoride-analyzer/exception-result.rb
|
53
|
-
- lib/fluoride-analyzer/rails/railtie.rb
|
54
|
-
- lib/fluoride-analyzer/group-context.rb
|
53
|
+
- lib/fluoride-analyzer.rb
|
55
54
|
- lib/fluoride-analyzer/config.rb
|
56
|
-
- lib/fluoride-analyzer/
|
55
|
+
- lib/fluoride-analyzer/exception-result.rb
|
56
|
+
- lib/fluoride-analyzer/exchange-result.rb
|
57
57
|
- lib/fluoride-analyzer/group-collapser.rb
|
58
|
-
- lib/fluoride-analyzer/
|
58
|
+
- lib/fluoride-analyzer/group-context.rb
|
59
|
+
- lib/fluoride-analyzer/parser.rb
|
59
60
|
- lib/fluoride-analyzer/pattern-collapser.rb
|
61
|
+
- lib/fluoride-analyzer/pattern-context.rb
|
62
|
+
- lib/fluoride-analyzer/patterner.rb
|
63
|
+
- lib/fluoride-analyzer/rails.rb
|
64
|
+
- lib/fluoride-analyzer/rails/railtie.rb
|
65
|
+
- lib/fluoride-analyzer/request-processor.rb
|
66
|
+
- lib/fluoride-analyzer/request-templater.rb
|
60
67
|
- lib/fluoride-analyzer/request.rb
|
61
|
-
- lib/fluoride-analyzer/tasks.rake
|
62
68
|
- lib/fluoride-analyzer/result-collection.rb
|
63
|
-
- lib/fluoride-analyzer/
|
64
|
-
-
|
65
|
-
- lib/fluoride-analyzer/exchange-result.rb
|
66
|
-
- lib/fluoride-analyzer.rb
|
67
|
-
- spec/result-templater.rb
|
69
|
+
- lib/fluoride-analyzer/tasklib.rb
|
70
|
+
- spec-help/gem-test-suite.rb
|
68
71
|
- spec/railtie_spec.rb
|
69
72
|
- spec/result-parser.rb
|
70
|
-
- spec
|
73
|
+
- spec/result-templater.rb
|
71
74
|
homepage: http://github.com/lrdesign/fluoride-analyzer
|
72
75
|
licenses:
|
73
76
|
- MIT
|
@@ -78,7 +81,7 @@ rdoc_options:
|
|
78
81
|
- --main
|
79
82
|
- doc/README
|
80
83
|
- --title
|
81
|
-
- fluoride-analyzer-0.0.
|
84
|
+
- fluoride-analyzer-0.0.3 Documentation
|
82
85
|
require_paths:
|
83
86
|
- lib/
|
84
87
|
required_ruby_version: !ruby/object:Gem::Requirement
|
@@ -93,7 +96,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
93
96
|
version: '0'
|
94
97
|
requirements: []
|
95
98
|
rubyforge_project:
|
96
|
-
rubygems_version: 2.
|
99
|
+
rubygems_version: 2.4.1
|
97
100
|
signing_key:
|
98
101
|
specification_version: 4
|
99
102
|
summary: Analysis of recorded requests
|
@@ -1,46 +0,0 @@
|
|
1
|
-
require 'fluoride-analyzer/request-templater'
|
2
|
-
|
3
|
-
FLUORIDE_PATH = 'fluoride-collector'
|
4
|
-
LIMIT = 2000
|
5
|
-
|
6
|
-
directory 'spec/requests'
|
7
|
-
|
8
|
-
task :parse_fluoride => 'paths.yml'
|
9
|
-
|
10
|
-
task :rebuild_request_specs => [:clobber_request_specs, :template_request_specs]
|
11
|
-
|
12
|
-
task :clobber_request_specs do
|
13
|
-
sh("rm -rf spec/requests/*")
|
14
|
-
end
|
15
|
-
|
16
|
-
file 'results.yml' => FileList[ "#{FLUORIDE_PATH}/*.yml" ] do |task|
|
17
|
-
Rake::Task[:environment].invoke
|
18
|
-
parser = Fluoride::Analyzer::Parser.new
|
19
|
-
|
20
|
-
task.prerequisites.find_all do |prereq|
|
21
|
-
next unless File.file?(prereq) && __FILE__ != prereq
|
22
|
-
parser.parse_stream(File.read(prereq))
|
23
|
-
end
|
24
|
-
|
25
|
-
#parser.limit = LIMIT #XXX Uncomment to limit number of files parsed
|
26
|
-
parser.target_path = task.name
|
27
|
-
|
28
|
-
File.open(task.name, "w") do |target_file|
|
29
|
-
target_file.write(YAML.dump(parser.formatted_results))
|
30
|
-
end
|
31
|
-
|
32
|
-
puts "Found #{parser.formatted_results.keys.length} unique requests"
|
33
|
-
end
|
34
|
-
|
35
|
-
task :template_request_specs => ['spec/requests', 'results.yml'] do
|
36
|
-
templater = Fluoride::Analyzer::RequestTemplater.new
|
37
|
-
|
38
|
-
templater.template_string = File::read(File::expand_path("../../../templates/request_spec.erb", __FILE__))
|
39
|
-
templater.results = YAML.load(File.read('results.yml'))
|
40
|
-
templater.go do |filename, contents|
|
41
|
-
path = File.join("spec/requests", filename)
|
42
|
-
File.open(path, "w") do |spec_file|
|
43
|
-
spec_file.write(contents)
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|