atheme 0.0.4 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/.gitignore +0 -1
  5. data/LICENSE.txt +1 -1
  6. data/README.md +17 -5
  7. data/Rakefile +5 -0
  8. data/atheme.gemspec +3 -1
  9. data/lib/atheme.rb +15 -3
  10. data/lib/atheme/configuration.rb +16 -4
  11. data/lib/atheme/errors.rb +2 -2
  12. data/lib/atheme/parser.rb +47 -0
  13. data/lib/atheme/parser_helper.rb +5 -0
  14. data/lib/atheme/parsers/chanserv.rb +15 -0
  15. data/lib/atheme/service.rb +30 -2
  16. data/lib/atheme/support.rb +14 -0
  17. data/lib/atheme/version.rb +1 -1
  18. data/spec/config.yml +9 -0
  19. data/spec/lib/authenticate_spec.rb +12 -6
  20. data/spec/lib/configuration_spec.rb +4 -4
  21. data/spec/lib/parser_spec.rb +53 -0
  22. data/spec/lib/parsers/chanserv_spec.rb +25 -0
  23. data/spec/lib/service_spec.rb +16 -2
  24. data/spec/spec_helper.rb +15 -10
  25. data/spec/vcr_cassettes/authenticate_error.yml +43 -0
  26. data/spec/vcr_cassettes/authenticate_success.yml +40 -0
  27. data/spec/vcr_cassettes/bad_service_command.yml +43 -0
  28. data/spec/vcr_cassettes/chanserv_help.yml +70 -0
  29. data/spec/vcr_cassettes/chanserv_info.yml +44 -0
  30. metadata +51 -18
  31. metadata.gz.sig +0 -0
  32. data/lib/atheme/services/alis.rb +0 -2
  33. data/lib/atheme/services/chanserv.rb +0 -2
  34. data/lib/atheme/services/gameserv.rb +0 -2
  35. data/lib/atheme/services/global.rb +0 -2
  36. data/lib/atheme/services/groupserv.rb +0 -2
  37. data/lib/atheme/services/helpserv.rb +0 -2
  38. data/lib/atheme/services/hostserv.rb +0 -2
  39. data/lib/atheme/services/infoserv.rb +0 -2
  40. data/lib/atheme/services/memoserv.rb +0 -2
  41. data/lib/atheme/services/nickserv.rb +0 -2
  42. data/lib/atheme/services/operserv.rb +0 -2
  43. data/lib/atheme/services/rpgserv.rb +0 -2
  44. data/lib/atheme/services/statserv.rb +0 -2
  45. data/spec/config.yml.example +0 -10
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1ef808aa81937926711c9c9222cfbaf6ededde5c
4
- data.tar.gz: 2c0801d9b8f22cb983553d044223a95865a267c2
3
+ metadata.gz: f2998dc6b7bb543e351d32b16752b46209b48d68
4
+ data.tar.gz: 2c22e7cb236a49f1d3806fee16d2cec721643dad
5
5
  SHA512:
6
- metadata.gz: 4b407ac82837f0a9415a9f935690cbb4e3adecafa8c72dc6d61cd77ae1c175c7e4811979353f2b855afef6e15ec0fb6f730278cf06ff59ba2d075893b0941771
7
- data.tar.gz: cd978456efc0e66bda28bb1ea4ca8403554966c5e7655e9f24819aedef1b3590da3f9b9f7d8528f71396981853398f68dcf462af1c14fcea14bfaec1cca13cdc
6
+ metadata.gz: c640de4939bb35e70df70830a32ae4a650ed63d8f1502d77f1bd09d77745cbd17a3d230a39d5e2a5cf3868aed654bcd203da9d74858d694707d15fcff899bea4
7
+ data.tar.gz: d9638c291948f850680a300b033c88b97dbeae62d429d941b4d3fe52b54fd8a56a4dd19322f2b08722c20f3a81b696e9a0488446f170b6a26a46b74f9287826d
Binary file
data.tar.gz.sig CHANGED
Binary file
data/.gitignore CHANGED
@@ -15,4 +15,3 @@ spec/reports
15
15
  test/tmp
16
16
  test/version_tmp
17
17
  tmp
18
- spec/config.yml
@@ -1,4 +1,4 @@
1
- Copyright (c) 2013 James Newton and Robert Babcock
1
+ Copyright (c) 2013 James Newton <james@Zaphyous.com>
2
2
 
3
3
  MIT License
4
4
 
