janis 0.1.0

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: d364bdc4c0ee61a20d219b5ff7cca4c670d5b264
4
+ data.tar.gz: 274b8649f22c31649bfe00e4c4e49592feaf68bd
5
+ SHA512:
6
+ metadata.gz: e458062c22c2ff58e28da48b7f86addd9482cadf41d274288d650ef0c639a9a7a84ca21c81441fdd0af9a643ea2a13051627c3aa9c3a587c334c031eda20ec9e
7
+ data.tar.gz: a7fb29a62a8fa47d7ef640e9aa2659dfc141dc461fe363b98d183da2036ffb59b3a2ed1be50666d2d90850cce6eb68d1a1246dad863db20258e5daddc57fcacc
data/.gitignore ADDED
@@ -0,0 +1,9 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
data/.travis.yml ADDED
@@ -0,0 +1,4 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.0.0
4
+ before_install: gem install bundler -v 1.10.5
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in janis.gemspec
4
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2015 Mariano Giagante
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
22
+
data/README.md ADDED
@@ -0,0 +1,93 @@
1
+ # Janis
2
+
3
+ Janis will help you find proxy servers quickly, by grabbing them from a list of many (hopefully available and up-to-date) proxy listing websites. You can also tell Janis to parse from a specific website and it will do it if it knows how to. If it doesn't you can improve it by adding new Parsers (more on this on Usage section).
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ ```ruby
10
+ gem 'janis'
11
+ ```
12
+
13
+ And then execute:
14
+
15
+ $ bundle
16
+
17
+ Or install it yourself as:
18
+
19
+ $ gem install janis
20
+
21
+ ## Usage
22
+ From your own script/app or from irb, require the gem with:
23
+ ```ruby
24
+ require 'janis'
25
+ ```
26
+ And then do:
27
+ ```ruby
28
+ Janis.find(max_amount_of_results)
29
+ ```
30
+
31
+ That will gather proxy server info from all url's (and local files) included in the default source list, bringing a maximum of results specified in the argument.
32
+ Note: Entries in the default source list can be disabled by commenting them out with a # at their beginning.
33
+
34
+ ## Extending Janis
35
+
36
+ If there's a proxy listing website you consider reliable and up-to-date which you'd like to add it to the list:
37
+
38
+ 1. Fork Janis repository.
39
+ 2. Define a module file following the format shown in /specific_parsers/template.rb. There, subclass ProxyWebsiteParser and override the #parse method.
40
+ Example:
41
+
42
+ ```ruby
43
+ class MyAwesomeProxyListParser < Janis::Parsing::WebSpecificParsers::ProxyWebsiteParser
44
+
45
+ include CapybaraWithPanthomJs # optional - only if you use capybara-poltergeist for parsing
46
+
47
+ def self.url
48
+ # url to the proxy list website you will be parsing in the #parse method
49
+ end
50
+
51
+ def configure_capybara # optional - only if you use capybara-poltergeist for parsing
52
+ Capybara.configure { |c| c.app_host = url }
53
+ end
54
+
55
+ def initialize
56
+ super
57
+ configure_capybara # optional - only if you use capybara-poltergeist for parsing
58
+ @session = new_session # optional - only if you use capybara-poltergeist for parsing
59
+ @session.visit(url) # optional - only if you use capybara-poltergeist for parsing
60
+ obtain_html_doc
61
+ end
62
+
63
+ def parse
64
+ # Your code to parse the page's content and deliver an array of strings
65
+ # Those strings must have the format "IP:PORT_NUMBER"
66
+ end
67
+
68
+ private
69
+
70
+ def obtain_html_doc # optional - Redefine the way the html document to parse is obtained if you use capybara/poltergeist
71
+ @html_doc = Nokogiri.HTML(@session.html)
72
+ end
73
+
74
+ end
75
+ ```
76
+
77
+ 3. Implement #parse method so that it successfully returns an array of strings with the "IP:PORT_NUMBER" format.
78
+ Example output: ["1.1.1.1:3434", "2.2.2.2:3333", "255.3.1.4: 8787"]. The implementation must use Nokogiri, our parser dependency.
79
+
80
+ 4. Run the tests.
81
+ 5. If all tests pass, create a pull request.
82
+ 6. Wait for the applauses to come!
83
+
84
+ ## Development
85
+
86
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
87
+
88
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
89
+
90
+ ## Contributing
91
+
92
+ Bug reports and pull requests are welcome on GitHub at https://github.com/mgiagante/janis.
93
+
data/Rakefile ADDED
@@ -0,0 +1,10 @@
1
+ require "bundler/gem_tasks"
2
+ require "rake/testtask"
3
+
4
+ Rake::TestTask.new(:test) do |t|
5
+ t.libs << "test"
6
+ t.libs << "lib"
7
+ t.test_files = FileList['test/**/*_test.rb']
8
+ end
9
+
10
+ task :default => :test
data/bin/console ADDED
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
4
+
5
+ require "bundler/setup"
6
+ require "janis"
7
+
8
+ # You can add fixtures and/or initialization code here to make experimenting
9
+ # with your gem easier. You can also use a different console, if you like.
10
+
11
+ require "pry"
12
+ Pry.start
13
+
data/bin/setup ADDED
@@ -0,0 +1,7 @@
1
+ #!/bin/bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+
5
+ bundle install
6
+
7
+ # Do any other automated setup that you need to do here
data/janis.gemspec ADDED
@@ -0,0 +1,27 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'janis/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "janis"
8
+ spec.version = Janis::VERSION
9
+ spec.authors = ["Mariano Giagante"]
10
+ spec.email = ["mariano.giagante@gmail.com"]
11
+ spec.license = "MIT"
12
+ spec.summary = %q{Janis grabs proxy servers from many websites for you!}
13
+ spec.description = %q{It uses a source list with several testes websites to provide proxy servers to you. It can be extended with new ones as well.}
14
+ spec.homepage = "http://www.github.com/mgiagante/janis"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
17
+ spec.bindir = "exe"
18
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_development_dependency "bundler", "~> 1.10"
22
+ spec.add_development_dependency "rake", "~> 10.0"
23
+ spec.add_development_dependency "minitest", "~> 0"
24
+ spec.add_development_dependency "pry", "~> 0"
25
+ spec.add_runtime_dependency "nokogiri", "~> 0"
26
+ spec.add_runtime_dependency "poltergeist", "~> 0"
27
+ end
data/lib/janis.rb ADDED
@@ -0,0 +1,36 @@
1
+ require 'janis/version'
2
+ require 'janis/parsing'
3
+ require 'yaml'
4
+
5
+ module Janis
6
+
7
+ IP_PORT_SEPARATOR = ':'
8
+
9
+ def self.find(amount, path_to_list = './proxy_server_list.yml')
10
+
11
+ proxy_list = YAML.load_file("#{path_to_list}").split(' ')
12
+ results = []
13
+
14
+ proxy_list.each do |url|
15
+ if results.size < amount
16
+ parsed_from_url = Parsing.parse(url) unless url.include?('#') # Elements should look like ["1.1.1.1:8080", "2.2.2.2:9090"]
17
+ results_from_this_url = parsed_from_url.map { |entry| convert_to_hash(entry) }
18
+ # Result should look like [ { ip: "1.1.1.1", port: "8080" }, { ip: "2.2.2.2", port: "9090" } ]
19
+ results += results_from_this_url
20
+ end
21
+ end
22
+
23
+ results[0..amount - 1]
24
+
25
+ end
26
+
27
+ private
28
+
29
+ def self.convert_to_hash(proxy_string)
30
+ {
31
+ ip: proxy_string.split(IP_PORT_SEPARATOR).first,
32
+ port: proxy_string.split(IP_PORT_SEPARATOR).last
33
+ }
34
+ end
35
+
36
+ end
@@ -0,0 +1,25 @@
1
+ require 'janis/proxy_website_parser'
2
+ Dir['./lib/janis/specific_parsers/*.rb'].each { |file| require file }
3
+
4
+ module Janis
5
+
6
+ module Parsing
7
+
8
+ class ParserFactory
9
+
10
+ def self.create_parser_for(url)
11
+ parsers = Janis::Parsing::SpecificParsers::ProxyWebsiteParser.subclasses
12
+ raise "No parsers available!" if parsers.empty?
13
+ parser_class = parsers.find do |klass|
14
+ klass.url == url
15
+ end
16
+ raise "No parser available for #{url}" unless parser_class
17
+ parser_class.new
18
+ end
19
+
20
+ end
21
+
22
+ end
23
+
24
+ end
25
+
@@ -0,0 +1,14 @@
1
+ require 'janis/validations'
2
+ require 'janis/parser_factory'
3
+
4
+ module Janis
5
+
6
+ module Parsing
7
+
8
+ def self.parse(url)
9
+ ParserFactory.create_parser_for(url).parse
10
+ end
11
+
12
+ end
13
+
14
+ end
@@ -0,0 +1,64 @@
1
+ module Janis
2
+
3
+ module Parsing
4
+
5
+ module SpecificParsers
6
+
7
+ class ProxyWebsiteParser
8
+
9
+ attr_reader :url
10
+
11
+ @@subclasses = []
12
+
13
+ def self.subclasses
14
+ @@subclasses
15
+ end
16
+
17
+ def self.inherited(subclass)
18
+ add_subclass(subclass)
19
+ end
20
+
21
+ def initialize
22
+ @url = self.class.url
23
+ end
24
+
25
+ def self.url
26
+ raise "Subclass Responsibility!"
27
+ end
28
+
29
+ # It should return an array of strings. Each string should have the format "IP:PORT"
30
+ def parse
31
+ raise "Subclass Responsibility!"
32
+ end
33
+
34
+ private
35
+
36
+ def obtain_html_doc
37
+ if self.url.include?("http://")
38
+ Nokogiri::HTML(get_content_by_http(self.url))
39
+ elsif url.include?("file://")
40
+ Nokogiri::HTML(read_content_from_file(self.url))
41
+ else
42
+ raise "#{self.url} is not a supported URL!"
43
+ end
44
+ end
45
+
46
+ def get_content_by_http(url)
47
+ open(self.url)
48
+ end
49
+
50
+ def read_content_from_file(url)
51
+ File::open(self.url.gsub('file://',''), 'r').read
52
+ end
53
+
54
+ def self.add_subclass(subclass)
55
+ @@subclasses << subclass
56
+ end
57
+
58
+ end
59
+
60
+ end
61
+
62
+ end
63
+
64
+ end
@@ -0,0 +1,19 @@
1
+ module Janis
2
+
3
+ module Parsing
4
+
5
+ module SpecificParsers
6
+ class HideMyAssParser < ProxyWebsiteParser
7
+ def self.url
8
+ 'http://proxylist.hidemyass.com'
9
+ end
10
+
11
+ def parse
12
+ # TODO: Implement parsing for hidemyass.com
13
+ end
14
+ end
15
+ end
16
+
17
+ end
18
+
19
+ end
@@ -0,0 +1,29 @@
1
+ require 'capybara/poltergeist'
2
+ require 'capybara/dsl'
3
+
4
+ module CapybaraWithPhantomJs
5
+ include Capybara::DSL
6
+
7
+ # Create a new PhantomJS session in Capybara
8
+ def new_session
9
+
10
+ # Register PhantomJS (aka poltergeist) as the driver to use
11
+ Capybara.register_driver :poltergeist do |app|
12
+ Capybara::Poltergeist::Driver.new(app)
13
+ end
14
+
15
+ # Use XPath as the default selector for the find method
16
+ #Capybara.default_selector = :xpath
17
+
18
+ # Start up a new thread
19
+ @session = Capybara::Session.new(:poltergeist)
20
+
21
+ # Report using a particular user agent
22
+ @session.driver.headers = { 'User-Agent' =>
23
+ "Janis Parser ;)" }
24
+
25
+ # Return the driver's session
26
+ @session
27
+ end
28
+
29
+ end
@@ -0,0 +1,72 @@
1
+ require 'nokogiri';
2
+ require './lib/janis/specific_parsers/parsing_tools/capybara_with_phantom_js'
3
+
4
+ module Janis
5
+
6
+ module Parsing
7
+
8
+ module SpecificParsers
9
+ class ProxyListOrgParser < ProxyWebsiteParser
10
+
11
+ include CapybaraWithPhantomJs
12
+
13
+ Struct.new('Row', :proxy, :country, :city, :type, :speed, :https_ssl)
14
+
15
+ def self.url
16
+ 'http://proxy-list.org'
17
+ end
18
+
19
+ def initialize
20
+ super
21
+ configure_capybara
22
+ @session = new_session
23
+ @session.visit(url)
24
+ obtain_html_doc
25
+ end
26
+
27
+ def configure_capybara
28
+ Capybara.configure { |c| c.app_host = url }
29
+ end
30
+
31
+ def parse
32
+ total_rows = []
33
+ total_rows += rows
34
+ [2,3,4,5,6,7,8,9,10].each do |page_number|
35
+ @session.click_link(page_number.to_s)
36
+ obtain_html_doc
37
+ total_rows += rows
38
+ end
39
+ total_rows
40
+
41
+ #TODO: This map is here to adapt #parse output to the one expected by Janis.find. Remove this when it starts accepting
42
+ #more info about each proxy server.
43
+ total_rows.map do |row|
44
+ row.proxy
45
+ end
46
+ end
47
+
48
+ private
49
+
50
+ def obtain_html_doc
51
+ @html_doc = Nokogiri.HTML(@session.html)
52
+ end
53
+
54
+ def rows
55
+ rows_in_html = @html_doc.css('ul').select { |ul| ul.to_s.match /\d\d\d\./}
56
+ results = rows_in_html.map do |row_html|
57
+ row_object = Struct::Row.new( #TODO: This should be an actual class, and should have methods to retrieve all attributes.
58
+ row_html.css('.proxy').children.last.text,
59
+ row_html.css('.country').text,
60
+ row_html.css('.city').text,
61
+ row_html.css('.type').text,
62
+ row_html.css('.speed').text,
63
+ row_html.css('.https').text
64
+ )
65
+ end
66
+ end
67
+ end
68
+ end
69
+
70
+ end
71
+
72
+ end
@@ -0,0 +1,23 @@
1
+ module Janis
2
+
3
+ module Parsing
4
+
5
+ module SpecificParsers
6
+ class SimpleParser < ProxyWebsiteParser
7
+ PROXY_REGEX = /\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\:\d{1,5}/
8
+ def initialize
9
+ super
10
+ @html_doc = obtain_html_doc
11
+ end
12
+ def parse
13
+ @result ||= @html_doc.to_s.scan(PROXY_REGEX)
14
+ end
15
+ def self.url
16
+ 'file://./test/html/simple.html'
17
+ end
18
+ end
19
+ end
20
+
21
+ end
22
+
23
+ end
@@ -0,0 +1,36 @@
1
+ =begin
2
+
3
+ class MyAwesomeProxyListParser < Janis::Parsing::WebSpecificParsers::ProxyWebsiteParser
4
+
5
+ include CapybaraWithPanthomJs # optional - only if you use capybara-poltergeist for parsing
6
+
7
+ def self.url
8
+ # url to the proxy list website you will be parsing in the #parse method
9
+ end
10
+
11
+ def configure_capybara # optional - only if you use capybara-poltergeist for parsing
12
+ Capybara.configure { |c| c.app_host = url }
13
+ end
14
+
15
+ def initialize
16
+ super
17
+ configure_capybara # optional - only if you use capybara-poltergeist for parsing
18
+ @session = new_session # optional - only if you use capybara-poltergeist for parsing
19
+ @session.visit(url) # optional - only if you use capybara-poltergeist for parsing
20
+ obtain_html_doc
21
+ end
22
+
23
+ def parse
24
+ # Your code to parse the page's content and deliver an array of strings
25
+ # Those strings must have the format "IP:PORT_NUMBER"
26
+ end
27
+
28
+ private
29
+
30
+ def obtain_html_doc # optional - Redefine the way the html document to parse is obtained if you use capybara/poltergeist
31
+ @html_doc = Nokogiri.HTML(@session.html)
32
+ end
33
+
34
+ end
35
+
36
+ =end
@@ -0,0 +1,30 @@
1
+ module Janis
2
+
3
+ module Parsing
4
+
5
+ module Validations
6
+
7
+ def self.validate(entry)
8
+ validate_matchable(entry)
9
+ validate_format(entry)
10
+ # Add specific validations like "must not include letters", "must not include special chars other than : or . . ."
11
+ # "numbers separated by the . must not have more than 3 digits"
12
+ # etcetera
13
+ end
14
+
15
+ private
16
+
17
+ def self.validate_matchable(entry)
18
+ raise "Entry is does not respond to #match." unless entry.respond_to?(:match)
19
+ end
20
+
21
+ def self.validate_format(entry)
22
+ format_regex = /\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\:\d{1,5}/
23
+ raise "Entry has an invalid format." unless entry.matches? FORMAT_REGEX # This one covers unexpected situations
24
+ end
25
+
26
+ end
27
+
28
+ end
29
+
30
+ end
@@ -0,0 +1,3 @@
1
+ module Janis
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1,5 @@
1
+ http://proxy-list.org
2
+ #http://incloak.es/proxy-list/
3
+ #http://spys.ru/free-proxy-list/
4
+ #http://www.samair.ru/proxy/
5
+ #http://www.proxys.com.ar/
metadata ADDED
@@ -0,0 +1,151 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: janis
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Mariano Giagante
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2016-05-15 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.10'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.10'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: minitest
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: pry
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: nokogiri
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: poltergeist
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ description: It uses a source list with several testes websites to provide proxy servers
98
+ to you. It can be extended with new ones as well.
99
+ email:
100
+ - mariano.giagante@gmail.com
101
+ executables: []
102
+ extensions: []
103
+ extra_rdoc_files: []
104
+ files:
105
+ - ".gitignore"
106
+ - ".travis.yml"
107
+ - Gemfile
108
+ - LICENSE
109
+ - README.md
110
+ - Rakefile
111
+ - bin/console
112
+ - bin/setup
113
+ - janis.gemspec
114
+ - lib/janis.rb
115
+ - lib/janis/parser_factory.rb
116
+ - lib/janis/parsing.rb
117
+ - lib/janis/proxy_website_parser.rb
118
+ - lib/janis/specific_parsers/hide_my_ass.rb
119
+ - lib/janis/specific_parsers/parsing_tools/capybara_with_phantom_js.rb
120
+ - lib/janis/specific_parsers/proxy-list_org.rb
121
+ - lib/janis/specific_parsers/simple.rb
122
+ - lib/janis/specific_parsers/template.rb
123
+ - lib/janis/validations.rb
124
+ - lib/janis/version.rb
125
+ - proxy_server_list.yml
126
+ homepage: http://www.github.com/mgiagante/janis
127
+ licenses:
128
+ - MIT
129
+ metadata: {}
130
+ post_install_message:
131
+ rdoc_options: []
132
+ require_paths:
133
+ - lib
134
+ required_ruby_version: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ required_rubygems_version: !ruby/object:Gem::Requirement
140
+ requirements:
141
+ - - ">="
142
+ - !ruby/object:Gem::Version
143
+ version: '0'
144
+ requirements: []
145
+ rubyforge_project:
146
+ rubygems_version: 2.4.8
147
+ signing_key:
148
+ specification_version: 4
149
+ summary: Janis grabs proxy servers from many websites for you!
150
+ test_files: []
151
+ has_rdoc: