orsos 0.0.1

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: d63316ed0dbd8306399ebe2aaa2375a7ce4e4c2a
4
+ data.tar.gz: 894dfef3f82e1f8ea76f1320e265617852652564
5
+ SHA512:
6
+ metadata.gz: 1b6d948103d78c9afdd4d4a677b1f552b05c4f5cf9526684a383df20ce2e5af97e97ccbb76caecb0b28a20c0342df791dd56e26b3d02f6d22c1df5713fe1721f
7
+ data.tar.gz: 95610fd869f27050544ccd35ce1f91ea13626f0a6ad798a957d31507c33f1a126464cca69764b1ab968b4400f76403a0476302656a2e2d591d5840038565f79b
data/.gitignore ADDED
@@ -0,0 +1,50 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ *.bundle
19
+ *.so
20
+ *.o
21
+ *.a
22
+ mkmf.log
23
+
24
+ # If you find yourself ignoring temporary files generated by your text editor
25
+ # or operating system, you probably want to add a global ignore instead:
26
+ # git config --global core.excludesfile ~/.gitignore_global
27
+ #
28
+ # Here are some files you may want to ignore globally:
29
+
30
+ # scm revert files
31
+ **.orig
32
+
33
+ # Mac finder artifacts
34
+ .DS_Store
35
+
36
+ # Netbeans project directory
37
+ /nbproject/
38
+
39
+ # RubyMine project files
40
+ .idea
41
+
42
+ # Textmate project files
43
+ /*.tmproj
44
+
45
+ # vim artifacts
46
+ **.swp
47
+
48
+ # Environment files that may contain sensitive data
49
+ .env
50
+ .powenv
data/.ruby-gemset ADDED
@@ -0,0 +1 @@
1
+ hack_oregon_prototype
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 2.1.2
data/Gemfile ADDED
@@ -0,0 +1,7 @@
1
+ source 'https://rubygems.org'
2
+
3
+ ruby '2.1.2'
4
+ gem 'pry-byebug'
5
+ gem 'repl_rake'
6
+ # Specify your gem's dependencies in orsos.gemspec
7
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,67 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ orsos (0.0.1)
5
+
6
+ GEM
7
+ remote: https://rubygems.org/
8
+ specs:
9
+ byebug (3.5.1)
10
+ columnize (~> 0.8)
11
+ debugger-linecache (~> 1.2)
12
+ slop (~> 3.6)
13
+ coderay (1.1.0)
14
+ columnize (0.8.9)
15
+ debugger-linecache (1.2.0)
16
+ domain_name (0.5.21)
17
+ unf (>= 0.0.5, < 1.0.0)
18
+ http-cookie (1.0.2)
19
+ domain_name (~> 0.5)
20
+ mechanize (2.7.3)
21
+ domain_name (~> 0.5, >= 0.5.1)
22
+ http-cookie (~> 1.0)
23
+ mime-types (~> 2.0)
24
+ net-http-digest_auth (~> 1.1, >= 1.1.1)
25
+ net-http-persistent (~> 2.5, >= 2.5.2)
26
+ nokogiri (~> 1.4)
27
+ ntlm-http (~> 0.1, >= 0.1.1)
28
+ webrobots (>= 0.0.9, < 0.2)
29
+ method_source (0.8.2)
30
+ mime-types (2.3)
31
+ mini_portile (0.6.0)
32
+ net-http-digest_auth (1.4)
33
+ net-http-persistent (2.9.4)
34
+ netrc (0.7.9)
35
+ nokogiri (1.6.3.1)
36
+ mini_portile (= 0.6.0)
37
+ ntlm-http (0.1.1)
38
+ pry (0.10.1)
39
+ coderay (~> 1.1.0)
40
+ method_source (~> 0.8.1)
41
+ slop (~> 3.4)
42
+ pry-byebug (2.0.0)
43
+ byebug (~> 3.4)
44
+ pry (~> 0.10)
45
+ rake (10.3.2)
46
+ repl_rake (0.1.0)
47
+ rest_client (1.7.3)
48
+ netrc (~> 0.7.7)
49
+ slop (3.6.0)
50
+ thor (0.19.1)
51
+ unf (0.1.4)
52
+ unf_ext
53
+ unf_ext (0.0.6)
54
+ webrobots (0.1.1)
55
+
56
+ PLATFORMS
57
+ ruby
58
+
59
+ DEPENDENCIES
60
+ bundler (~> 1.6)
61
+ mechanize
62
+ orsos!
63
+ pry-byebug
64
+ rake
65
+ repl_rake
66
+ rest_client (~> 1.7.3)
67
+ thor
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 Jonathan Chang
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,105 @@
1
+ # Orsos
2
+
3
+ Oregon Secretary of State Website Client. Use this tool to easily download transactions, candidate filings and committees excel files. Also provides a client to Hack Oregon API
4
+
5
+ ## TODO
6
+ - Transactions by commitee filing id
7
+ - Candidate Filings
8
+ - Committees
9
+
10
+ ## Installation
11
+
12
+ Add this line to your application's Gemfile:
13
+
14
+ gem 'orsos'
15
+
16
+ And then execute:
17
+
18
+ $ bundle
19
+
20
+ Or install it yourself as:
21
+
22
+ $ gem install orsos
23
+
24
+ ## Usage
25
+
26
+ TODO: Write usage instructions here
27
+
28
+ $ orsos help
29
+ Commands:
30
+ orsos api [COMMAND] # client for api located at http://hack-oregon-prototype.herokuapp.com
31
+ orsos get [COMMAND] # downloads excel files from website
32
+ orsos help [COMMAND] # Describe available commands or one specific command
33
+
34
+ $ orsos api help
35
+ api commands:
36
+ orsos api candidates # gets json or text for http://hack-oregon-prototype.herokuapp.com/api...
37
+ orsos api help [COMMAND] # Describe subcommands or one specific subcommand
38
+
39
+ $ orsos api candidates | head -n 20
40
+ {
41
+ "candidates": [
42
+ {
43
+ "id": 174,
44
+ "ballot_name": "Adam Peterson",
45
+ "party_affiliation": "Nonpartisan",
46
+ "email": "adam@judgeadampeterson.com",
47
+ "cell_phone": "Exempt from public record "
48
+ },
49
+ {
50
+ "id": 287,
51
+ "ballot_name": "Adrienne Nelson",
52
+ "party_affiliation": "Nonpartisan",
53
+ "email": "adrienne.nelson@ojd.state.or.us",
54
+ "cell_phone": null
55
+ },
56
+ {
57
+ "id": 12,
58
+ "ballot_name": "Alex Gardner",
59
+ "party_affiliation": "Nonpartisan",
60
+
61
+ $ orsos api candidates --text | head -n 20
62
+
63
+ Candidates
64
+ ----------
65
+ id ballot name party email
66
+ -------------------------
67
+ 174 Adam Peterson Nonpartisan adam@judgeadampeterson.com
68
+ 287 Adrienne Nelson Nonpartisan adrienne.nelson@ojd.state.or.us
69
+ 12 Alex Gardner Nonpartisan alex.gardner@co.lane.or.us
70
+ 195 Alex Hamalian Nonpartisan alexforjudge@gmail.com
71
+ 180 Alicia A Fuchs Nonpartisan alicia.fuchs@ojd.state.or.us
72
+ 106 Alissa Keny-Guyer Working Families alissa@alissakenyguyer.com
73
+ 258 Alta Jean Brady Nonpartisan ghendrix@bendcable.com
74
+ 168 A Michael Adler Nonpartisan michael.adler@ojd.state.or.us
75
+ 315 Amy Holmes Hehn Nonpartisan amy.holmeshehn@ojd.state.or.us
76
+ 156 Andrew (Drew) Kaza Working Families calmsense@nehalemtel.net
77
+ 58 Andrew R Erwin Nonpartisan andyerwin@icloud.com
78
+ 242 Andy Balyeat Nonpartisan andy@balyeatlaw.com
79
+ 82 Andy Olson Independent andypamo@comcast.net
80
+ 157 Angel Lopez Nonpartisan Angel.Lopez@ojd.state.or.us
81
+ 22 Annette C Hillman Nonpartisan annette.c.hillman@ojd.state.or.us
82
+ 46 Ann Lininger Working Families ann.lininger@gmail.com
83
+
84
+ $ orsos get help
85
+ get commands:
86
+ orsos get help [COMMAND] # Describe subcommands or one specific subcommand
87
+ orsos get transactions FROM [TO] # Download campaign finance transactions daily between FROM ti...
88
+
89
+ $ orsos get transactions 2014-10-21 2014-10-22
90
+ downloading transactions for 2014-10-21
91
+ saved transactions for 2014-10-21 to sos_transactions_20141021-20141022121911.xls
92
+ downloading transactions for 2014-10-22
93
+ saved transactions for 2014-10-22 to sos_transactions_20141022-20141022121927.xls
94
+
95
+ $ ls *.xls
96
+ sos_transactions_20141021-20141022121911.xls sos_transactions_20141022-20141022121927.xls
97
+
98
+
99
+ ## Contributing
100
+
101
+ 1. Fork it ( https://github.com/jonochang/orsos/fork )
102
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
103
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
104
+ 4. Push to the branch (`git push origin my-new-feature`)
105
+ 5. Create a new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,3 @@
1
+ require "bundler/gem_tasks"
2
+ require 'repl_rake'
3
+ ReplRake.setup
data/bin/orsos ADDED
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'orsos'
4
+ require 'pry-byebug'
5
+ Orsos::Command.start
@@ -0,0 +1,7 @@
1
+ require 'thor'
2
+ require_relative './commands/get'
3
+ require_relative './commands/api'
4
+ class Orsos::Command < Thor
5
+ register Orsos::Commands::Get, 'get', 'get [COMMAND]', 'downloads excel files from website'
6
+ register Orsos::Commands::Api, 'api', 'api [COMMAND]', "client for api located at #{Orsos::Commands::Api::ROOT_URL}"
7
+ end
@@ -0,0 +1,35 @@
1
+ require 'rest_client'
2
+ require 'json'
3
+ module Orsos::Commands
4
+ class Api < Thor
5
+ ROOT_URL = "http://hack-oregon-prototype.herokuapp.com"
6
+
7
+ desc "candidates", "gets json or text for #{ROOT_URL}/api/candidates.json"
8
+ option :text, type: :boolean
9
+ def candidates
10
+ url = "#{ROOT_URL}/api/candidates.json"
11
+ response = RestClient.get(url)
12
+ if options[:text]
13
+ json = JSON.parse(response.body)
14
+ puts "Candidates"
15
+ puts "----------"
16
+ puts "id\tballot name\tparty\temail"
17
+ puts "-------------------------"
18
+ json["candidates"].each do |candidate|
19
+ puts "#{candidate["id"]}\t#{candidate["ballot_name"]}\t#{candidate["party_affiliation"]}\t#{candidate["email"]}"
20
+ end
21
+ else
22
+ puts JSON.pretty_generate(JSON.parse(response.body))
23
+ end
24
+ end
25
+
26
+ ### FIX for help issue (see commit) ###
27
+ package_name "api"
28
+
29
+ def self.banner(command, namespace = nil, subcommand = false)
30
+ "#{basename} #{@package_name} #{command.usage}"
31
+ end
32
+ ### END FIX ###
33
+ end
34
+ end
35
+
@@ -0,0 +1,41 @@
1
+ require 'date'
2
+ require_relative '../webdownloader'
3
+
4
+ module Orsos::Commands
5
+ class Get < Thor
6
+ desc "transactions FROM [TO]", "Download campaign finance transactions daily between FROM till TO and saves each day to sos_transactions_{%Y%m%d}-{current time stamp}. eg., orsos get transactions 2014-10-01 2014-10-31. TO defaults to today's date"
7
+ option :verbose, type: :boolean
8
+ def transactions(from, to=Date.today)
9
+ from_date = case from
10
+ when Date
11
+ from
12
+ when String
13
+ Date.parse from
14
+ else
15
+ raise 'invalid from date'
16
+ end
17
+
18
+ to_date = case to
19
+ when Date
20
+ to
21
+ when String
22
+ Date.parse to
23
+ else
24
+ raise 'invalid to date'
25
+ end
26
+
27
+ (from_date..to_date).each do |date|
28
+ Orsos::Webdownloader.new(options[:verbose])
29
+ .save_campaign_finance_transactions_to_xls date, "sos_transactions"
30
+ end
31
+ end
32
+
33
+ ### FIX for help issue (see commit) ###
34
+ package_name "get"
35
+
36
+ def self.banner(command, namespace = nil, subcommand = false)
37
+ "#{basename} #{@package_name} #{command.usage}"
38
+ end
39
+ ### END FIX ###
40
+ end
41
+ end
@@ -0,0 +1,3 @@
1
+ module Orsos
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,69 @@
1
+ require 'mechanize'
2
+ require 'logger'
3
+
4
+ class Orsos::Webdownloader
5
+ def initialize(verbose=false)
6
+ @verbose = verbose
7
+ end
8
+
9
+ def save_campaign_finance_transactions_to_xls date, filename_prefix="sos_transactions"
10
+ puts "downloading transactions for #{date.strftime('%Y-%m-%d')}"
11
+ filename = "#{filename_prefix}_#{date.strftime("%Y%m%d")}-#{DateTime.now.strftime("%Y%m%d%H%M%S")}.xls"
12
+
13
+ export_page = download_campaign_finance_transactions date
14
+ raise "could not download campaign finance transactions" if export_page.nil?
15
+ File.open(filename, 'wb') {|f| f.write(export_page.body) } if export_page
16
+
17
+ puts "saved transactions for #{date.strftime("%Y-%m-%d")} to #{filename}"
18
+ end
19
+
20
+ private
21
+ def download_campaign_finance_transactions date
22
+ set_agent
23
+ export_page = nil
24
+
25
+ @agent.get("#{@base_url}/orestar/gotoPublicTransactionSearch.do") do |search_page|
26
+ search_page.form_with(name: 'cneSearchForm') do |form|
27
+ form.cneSearchTranFiledStartDate = date.strftime("%m/%d/%Y")
28
+ form.cneSearchTranFiledEndDate = date.strftime("%m/%d/%Y")
29
+
30
+ @results_page = @agent.submit(form, form.button_with(value: "Search"))
31
+ if link = @results_page.link_with(text: "Export To Excel Format")
32
+ export_page = @agent.click(link)
33
+ end
34
+ end
35
+ end
36
+
37
+ return export_page
38
+ end
39
+
40
+ def set_source_xls_file_and_downloaded_at body, filename
41
+ file = StringIO.new(body)
42
+ end
43
+
44
+ def parse_date source
45
+ return nil if source.to_s.strip.empty?
46
+ Date.strptime(source, '%m/%d/%Y')
47
+ end
48
+
49
+ def uri_path attachment
50
+ return nil unless attachment.exists?
51
+ case attachment.options[:storage]
52
+ when :filesystem
53
+ attachment.path
54
+ when :s3
55
+ attachment.url(:original, timestamp: false)
56
+ else
57
+ raise 'unsupported paperclip storage'
58
+ end
59
+ end
60
+
61
+ def set_agent
62
+ @agent = Mechanize.new
63
+ @agent.user_agent_alias = 'Mac Safari'#'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36' # Wikipedia blocks "mechanize"
64
+ @agent.log = Logger.new(STDOUT) if @verbose
65
+
66
+ @history = @agent.history
67
+ @base_url = URI 'https://secure.sos.state.or.us'
68
+ end
69
+ end
data/lib/orsos.rb ADDED
@@ -0,0 +1,5 @@
1
+ require_relative "./orsos/version"
2
+ require_relative "./orsos/command"
3
+
4
+ module Orsos
5
+ end
data/orsos.gemspec ADDED
@@ -0,0 +1,26 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'orsos/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "orsos"
8
+ spec.version = Orsos::VERSION
9
+ spec.authors = ["Jonathan Chang"]
10
+ spec.email = ["jonathan.chang@silverpond.com.au"]
11
+ spec.summary = %q{Oregon Secretary of State website (http://sos.oregon.gov/Pages/default.aspx) scraper}
12
+ spec.description = %q{A command line tool to download data from the Oregon Secretary of State website (http://sos.oregon.gov/Pages/default.aspx). Uses mechanize gem to post search requests to the website and download excel files.}
13
+ spec.homepage = "https://github.com/jonochang/orsos"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_development_dependency "bundler", "~> 1.6"
22
+ spec.add_development_dependency "rake"
23
+ spec.add_development_dependency "mechanize"
24
+ spec.add_development_dependency "thor"
25
+ spec.add_development_dependency "rest_client", "~> 1.7.3"
26
+ end
data/orsos.rb ADDED
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env ruby
2
+ require "rubygems" # ruby1.9 doesn't "require" it though
3
+ require "thor"
4
+
5
+ class MyThorCommand < Thor
6
+ desc "foo", "Prints foo"
7
+ def foo
8
+ puts "foo"
9
+ end
10
+ end
11
+
12
+ MyThorCommand.start
metadata ADDED
@@ -0,0 +1,135 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: orsos
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Jonathan Chang
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-10-22 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.6'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.6'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: mechanize
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: thor
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: rest_client
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: 1.7.3
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: 1.7.3
83
+ description: A command line tool to download data from the Oregon Secretary of State
84
+ website (http://sos.oregon.gov/Pages/default.aspx). Uses mechanize gem to post search
85
+ requests to the website and download excel files.
86
+ email:
87
+ - jonathan.chang@silverpond.com.au
88
+ executables:
89
+ - orsos
90
+ extensions: []
91
+ extra_rdoc_files: []
92
+ files:
93
+ - ".gitignore"
94
+ - ".ruby-gemset"
95
+ - ".ruby-version"
96
+ - Gemfile
97
+ - Gemfile.lock
98
+ - LICENSE.txt
99
+ - README.md
100
+ - Rakefile
101
+ - bin/orsos
102
+ - lib/orsos.rb
103
+ - lib/orsos/command.rb
104
+ - lib/orsos/commands/api.rb
105
+ - lib/orsos/commands/get.rb
106
+ - lib/orsos/version.rb
107
+ - lib/orsos/webdownloader.rb
108
+ - orsos.gemspec
109
+ - orsos.rb
110
+ homepage: https://github.com/jonochang/orsos
111
+ licenses:
112
+ - MIT
113
+ metadata: {}
114
+ post_install_message:
115
+ rdoc_options: []
116
+ require_paths:
117
+ - lib
118
+ required_ruby_version: !ruby/object:Gem::Requirement
119
+ requirements:
120
+ - - ">="
121
+ - !ruby/object:Gem::Version
122
+ version: '0'
123
+ required_rubygems_version: !ruby/object:Gem::Requirement
124
+ requirements:
125
+ - - ">="
126
+ - !ruby/object:Gem::Version
127
+ version: '0'
128
+ requirements: []
129
+ rubyforge_project:
130
+ rubygems_version: 2.2.2
131
+ signing_key:
132
+ specification_version: 4
133
+ summary: Oregon Secretary of State website (http://sos.oregon.gov/Pages/default.aspx)
134
+ scraper
135
+ test_files: []