data/README.md CHANGED
@@ -27,10 +27,7 @@ You need to be using [Atheme IRC Services](http://www.atheme.net) with httpd and
27
27
  ### Configuration
28
28
 
29
29
  ```ruby
30
- Atheme.configure do |config|
31
- config.hostname = 'example.com'
32
- config.port = 9876
33
- end
30
+ Atheme.configure hostname: 'example.com', port: 1234, protocol: 'http'
34
31
  ```
35
32
 
36
33
  Optional: `protocol` (default http)
@@ -54,7 +51,22 @@ Any command can be used that the user has access to use.
54
51
 
55
52
  Command format: `Atheme::ServiceName.command 'param', 'param', ...`
56
53
 
57
- To see services supported [go here](https://github.com/zaphyous/atheme-ruby/tree/develop/lib/atheme/services).
54
+ To see supported services [go here](https://github.com/zaphyous/atheme-ruby/blob/feature/chanserv_methods/lib/atheme.rb#L21).
55
+
56
+ If you use a custom service you can create a class like so:
57
+
58
+ ```ruby
59
+ class Atheme::ServiceName < Atheme::Service
60
+ end
61
+ ```
62
+
63
+ Each command will return an object of the `Atheme::Service` that is used. All will always have `#to_raw` that has the raw services output.
64
+
65
+ Some commands will return an object with additional methods on them depending if a parser exists for that command. [Parsers can be seen here](https://github.com/zaphyous/atheme-ruby/tree/develop/lib/atheme/parsers)
66
+
67
+ ## Testing
68
+
69
+ In order to be able to generate VCR cassettes properly when testing (minus those that already exist!) you must run a local IRC server with Atheme with httpd and XMLRPC enabled (listening on `localhost:1234`).
58
70
 
59
71
  ## Contributing
60
72
 
data/Rakefile CHANGED
@@ -1 +1,6 @@
1
1
  require 'bundler/gem_tasks'
2
+ require 'rspec/core/rake_task'
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task default: :spec
@@ -10,7 +10,7 @@ Gem::Specification.new do |spec|
10
10
  spec.email = ['james@Zaphyous.com', 'robert@Zaphyous.com']
11
11
  spec.description = %q{A ruby wrapper around the Atheme IRC Services XMLRPC interface}
12
12
  spec.summary = %q{atheme-ruby is an easy way to integrate your ruby application with the Atheme IRC Services XMLRPC interface}
13
- spec.homepage = 'https://github.com/zaphyous/atheme'
13
+ spec.homepage = 'https://github.com/zaphyous/atheme-ruby'
14
14
  spec.license = 'MIT'
15
15
 
16
16
  spec.files = `git ls-files`.split($/)
@@ -24,4 +24,6 @@ Gem::Specification.new do |spec|
24
24
  spec.add_development_dependency 'guard-rspec'
25
25
  spec.add_development_dependency 'pry'
26
26
  spec.add_development_dependency 'rb-fsevent'
27
+ spec.add_development_dependency 'vcr'
28
+ spec.add_development_dependency 'webmock'
27
29
  end
@@ -1,5 +1,6 @@
1
1
  module Atheme
2
2
  SERVICES = []
3
+ PARSERS = {}
3
4
  end
4
5
 
5
6
  require 'xmlrpc/client'
@@ -7,17 +8,28 @@ require 'atheme/version'
7
8
  require 'atheme/errors'
8
9
  require 'atheme/configuration'
9
10
  require 'atheme/authenticate'
10
- require 'atheme/service'
11
11
  require 'atheme/objectified_hash'
12
+ require 'atheme/support'
13
+ require 'atheme/parser'
14
+ require 'atheme/parser_helper'
15
+
16
+ Dir[File.expand_path('../atheme/parsers/*.rb', __FILE__)].each { |file| require file }
12
17
 
13
- Dir[File.expand_path('../atheme/services/*.rb', __FILE__)].each { |file| require file }
18
+ require 'atheme/service'
14
19
 
15
20
  module Atheme
16
21
  extend Configuration
17
22
  extend Authenticate
18
23
 
24
+ %w(ALIS ChanServ GameServ Global GroupServ HelpServ HostServ InfoServ MemoServ NickServ OperServ RPGServ StatServ).each do |name|
25
+ module_eval <<-RUBY
26
+ class Atheme::#{name} < Atheme::Service
27
+ end
28
+ RUBY
29
+ end
30
+
19
31
  def self.server
20
- XMLRPC::Client.new2("#{Atheme.protocol}://#{Atheme.hostname}:#{Atheme.port}/xmlrpc")
32
+ XMLRPC::Client.new2("#{Atheme.options.protocol}://#{Atheme.options.hostname}:#{Atheme.options.port}/xmlrpc")
21
33
  end
22
34
 
23
35
  def self.call(*args)
@@ -1,9 +1,21 @@
1
1
  module Atheme::Configuration
2
- attr_accessor :hostname, :port, :protocol
2
+ REQUIRED_OPTIONS = [:hostname, :port]
3
3
 
4
- def configure
5
- self.protocol ||= 'http'
4
+ def configure(opts = {})
5
+ unless validate_options(opts)
6
+ raise Atheme::Error::InvalidConfiguration, "Missing configuration options: #{REQUIRED_OPTIONS.delete_if { |x| opts.has_key?(x) }.join(', ')}"
7
+ end
6
8
 
7
- yield self
9
+ opts[:protocol] ||= 'http'
10
+
11
+ @options = opts
12
+ end
13
+
14
+ def options
15
+ Atheme::ObjectifiedHash.new(@options)
16
+ end
17
+
18
+ def validate_options(opts)
19
+ REQUIRED_OPTIONS.delete_if { |x| opts.has_key?(x) }.count == 0
8
20
  end
9
21
  end
@@ -1,4 +1,4 @@
1
1
  module Atheme::Error
2
- class NoUserSet < StandardError
3
- end
2
+ class InvalidUser < StandardError; end
3
+ class InvalidConfiguration < StandardError; end
4
4
  end
@@ -0,0 +1,47 @@
1
+ module Atheme::Parser
2
+ def self.included(klass)
3
+ if klass.name.split('::').count > 3
4
+ service = klass.name.sub('Atheme::Parser::', '').gsub(/::.*/, '')
5
+ command = klass.name.sub('Atheme::Parser::', '').gsub(/.*::/, '').downcase
6
+
7
+ Atheme::PARSERS[service] ||= []
8
+
9
+ (Atheme::PARSERS[service] << command) unless command == ''
10
+
11
+ Atheme::PARSERS[service].uniq!
12
+ end
13
+ end
14
+
15
+ def command(name, &block)
16
+ @commands << [name, block]
17
+ end
18
+
19
+ def parse(name)
20
+ @commands = []
21
+
22
+ create_parser(name)
23
+
24
+ yield if block_given?
25
+
26
+ create_commands if @commands.count > 0
27
+ end
28
+
29
+ private
30
+
31
+ def create_parser(name)
32
+ @parser = "Atheme::Parser::#{self.name.gsub('Atheme::Parser::', '')}::#{name.capitalize}"
33
+
34
+ module_eval <<-RUBY
35
+ module #{@parser}
36
+ include Atheme::Parser
37
+ include Atheme::ParserHelper
38
+ end
39
+ RUBY
40
+ end
41
+
42
+ def create_commands
43
+ @commands.each do |command, block|
44
+ Atheme::Support.constantize(@parser).send(:define_method, command, block)
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,5 @@
1
+ module Atheme::ParserHelper
2
+ def match(expression)
3
+ expression.match(raw_services_output)[1]
4
+ end
5
+ end
@@ -0,0 +1,15 @@
1
+ module Atheme::Parser::ChanServ
2
+ extend Atheme::Parser
3
+
4
+ parse :info do
5
+ command(:founder) { match(/Founder\s+:\s+(\w+)/) }
6
+
7
+ command :registered do
8
+ Date.parse(match(/Registered\s+:\s+(\w+ [0-9]{2} [0-9(:?)]+ [0-9]{4})/)).to_time
9
+ end
10
+
11
+ command :successor do
12
+ raw_services_output.match(/Successor\s+:\s+\(none\)/) ? nil : match(/Successor\s+:\s+(\w+)/)
13
+ end
14
+ end
15
+ end
@@ -1,11 +1,39 @@
1
1
  class Atheme::Service
2
+ attr_reader :raw_services_output
3
+
4
+ def initialize(output)
5
+ @raw_services_output = output
6
+ end
7
+
2
8
  def self.inherited(klass)
3
9
  Atheme::SERVICES << klass.name.gsub('Atheme::', '')
4
10
  end
5
11
 
12
+ def self.create_service_object(method, service, atheme_data)
13
+ if parser_for?(service, method)
14
+ parser = Atheme::Support.constantize("Atheme::Parser::#{service}::#{method.capitalize}")
15
+
16
+ self.new(atheme_data).extend(parser)
17
+ else
18
+ self.new(atheme_data)
19
+ end
20
+ end
21
+
6
22
  def self.method_missing(method, *args, &block)
7
- raise Atheme::Error::NoUserSet, 'No user has been set' if Atheme.user.nil?
23
+ raise Atheme::Error::InvalidUser, 'No user has been set' if Atheme.user.nil?
24
+
25
+ service = self.name.gsub('Atheme::', '')
26
+
27
+ self.create_service_object(method, service, Atheme.call('atheme.command',
28
+ Atheme.user.cookie, Atheme.user.username, Atheme.user.ip,
29
+ service, method, *args))
30
+ end
8
31
 
9
- Atheme.call('atheme.command', Atheme.user.cookie, Atheme.user.username, Atheme.user.ip, self.name.gsub('Atheme::', ''), method, *args)
32
+ def self.parser_for?(service, command)
33
+ if Atheme::PARSERS.include?(service)
34
+ Atheme::PARSERS[service].include?(command.to_s)
35
+ else
36
+ false
37
+ end
10
38
  end
11
39
  end
@@ -0,0 +1,14 @@
1
+ module Atheme::Support
2
+ def self.constantize(camel_cased_word)
3
+ names = camel_cased_word.split('::')
4
+ names.shift if names.empty? || names.first.empty?
5
+
6
+ constant = Object
7
+
8
+ names.each do |name|
9
+ constant = constant.const_defined?(name) ? constant.const_get(name) : constant.const_missing(name)
10
+ end
11
+
12
+ constant
13
+ end
14
+ end
@@ -1,3 +1,3 @@
1
1
  module Atheme
2
- VERSION = '0.0.4'
2
+ VERSION = '0.1.0'
3
3
  end
@@ -0,0 +1,9 @@
1
+ hostname: localhost
2
+ port: 1234
3
+ protocol: http
4
+
5
+ nick: username
6
+ password: password
7
+ ip: 127.0.0.1
8
+
9
+ channel: '#channel'
@@ -2,19 +2,25 @@ require 'spec_helper'
2
2
 
3
3
  describe Atheme::Authenticate do
4
4
  it 'should get a cookie when logging in' do
5
- expect(Atheme.login(atheme_config['nick'], atheme_config['password'])).to match(/([a-z]){20}/)
5
+ VCR.use_cassette('authenticate_success') do
6
+ expect(Atheme.login(atheme_config['nick'], atheme_config['password'])).to match(/([a-z]){20}/)
7
+ end
6
8
  end
7
9
 
8
10
  it 'should get a XMLRPC::FaultException when incorrect login information is provided' do
9
- expect { Atheme.login(atheme_config['nick'], 'bad-password') }.to raise_error XMLRPC::FaultException
11
+ VCR.use_cassette('authenticate_error') do
12
+ expect { Atheme.login(atheme_config['nick'], 'bad-password') }.to raise_error XMLRPC::FaultException
13
+ end
10
14
  end
11
15
 
12
16
  it 'should remember a user when set' do
13
- cookie = Atheme.login(atheme_config['nick'], atheme_config['password'])
17
+ VCR.use_cassette('authenticate_success') do
18
+ cookie = Atheme.login(atheme_config['nick'], atheme_config['password'])
14
19
 
15
- Atheme.set_user(cookie, atheme_config['nick'], atheme_config['ip'])
20
+ Atheme.set_user(cookie, atheme_config['nick'], atheme_config['ip'])
16
21
 
17
- expect(Atheme.user.cookie).to eql cookie
18
- expect(Atheme.user.username).to eql atheme_config['nick']
22
+ expect(Atheme.user.cookie).to eql cookie
23
+ expect(Atheme.user.username).to eql atheme_config['nick']
24
+ end
19
25
  end
20
26
  end
@@ -2,14 +2,14 @@ require 'spec_helper'
2
2
 
3
3
  describe Atheme::Configuration do
4
4
  it 'should have a port' do
5
- expect(Atheme.port).to eql atheme_config['port']
5
+ expect(Atheme.options.port).to eql 1234
6
6
  end
7
7
 
8
- it 'should have a url' do
9
- expect(Atheme.hostname).to eql atheme_config['hostname']
8
+ it 'should have a hostname' do
9
+ expect(Atheme.options.hostname).to eql 'localhost'
10
10
  end
11
11
 
12
12
  it 'should have a protocol' do
13
- expect(Atheme.protocol).to eql atheme_config['protocol']
13
+ expect(Atheme.options.protocol).to eql 'http'
14
14
  end
15
15
  end
@@ -0,0 +1,53 @@
1
+ require 'spec_helper'
2
+
3
+ describe Atheme::Parser do
4
+ before do
5
+ module Atheme::Parser::ChanServ
6
+ extend Atheme::Parser
7
+ end
8
+ end
9
+
10
+ context '#parse' do
11
+ module Atheme::Parser::ChanServ
12
+ parse :info
13
+ end
14
+
15
+ it 'should create a parser module' do
16
+ expect(Atheme::Parser::ChanServ::Info).to be_true
17
+ end
18
+
19
+ it 'should create multiple parser modules' do
20
+ module Atheme::Parser::ChanServ
21
+ parse :help
22
+ end
23
+
24
+ expect(Atheme::Parser::ChanServ::Info).to be_true
25
+ expect(Atheme::Parser::ChanServ::Help).to be_true
26
+ end
27
+ end
28
+
29
+ context '#command' do
30
+ module Atheme::Parser::ChanServ
31
+ parse :info do
32
+ command(:one) { 'one' }
33
+ end
34
+ end
35
+
36
+ it 'should create a method on the parser' do
37
+ expect(Atheme::Parser::ChanServ::Info.method_defined?(:one)).to be_true
38
+ end
39
+
40
+ it 'should create multiple methods on the parser' do
41
+ module Atheme::Parser::ChanServ
42
+ parse :help do
43
+ command(:one) { 'one' }
44
+ command(:two) { 'two' }
45
+ end
46
+ end
47
+
48
+ [:one, :two].each do |method|
49
+ expect(Atheme::Parser::ChanServ::Help.method_defined?(method)).to be_true
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,25 @@
1
+ require 'spec_helper'
2
+
3
+ describe Atheme::Parser::ChanServ do
4
+ context '.info' do
5
+ before { authenticate }
6
+
7
+ let(:info) do
8
+ VCR.use_cassette('chanserv_info') do
9
+ Atheme::ChanServ.info atheme_config['channel']
10
+ end
11
+ end
12
+
13
+ it 'has a founder' do
14
+ expect(info.founder).to eql atheme_config['nick']
15
+ end
16
+
17
+ it 'has a successor' do
18
+ expect(info.successor).to eql 'username_'
19
+ end
20
+
21
+ it 'should have a registered date' do
22
+ expect(info.registered).to eql Date.parse('2013-02-08').to_time
23
+ end
24
+ end
25
+ end
@@ -8,12 +8,26 @@ describe 'Atheme::Service' do
8
8
  it 'should be able to query services' do
9
9
  authenticate
10
10
 
11
- expect(Atheme::ChanServ.help).to be_true
11
+ VCR.use_cassette('chanserv_help') do
12
+ expect(Atheme::ChanServ.help).to be_true
13
+ end
14
+ end
15
+
16
+ it 'should error when an invalid services command is used' do
17
+ VCR.use_cassette('bad_service_command') do
18
+ expect{ Atheme::ChanServ.bad_method }.to raise_error XMLRPC::FaultException
19
+ end
20
+ end
21
+
22
+ it 'should have raw xmlrpc output in to_raw' do
23
+ VCR.use_cassette('chanserv_help') do
24
+ expect(Atheme::ChanServ.help.raw_services_output).to include('***** ChanServ Help *****')
25
+ end
12
26
  end
13
27
 
14
28
  it 'should raise an error when no user is set' do
15
29
  Atheme.user = nil
16
30
 
17
- expect { Atheme::ChanServ.help }.to raise_error Atheme::Error::NoUserSet
31
+ expect { Atheme::ChanServ.help }.to raise_error Atheme::Error::InvalidUser
18
32
  end
19
33
  end
@@ -1,6 +1,8 @@
1
1
  require 'rspec'
2
2
  require 'pry'
3
3
  require 'atheme'
4
+ require 'vcr'
5
+ require 'webmock/rspec'
4
6
 
5
7
  Dir[File.expand_path('../support/**/*.rb', __FILE__)].each { |file| require file }
6
8
 
@@ -9,19 +11,22 @@ def atheme_config
9
11
  end
10
12
 
11
13
  def configure_atheme
12
- Atheme.configure do |config|
13
- config.port = atheme_config['port']
14
- config.hostname = atheme_config['hostname']
15
- config.protocol = atheme_config['protocol']
16
- end
14
+ Atheme.configure port: 1234, hostname: 'localhost'
17
15
  end
18
16
 
19
- def authenticate
20
- cookie = Atheme.login(atheme_config['nick'], atheme_config['password'])
17
+ RSpec.configure do |config|
18
+ config.before { configure_atheme }
19
+ end
21
20
 
22
- Atheme.set_user(cookie, atheme_config['nick'], atheme_config['ip'])
21
+ VCR.configure do |config|
22
+ config.cassette_library_dir = 'spec/vcr_cassettes'
23
+ config.hook_into :webmock
23
24
  end
24
25
 
25
- RSpec.configure do |config|
26
- config.before(:each) { configure_atheme }
26
+ def authenticate
27
+ VCR.use_cassette('authenticate_success') do
28
+ cookie = Atheme.login(atheme_config['nick'], atheme_config['password'])
29
+
30
+ Atheme.set_user(cookie, atheme_config['nick'], atheme_config['ip'])
31
+ end
27
32
  end
@@ -0,0 +1,43 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: http://localhost:1234/xmlrpc
6
+ body:
7
+ encoding: UTF-8
8
+ string: |
9
+ <?xml version="1.0" ?><methodCall><methodName>atheme.login</methodName><params><param><value><string>username</string></value></param><param><value><string>bad-password</string></value></param></params></methodCall>
10
+ headers:
11
+ User-Agent:
12
+ - XMLRPC::Client (Ruby 2.0.0)
13
+ Content-Type:
14
+ - text/xml; charset=utf-8
15
+ Content-Length:
16
+ - '214'
17
+ Connection:
18
+ - keep-alive
19
+ Accept-Encoding:
20
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
21
+ Accept:
22
+ - '*/*'
23
+ response:
24
+ status:
25
+ code: 200
26
+ message: OK
27
+ headers:
28
+ Server:
29
+ - Atheme/7.0.5
30
+ Content-Type:
31
+ - text/xml
32
+ Content-Length:
33
+ - '363'
34
+ body:
35
+ encoding: UTF-8
36
+ string: "<?xml version=\"1.0\"?>\r\n<methodResponse>\r\n <fault>\r\n <value>\r\n
37
+ \ <struct>\r\n <member>\r\n <name>faultCode</name>\r\n <value><int>5</int></value>\r\n
38
+ \ </member>\r\n <member>\r\n <name>faultString</name>\r\n <value><string>The
39
+ password is not valid for this account.</string></value>\r\n </member>\r\n
40
+ \ </struct>\r\n </value>\r\n </fault>\r\n</methodResponse>"
41
+ http_version:
42
+ recorded_at: Thu, 11 Apr 2013 07:09:35 GMT
43
+ recorded_with: VCR 2.4.0
@@ -0,0 +1,40 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: http://localhost:1234/xmlrpc
6
+ body:
7
+ encoding: UTF-8
8
+ string: |
9
+ <?xml version="1.0" ?><methodCall><methodName>atheme.login</methodName><params><param><value><string>username</string></value></param><param><value><string>password</string></value></param></params></methodCall>
10
+ headers:
11
+ User-Agent:
12
+ - XMLRPC::Client (Ruby 2.0.0)
13
+ Content-Type:
14
+ - text/xml; charset=utf-8
15
+ Content-Length:
16
+ - '212'
17
+ Connection:
18
+ - keep-alive
19
+ Accept-Encoding:
20
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
21
+ Accept:
22
+ - '*/*'
23
+ response:
24
+ status:
25
+ code: 200
26
+ message: OK
27
+ headers:
28
+ Server:
29
+ - Atheme/7.0.5
30
+ Content-Type:
31
+ - text/xml
32
+ Content-Length:
33
+ - '165'
34
+ body:
35
+ encoding: UTF-8
36
+ string: "<?xml version=\"1.0\"?>\r\n<methodResponse>\r\n<params>\r\n <param>\r\n
37
+ \ <value>\r\n <string>qiyrmryiqqdrqqtswqnk</string>\r\n </value>\r\n </param>\r\n</params>\r\n</methodResponse>"
38
+ http_version:
39
+ recorded_at: Thu, 11 Apr 2013 07:08:42 GMT
40
+ recorded_with: VCR 2.4.0
@@ -0,0 +1,43 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: http://localhost:1234/xmlrpc
6
+ body:
7
+ encoding: UTF-8
8
+ string: |
9
+ <?xml version="1.0" ?><methodCall><methodName>atheme.command</methodName><params><param><value><string>qiyrmryiqqdrqqtswqnk</string></value></param><param><value><string>username</string></value></param><param><value><string>127.0.0.1</string></value></param><param><value><string>ChanServ</string></value></param><param><value><string>bad_method</string></value></param></params></methodCall>
10
+ headers:
11
+ User-Agent:
12
+ - XMLRPC::Client (Ruby 2.0.0)
13
+ Content-Type:
14
+ - text/xml; charset=utf-8
15
+ Content-Length:
16
+ - '392'
17
+ Connection:
18
+ - keep-alive
19
+ Accept-Encoding:
20
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
21
+ Accept:
22
+ - '*/*'
23
+ response:
24
+ status:
25
+ code: 200
26
+ message: OK
27
+ headers:
28
+ Server:
29
+ - Atheme/7.0.5
30
+ Content-Type:
31
+ - text/xml
32
+ Content-Length:
33
+ - '341'
34
+ body:
35
+ encoding: UTF-8
36
+ string: "<?xml version=\"1.0\"?>\r\n<methodResponse>\r\n <fault>\r\n <value>\r\n
37
+ \ <struct>\r\n <member>\r\n <name>faultCode</name>\r\n <value><int>3</int></value>\r\n
38
+ \ </member>\r\n <member>\r\n <name>faultString</name>\r\n <value><string>Invalid
39
+ command name.</string></value>\r\n </member>\r\n </struct>\r\n </value>\r\n
40
+ </fault>\r\n</methodResponse>"
41
+ http_version:
42
+ recorded_at: Thu, 11 Apr 2013 07:11:24 GMT
43
+ recorded_with: VCR 2.4.0
@@ -0,0 +1,70 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: http://localhost:1234/xmlrpc
6
+ body:
7
+ encoding: UTF-8
8
+ string: |
9
+ <?xml version="1.0" ?><methodCall><methodName>atheme.command</methodName><params><param><value><string>qiyrmryiqqdrqqtswqnk</string></value></param><param><value><string>username</string></value></param><param><value><string>127.0.0.1</string></value></param><param><value><string>ChanServ</string></value></param><param><value><string>help</string></value></param></params></methodCall>
10
+ headers:
11
+ User-Agent:
12
+ - XMLRPC::Client (Ruby 2.0.0)
13
+ Content-Type:
14
+ - text/xml; charset=utf-8
15
+ Content-Length:
16
+ - '386'
17
+ Connection:
18
+ - keep-alive
19
+ Accept-Encoding:
20
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
21
+ Accept:
22
+ - '*/*'
23
+ response:
24
+ status:
25
+ code: 200
26
+ message: OK
27
+ headers:
28
+ Server:
29
+ - Atheme/7.0.5
30
+ Content-Type:
31
+ - text/xml
32
+ Content-Length:
33
+ - '2460'
34
+ body:
35
+ encoding: UTF-8
36
+ string: "<?xml version=\"1.0\"?>\r\n<methodResponse>\r\n<params>\r\n <param>\r\n
37
+ \ <value>\r\n <string>***** ChanServ Help *****\nChanServ gives normal users
38
+ the ability to maintain controlof a channel, without the need of a bot. Channel
39
+ takeovers arevirtually impossible when a channel is registered with ChanServ.Registration
40
+ is a quick and painless process. Once registered,the founder can maintain
41
+ complete and total control over the channel.\nPlease note that channels will
42
+ expire after 30 days of inactivity,or if there are no eligible channel successors.Activity
43
+ is defined as a user with one of +FORforsv being on the channel.\nSuccessors
44
+ are primarily those who have the +R flagset on their account in the channel,
45
+ although otherpeople may be chosen depending on their accesslevel and activity.\n
46
+ \nCommands can also be given on channel by prefixing one of '.'and omitting
47
+ the channel name. These are called &quot;fantasy&quot;commands and can also
48
+ be disabled on a per-channel basis.\n \nFor more information on a command,
49
+ type:\n/msg ChanServ help &lt;command&gt;\nFor a verbose listing of all commands,
50
+ type:\n/msg ChanServ help commands\n \nThe following commands are available:\nCLOSE
51
+ \ Closes a channel.\nFDROP Forces dropping of a channel
52
+ registration.\nFFLAGS Forces a flags change on a channel.\nFLAGS
53
+ \ Manipulates specific permissions on a channel.\nFTRANSFER Forces
54
+ foundership transfer of a channel.\nINVITE Invites you to a channel.\nOP
55
+ \ Gives channel ops to a user.\nRECOVER Regain control
56
+ of your channel.\nREGISTER Registers a channel.\nSET Sets
57
+ various control flags.\nUNBAN Removes a ban on a channel.\n \nOther
58
+ commands: ACCESS, ACTIVATE, AKICK, BADWORDS, BAN, \n CALC,
59
+ CLEAR, CLONE, COUNT, DEOP, DEVOICE, \n DF, DOWN, DROP, EIGHTBALL,
60
+ FREGISTER, GETKEY, \n HELP, HOLD, INFO, KICK, KICKBAN, LIST,
61
+ LOTTERY, \n MARK, NAMEGEN, NWOD, PING, QUIET, REJECT, \n ROLE,
62
+ ROLL, ROULETTE, RPS, STATUS, SYNC, \n TAXONOMY, TEMPLATE, TOPIC,
63
+ TOPICAPPEND, \n TOPICPREPEND, UNQUIET, UP, USERINFO, VOICE,
64
+ \n WAITING, WHY, WOD\n***** End of Help *****\nIf you're having
65
+ trouble or you need some additional help, you may want to join the help channel
66
+ #help or visit the help webpage http://www.stack.nl/~jilles/irc/atheme-help/</string>\r\n
67
+ \ </value>\r\n </param>\r\n</params>\r\n</methodResponse>"
68
+ http_version:
69
+ recorded_at: Thu, 11 Apr 2013 07:08:42 GMT
70
+ recorded_with: VCR 2.4.0
@@ -0,0 +1,44 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: http://localhost:1234/xmlrpc
6
+ body:
7
+ encoding: UTF-8
8
+ string: |
9
+ <?xml version="1.0" ?><methodCall><methodName>atheme.command</methodName><params><param><value><string>qiyrmryiqqdrqqtswqnk</string></value></param><param><value><string>username</string></value></param><param><value><string>127.0.0.1</string></value></param><param><value><string>ChanServ</string></value></param><param><value><string>info</string></value></param><param><value><string>#channel</string></value></param></params></methodCall>
10
+ headers:
11
+ User-Agent:
12
+ - XMLRPC::Client (Ruby 2.0.0)
13
+ Content-Type:
14
+ - text/xml; charset=utf-8
15
+ Content-Length:
16
+ - '442'
17
+ Connection:
18
+ - keep-alive
19
+ Accept-Encoding:
20
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
21
+ Accept:
22
+ - '*/*'
23
+ response:
24
+ status:
25
+ code: 200
26
+ message: OK
27
+ headers:
28
+ Server:
29
+ - Atheme/7.0.5
30
+ Content-Type:
31
+ - text/xml
32
+ Content-Length:
33
+ - '476'
34
+ body:
35
+ encoding: UTF-8
36
+ string: "<?xml version=\"1.0\"?>\r\n<methodResponse>\r\n<params>\r\n <param>\r\n
37
+ \ <value>\r\n <string>Information on #channel:\nFounder : username\nSuccessor
38
+ \ : username_\nRegistered : Feb 08 15:09:32 2013 (8 weeks, 5 days, 08:03:27 ago)\nMode
39
+ lock : +nstr\nURL : http://example.com\nEmail : username@example.com\nFlags
40
+ \ : VERBOSE RESTRICTED KEEPTOPIC TOPICLOCK GUARD FANTASY\nPrefix :
41
+ . (default)\n*** End of Info ***</string>\r\n </value>\r\n </param>\r\n</params>\r\n</methodResponse>"
42
+ http_version:
43
+ recorded_at: Thu, 11 Apr 2013 07:14:07 GMT
44
+ recorded_with: VCR 2.4.0
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: atheme
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - James Newton
@@ -31,7 +31,7 @@ cert_chain:
31
31
  IdasO+EybhhmNT32weebimCM21ychbBqkWzJGPlIfqgvmOMbQc/TwQcwkYPgoX6l
32
32
  QdB79NrQet5m6RR7qA5joVvZhZA=
33
33
  -----END CERTIFICATE-----
34
- date: 2013-04-10 00:00:00.000000000 Z
34
+ date: 2013-05-03 00:00:00.000000000 Z
35
35
  dependencies:
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: bundler
@@ -117,6 +117,34 @@ dependencies:
117
117
  - - '>='
118
118
  - !ruby/object:Gem::Version
119
119
  version: '0'
120
+ - !ruby/object:Gem::Dependency
121
+ name: vcr
122
+ requirement: !ruby/object:Gem::Requirement
123
+ requirements:
124
+ - - '>='
125
+ - !ruby/object:Gem::Version
126
+ version: '0'
127
+ type: :development
128
+ prerelease: false
129
+ version_requirements: !ruby/object:Gem::Requirement
130
+ requirements:
131
+ - - '>='
132
+ - !ruby/object:Gem::Version
133
+ version: '0'
134
+ - !ruby/object:Gem::Dependency
135
+ name: webmock
136
+ requirement: !ruby/object:Gem::Requirement
137
+ requirements:
138
+ - - '>='
139
+ - !ruby/object:Gem::Version
140
+ version: '0'
141
+ type: :development
142
+ prerelease: false
143
+ version_requirements: !ruby/object:Gem::Requirement
144
+ requirements:
145
+ - - '>='
146
+ - !ruby/object:Gem::Version
147
+ version: '0'
120
148
  description: A ruby wrapper around the Atheme IRC Services XMLRPC interface
121
149
  email:
122
150
  - james@Zaphyous.com
@@ -138,27 +166,25 @@ files:
138
166
  - lib/atheme/configuration.rb
139
167
  - lib/atheme/errors.rb
140
168
  - lib/atheme/objectified_hash.rb
169
+ - lib/atheme/parser.rb
170
+ - lib/atheme/parser_helper.rb
171
+ - lib/atheme/parsers/chanserv.rb
141
172
  - lib/atheme/service.rb
142
- - lib/atheme/services/alis.rb
143
- - lib/atheme/services/chanserv.rb
144
- - lib/atheme/services/gameserv.rb
145
- - lib/atheme/services/global.rb
146
- - lib/atheme/services/groupserv.rb
147
- - lib/atheme/services/helpserv.rb
148
- - lib/atheme/services/hostserv.rb
149
- - lib/atheme/services/infoserv.rb
150
- - lib/atheme/services/memoserv.rb
151
- - lib/atheme/services/nickserv.rb
152
- - lib/atheme/services/operserv.rb
153
- - lib/atheme/services/rpgserv.rb
154
- - lib/atheme/services/statserv.rb
173
+ - lib/atheme/support.rb
155
174
  - lib/atheme/version.rb
156
- - spec/config.yml.example
175
+ - spec/config.yml
157
176
  - spec/lib/authenticate_spec.rb
158
177
  - spec/lib/configuration_spec.rb
178
+ - spec/lib/parser_spec.rb
179
+ - spec/lib/parsers/chanserv_spec.rb
159
180
  - spec/lib/service_spec.rb
160
181
  - spec/spec_helper.rb
161
- homepage: https://github.com/zaphyous/atheme
182
+ - spec/vcr_cassettes/authenticate_error.yml
183
+ - spec/vcr_cassettes/authenticate_success.yml
184
+ - spec/vcr_cassettes/bad_service_command.yml
185
+ - spec/vcr_cassettes/chanserv_help.yml
186
+ - spec/vcr_cassettes/chanserv_info.yml
187
+ homepage: https://github.com/zaphyous/atheme-ruby
162
188
  licenses:
163
189
  - MIT
164
190
  metadata: {}
@@ -184,8 +210,15 @@ specification_version: 4
184
210
  summary: atheme-ruby is an easy way to integrate your ruby application with the Atheme
185
211
  IRC Services XMLRPC interface
186
212
  test_files:
187
- - spec/config.yml.example
213
+ - spec/config.yml
188
214
  - spec/lib/authenticate_spec.rb
189
215
  - spec/lib/configuration_spec.rb
216
+ - spec/lib/parser_spec.rb
217
+ - spec/lib/parsers/chanserv_spec.rb
190
218
  - spec/lib/service_spec.rb
191
219
  - spec/spec_helper.rb
220
+ - spec/vcr_cassettes/authenticate_error.yml
221
+ - spec/vcr_cassettes/authenticate_success.yml
222
+ - spec/vcr_cassettes/bad_service_command.yml
223
+ - spec/vcr_cassettes/chanserv_help.yml
224
+ - spec/vcr_cassettes/chanserv_info.yml
metadata.gz.sig CHANGED
Binary file
@@ -1,2 +0,0 @@
1
- class Atheme::ALIS < Atheme::Service
2
- end
@@ -1,2 +0,0 @@
1
- class Atheme::ChanServ < Atheme::Service
2
- end
@@ -1,2 +0,0 @@
1
- class Atheme::GameServ < Atheme::Service
2
- end
@@ -1,2 +0,0 @@
1
- class Atheme::Global < Atheme::Service
2
- end
@@ -1,2 +0,0 @@
1
- class Atheme::GroupServ < Atheme::Service
2
- end
@@ -1,2 +0,0 @@
1
- class Atheme::HelpServ < Atheme::Service
2
- end
@@ -1,2 +0,0 @@
1
- class Atheme::HostServ < Atheme::Service
2
- end
@@ -1,2 +0,0 @@
1
- class Atheme::InfoServ < Atheme::Service
2
- end
@@ -1,2 +0,0 @@
1
- class Atheme::MemoServ < Atheme::Service
2
- end
@@ -1,2 +0,0 @@
1
- class Atheme::NickServ < Atheme::Service
2
- end
@@ -1,2 +0,0 @@
1
- class Atheme::OperServ < Atheme::Service
2
- end
@@ -1,2 +0,0 @@
1
- class Atheme::RPGServ < Atheme::Service
2
- end
@@ -1,2 +0,0 @@
1
- class Atheme::StatServ < Atheme::Service
2
- end
@@ -1,10 +0,0 @@
1
- # Change this to your testing services xmlrpc information
2
-
3
- hostname: example.com
4
- port: 1234
5
- protocol: http
6
-
7
- nick: a_nick_that_exists
8
- password: the_nicks_password
9
- ip: 127.0.0.1
10
-