lyne 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 0dd78c847a8051049b3e0cda371c44c78e3daa15
4
+ data.tar.gz: 4f1ffc77c868c1a57b7e13829571790bbc537da2
5
+ SHA512:
6
+ metadata.gz: 854764cabc0c3902f0407ee1c960da4009979d038399f13bd9ed6def14bd74820aaeabea6132a179ca350e15f31cd2ac117fe4f03d501ca02c27f85a6c3af79e
7
+ data.tar.gz: 90c412f9953f779a40f774864ee422b4c7ab211df1c5941dbf052147552e02553cd4e3216acea5c14ef83e888c7e26f9fa95b832eeb7098abfa527fa17ed8863
data/.gitignore ADDED
@@ -0,0 +1,24 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ .rspec
7
+ Gemfile.lock
8
+ InstalledFiles
9
+ _yardoc
10
+ coverage
11
+ doc/
12
+ lib/bundler/man
13
+ pkg
14
+ rdoc
15
+ spec/reports
16
+ spec/account.yaml
17
+ test/tmp
18
+ test/version_tmp
19
+ tmp
20
+ *.bundle
21
+ *.so
22
+ *.o
23
+ *.a
24
+ mkmf.log
data/Gemfile ADDED
@@ -0,0 +1,10 @@
1
+ source 'https://rubygems.org'
2
+ ruby '2.1.1'
3
+
4
+ # Specify your gem's dependencies in lyne.gemspec
5
+ gemspec
6
+ gem 'nokogiri'
7
+ gem 'poltergeist'
8
+ gem 'capybara'
9
+ gem 'phantomjs'
10
+ gem 'activesupport'
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 soplana
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,58 @@
1
+ # Lyne
2
+ スクエアエニックスが運営するドラゴンクエスト10のメンバーズサイト「冒険者の広場」をスクレイピングするgemです.
3
+
4
+ # install
5
+
6
+ 内部でphantomjsを使ってスクレイピングするためinstallしてください.
7
+
8
+ http://phantomjs.org/download.html
9
+
10
+ ```bash
11
+ # osx
12
+ $ brew update && brew install phantomjs
13
+ ```
14
+
15
+ # use
16
+
17
+ ```bash
18
+ $ gem install Lyne
19
+ ```
20
+ ```
21
+ gem 'lyne'
22
+ ```
23
+
24
+ optionで渡すcharacter_idはキャラクター選択画面の「このキャラを選択」ボタンのrel属性の値になります。
25
+
26
+ ![character_id](http://dl.dropboxusercontent.com/u/92653510/DQ10/charaid.png "character_id")
27
+
28
+ ```ruby
29
+ require 'lyne'
30
+
31
+ dqx = Lyne::Account.new(
32
+ account: 'account_name',
33
+ password: 'account_password',
34
+ character_id: 975829418411224
35
+ )
36
+
37
+ info = dqx.character.info
38
+ info.id #=> "TV327-610"
39
+ info.name #=> "ソプラナ"
40
+ ```
41
+
42
+ # test
43
+
44
+ ```bash
45
+ $ cp spec/account.yaml.example spec/account.yaml
46
+ ```
47
+
48
+ ```yaml
49
+ # spec/account.yaml
50
+ account:
51
+ name: account_name
52
+ password: account_password
53
+ character_id: 975829418411224
54
+ ```
55
+
56
+ ```
57
+ $ rspec spec/character/info_spec.rb
58
+ ```
data/Rakefile ADDED
@@ -0,0 +1,2 @@
1
+ require "bundler/gem_tasks"
2
+
data/lib/lyne.rb ADDED
@@ -0,0 +1,19 @@
1
+ require "lyne/version"
2
+ require 'nokogiri'
3
+ require 'capybara/poltergeist'
4
+ require 'phantomjs'
5
+ require 'active_support'
6
+ require 'active_support/core_ext'
7
+
8
+ require './lib/lyne/error.rb'
9
+ require './lib/lyne/account.rb'
10
+ require './lib/lyne/session/screen_transitions.rb'
11
+ require './lib/lyne/session/browser.rb'
12
+ require './lib/lyne/parser/base.rb'
13
+ require './lib/lyne/parser/home.rb'
14
+ require './lib/lyne/page/hook.rb'
15
+ #require './lib/lyne/page/show_table.rb'
16
+ require './lib/lyne/page/character.rb'
17
+
18
+ module Lyne
19
+ end
@@ -0,0 +1,9 @@
1
+ class Lyne::Account
2
+ def initialize options
3
+ @session = Lyne::Session::Browser.new(options).start!
4
+ end
5
+
6
+ def character
7
+ @character ||= Lyne::Page::Character::Adapter.new(@session)
8
+ end
9
+ end
data/lib/lyne/error.rb ADDED
@@ -0,0 +1,10 @@
1
+ module Lyne::Error
2
+ class LyneError < StandardError
3
+ end
4
+
5
+ class ParseError < LyneError
6
+ def initialize message='failed to parse'
7
+ super(message)
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,73 @@
1
+ # ページ毎にオブジェクトに切り出す
2
+ module Lyne::Page
3
+ # Character情報に紐づくオブジェクト
4
+ module Character
5
+ class Base
6
+ #include Lyne::Page::ShowTable
7
+
8
+ def initialize session
9
+ @parser = parser_class.new(session)
10
+ end
11
+
12
+ private
13
+ def parser_class
14
+ Lyne::Parser::Home
15
+ end
16
+ end
17
+
18
+ # Target以下のClassが実際の機能として提供される
19
+ # それぞれの機能が必要とするパーサを必ず指定する必要がある
20
+ module Target
21
+ class Info < Lyne::Page::Character::Base
22
+ PROPERTYS = %w(name job tribe level next_level genki_charge id gold)
23
+ include Lyne::Page::Hook::CreateProperty
24
+
25
+ private
26
+ def table_headers
27
+ %w(ID 名前 種族 職業 レベル 次のレベルまで 所持金 元気チャージ)
28
+ end
29
+
30
+ def table_rows
31
+ [id, name, job, tribe, level, next_level, gold, genki_charge]
32
+ end
33
+
34
+ private
35
+ def parser_class
36
+ Lyne::Parser::Info
37
+ end
38
+ end
39
+
40
+ class House < Lyne::Page::Character::Base
41
+ PROPERTYS = %w(country city house_number setting setting_type)
42
+ include Lyne::Page::Hook::CreateProperty
43
+
44
+ private
45
+ def parser_class
46
+ Lyne::Parser::House
47
+ end
48
+ end
49
+ end
50
+
51
+ # 実際の機能をLyne::Account(外部からのインターフェイス)に
52
+ # 提供する為のClass
53
+ # ドラクエ10Account内に複数キャラがいる場合などは
54
+ # キャラの切り替えなども発生するため
55
+ class Adapter
56
+ def initialize session
57
+ @session = session
58
+ @character = Lyne::Page::Character::Base.new(session)
59
+ end
60
+
61
+ Lyne::Page::Character::Target.constants.each do |target|
62
+ formatted_name = target.to_s.downcase
63
+ define_method(formatted_name) do
64
+ if instance_variable_defined?("@#{formatted_name}")
65
+ return instance_variable_get("@#{formatted_name}")
66
+ else
67
+ instance_variable_set("@#{formatted_name}", Lyne::Page::Character::Target.const_get(target).new(@session))
68
+ end
69
+ end
70
+ end
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,15 @@
1
+ module Lyne::Page
2
+ module Hook
3
+ module CreateProperty
4
+ def self.included(target_class)
5
+ target_class.class_eval do
6
+ self::PROPERTYS.each do |property|
7
+ define_method(property) do
8
+ @parser.__send__(property)
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,12 @@
1
+ #module Lyne::Page
2
+ # module ShowTable
3
+ # def show_table
4
+ # table = Kosi::Table.new({header: table_headers})
5
+ # print table.render([table_rows])
6
+ # end
7
+ #
8
+ # private
9
+ # def table_headers; [] end
10
+ # def table_rows; [] end
11
+ # end
12
+ #end
@@ -0,0 +1,40 @@
1
+ # Lyne::Util::Sessionからhtml情報を受け取り
2
+ # 必要に応じてパースする
3
+ module Lyne::Parser
4
+ class Base
5
+ def initialize session
6
+ @session = session
7
+ yield if block_given?
8
+ set_result
9
+ end
10
+
11
+ def nbsp
12
+ Nokogiri::HTML("&nbsp;").text
13
+ end
14
+
15
+ private
16
+ def set_result
17
+ @result = Nokogiri::HTML.parse(@session.html)
18
+ end
19
+
20
+ def get_parse_data option
21
+ raise Lyne::Error::ParseError.new if parse_data.blank?
22
+ option = option.reverse_merge(default_parse_result_options)
23
+ text = parse_data.children[option[:index]].children.text
24
+
25
+ if option[:regexp].present?
26
+ text.gsub(option[:regexp], '')
27
+ else
28
+ text
29
+ end
30
+ end
31
+
32
+ def default_parse_result_options
33
+ {}
34
+ end
35
+
36
+ def parse_data
37
+ @parse_data ||= @result.xpath(parse_target_xpath)
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,83 @@
1
+ module Lyne::Parser
2
+ class Home < Lyne::Parser::Base
3
+ def initialize session
4
+ super(session) do
5
+ @session.first_visit!
6
+ end
7
+ end
8
+ end
9
+
10
+ class Info < Home
11
+ def name
12
+ @result.xpath("//h2[@id='myCharacterName']").text.gsub(/\[|\]/, '')
13
+ end
14
+
15
+ def job
16
+ get_parse_data(index: 11)
17
+ end
18
+
19
+ def tribe
20
+ get_parse_data(index: 7, regexp: /:|#{nbsp}|男|女/)
21
+ end
22
+
23
+ def level
24
+ get_parse_data(index: 15)
25
+ end
26
+
27
+ def id
28
+ get_parse_data(index: 3)
29
+ end
30
+
31
+ def next_level
32
+ get_parse_data(index: 19)
33
+ end
34
+
35
+ def gold
36
+ get_parse_data(index: 23)
37
+ end
38
+
39
+ def genki_charge
40
+ get_parse_data(index: 27)
41
+ end
42
+
43
+ private
44
+ def default_parse_result_options
45
+ {regexp: /:|#{nbsp}/}
46
+ end
47
+
48
+ def parse_target_xpath
49
+ "//div[@id='myCharacterStatusList']"
50
+ end
51
+
52
+ def parse_data
53
+ (super.children.presence || [])[1]
54
+ end
55
+ end
56
+
57
+ class House < Home
58
+ def country
59
+ get_parse_data(index: 3).split[0].scan(/.*住宅村/)[0]
60
+ end
61
+
62
+ def city
63
+ get_parse_data(index: 3).split[0].gsub(/#{country}/,'')
64
+ end
65
+
66
+ def house_number
67
+ get_parse_data(index: 3).split[1]
68
+ end
69
+
70
+ def setting
71
+ get_parse_data(index: 5)
72
+ end
73
+
74
+ def setting_type
75
+ get_parse_data(index: 7)
76
+ end
77
+
78
+ private
79
+ def parse_target_xpath
80
+ "//div[@id='myHouseStage']"
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,67 @@
1
+ module Lyne::Session
2
+ # sessionの維持
3
+ # ページ遷移などのブラウザの動き
4
+ class Browser
5
+ include ScreenTransitions
6
+
7
+ def initialize options
8
+ @options = options.reverse_merge(default_options)
9
+ Capybara.register_driver :poltergeist do |app|
10
+ Capybara::Poltergeist::Driver.new(app, {
11
+ js_errors: false,
12
+ timeout: 1000,
13
+ phantomjs: @options[:phantomjs]
14
+ })
15
+ end
16
+ Capybara.default_selector = :xpath
17
+ @page = Capybara::Session.new(:poltergeist)
18
+ @page.driver.headers = {'User-Agent' => @options[:user_agent]}
19
+ end
20
+
21
+ def start!
22
+ go :welcome
23
+ go :character_select
24
+ self
25
+ end
26
+
27
+ def first_visit!
28
+ return if @page.current_path == '/sc/home/'
29
+ character_select_url? ? go(:home) : visit(:home)
30
+ end
31
+
32
+ def go type
33
+ __send__("go_to_#{type}")
34
+ end
35
+
36
+ def visit type
37
+ __send__("visit_to_#{type}")
38
+ end
39
+
40
+ def html
41
+ @page.html
42
+ end
43
+
44
+ private
45
+ def default_options
46
+ {
47
+ account: '',
48
+ password: '',
49
+ character_id: 0,
50
+ user_agent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X)',
51
+ phantomjs: Phantomjs.path
52
+ }
53
+ end
54
+
55
+ def login_url
56
+ url = 'https://secure.square-enix.com/account/app/svc/login?'
57
+ url += 'cont=dq_comm&'
58
+ url += 'svcgrp=Service_SEJ&'
59
+ url += 'retu=http%3A%2F%2Fhiroba.dqx.jp%2Fsc%2F&'
60
+ url += 'retl=dqx_p&ret=https%3A%2F%2Fsecure.dqx.jp%2Fsc%2Flogin%2Fexec%3Fp%3D0%26ott%3Dfeb84a119a6b2f7df40aac09a9c42f90'
61
+ end
62
+
63
+ def character_select_url?
64
+ @page.current_path == "/sc/login/characterselect/"
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,36 @@
1
+ module Lyne::Session
2
+ module ScreenTransitions
3
+ def go_to_welcome
4
+ move_to do
5
+ @page.visit login_url
6
+ @page.fill_in '_pr_confData_sqexid', with: @options[:account]
7
+ @page.fill_in '_pr_confData_passwd', with: @options[:password]
8
+ @page.find(:xpath, ".//a[@id='btLogin']").click
9
+ end
10
+ end
11
+
12
+ def go_to_character_select
13
+ move_to do
14
+ @page.find(:xpath, "//a[@href='/sc/login/characterselect/']").click
15
+ end
16
+ end
17
+
18
+ def go_to_home
19
+ move_to do
20
+ @page.find(:xpath, "//a[@rel='#{@options[:character_id]}']").click
21
+ end
22
+ end
23
+
24
+ def visit_to_home
25
+ move_to do
26
+ @page.visit('sc/home/')
27
+ end
28
+ end
29
+
30
+ private
31
+ def move_to
32
+ yield
33
+ sleep(2)
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,3 @@
1
+ module Lyne
2
+ VERSION = "0.0.2"
3
+ end
data/lyne.gemspec ADDED
@@ -0,0 +1,28 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'lyne/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "lyne"
8
+ spec.version = Lyne::VERSION
9
+ spec.authors = ["soplana"]
10
+ spec.email = ["sonosheet.jp@gmail.com"]
11
+ spec.summary = %q{dqx gem}
12
+ spec.description = %q{冒険者の広場をスクレイピングするgemです}
13
+ spec.homepage = "http://leeno.jp"
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 "nokogiri", '~> 1.3'
23
+ spec.add_development_dependency "poltergeist", '~> 1.5'
24
+ spec.add_development_dependency "capybara", '~> 2.4'
25
+ spec.add_development_dependency "phantomjs", '~> 1.9'
26
+ spec.add_development_dependency "activesupport", '~> 4.0'
27
+
28
+ end
@@ -0,0 +1,4 @@
1
+ account:
2
+ name:
3
+ password:
4
+ character_id:
@@ -0,0 +1,50 @@
1
+ require File.expand_path(File.join('../', 'spec_helper'), File.dirname(__FILE__))
2
+
3
+ describe Lyne::Page::Character do
4
+ before(:all){ @account = YAML.load_file("./spec/account.yaml")['account'].symbolize_keys }
5
+
6
+ context 'character情報' do
7
+ let(:property){ nil }
8
+ # ほんとはletがいいけど, 一度しか実行したくない...
9
+ before(:all) do
10
+ dqx = Lyne::Account.new({
11
+ account: @account[:name],
12
+ password: @account[:password],
13
+ character_id: @account[:character_id]
14
+ })
15
+ @character = dqx.character
16
+ end
17
+
18
+ context 'Infoが取得できているる' do
19
+ subject{ @character.info }
20
+
21
+ context 'IDが取得できている' do
22
+ it { expect(subject.id).to match(/^[a-z]{2}\d{3}-\d{3}$/i) }
23
+ end
24
+
25
+ context 'levelが取得できている' do
26
+ it { expect(subject.level).to match(/^\d*$/) }
27
+ end
28
+
29
+ context 'next_levelが取得できている' do
30
+ it { expect(subject.next_level).to match(/.*P$/) }
31
+ end
32
+
33
+ context 'goldが取得できている' do
34
+ it { expect(subject.gold).to match(/.*G$/) }
35
+ end
36
+ end
37
+
38
+ context 'Houseが取得できているる' do
39
+ subject{ @character.house }
40
+
41
+ context 'countryが取得できている' do
42
+ it { expect(subject.country).to match(/.*住宅村$/) }
43
+ end
44
+
45
+ context 'house_numberが取得できている' do
46
+ it { expect(subject.house_number).to match(/.*サイズ)$/) }
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,4 @@
1
+ # encoding: utf-8
2
+ require 'rubygems'
3
+ require 'yaml'
4
+ require 'lyne'
metadata ADDED
@@ -0,0 +1,151 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: lyne
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
5
+ platform: ruby
6
+ authors:
7
+ - soplana
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-08-07 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: nokogiri
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.3'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.3'
41
+ - !ruby/object:Gem::Dependency
42
+ name: poltergeist
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.5'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.5'
55
+ - !ruby/object:Gem::Dependency
56
+ name: capybara
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '2.4'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '2.4'
69
+ - !ruby/object:Gem::Dependency
70
+ name: phantomjs
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '1.9'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '1.9'
83
+ - !ruby/object:Gem::Dependency
84
+ name: activesupport
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '4.0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '4.0'
97
+ description: "冒険者の広場をスクレイピングするgemです"
98
+ email:
99
+ - sonosheet.jp@gmail.com
100
+ executables: []
101
+ extensions: []
102
+ extra_rdoc_files: []
103
+ files:
104
+ - ".gitignore"
105
+ - Gemfile
106
+ - LICENSE.txt
107
+ - README.md
108
+ - Rakefile
109
+ - lib/lyne.rb
110
+ - lib/lyne/account.rb
111
+ - lib/lyne/error.rb
112
+ - lib/lyne/page/character.rb
113
+ - lib/lyne/page/hook.rb
114
+ - lib/lyne/page/show_table.rb
115
+ - lib/lyne/parser/base.rb
116
+ - lib/lyne/parser/home.rb
117
+ - lib/lyne/session/browser.rb
118
+ - lib/lyne/session/screen_transitions.rb
119
+ - lib/lyne/version.rb
120
+ - lyne.gemspec
121
+ - spec/account.yaml.example
122
+ - spec/character/info_spec.rb
123
+ - spec/spec_helper.rb
124
+ homepage: http://leeno.jp
125
+ licenses:
126
+ - MIT
127
+ metadata: {}
128
+ post_install_message:
129
+ rdoc_options: []
130
+ require_paths:
131
+ - lib
132
+ required_ruby_version: !ruby/object:Gem::Requirement
133
+ requirements:
134
+ - - ">="
135
+ - !ruby/object:Gem::Version
136
+ version: '0'
137
+ required_rubygems_version: !ruby/object:Gem::Requirement
138
+ requirements:
139
+ - - ">="
140
+ - !ruby/object:Gem::Version
141
+ version: '0'
142
+ requirements: []
143
+ rubyforge_project:
144
+ rubygems_version: 2.2.2
145
+ signing_key:
146
+ specification_version: 4
147
+ summary: dqx gem
148
+ test_files:
149
+ - spec/account.yaml.example
150
+ - spec/character/info_spec.rb
151
+ - spec/spec_helper.rb