acme_japanese_av_actress 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,4 @@
1
+ == 0.0.3 / 2009-01-21
2
+
3
+ * initial release
4
+
data/README ADDED
@@ -0,0 +1,61 @@
1
+ = Acme::JapaneseAvActress (ruby port)
2
+
3
+ * http://coderepos.org/share/browser/lang/ruby/Acme-JapaneseAvActress
4
+
5
+ == DESCRIPTION:
6
+
7
+ yusukebe 氏作の Perl モジュール Acme-JapaneseAvActress を、Ruby からで
8
+ も使いたかったので移植してみました。
9
+
10
+ == SYNOPSIS:
11
+
12
+ >> require 'acme/japanese_av_actress'
13
+ >> actress = Acme::JapaneseAvActress.new()
14
+ >> actress.get
15
+ >> actress.initial('あ').slice(0,10).each { |r| puts r.name }
16
+ 愛あいり
17
+ 藍ゆうき
18
+ 相内リカ
19
+ 愛浦こころ
20
+ 藍花
21
+ あいか瞬
22
+ 愛川香理
23
+ 愛川紗季
24
+ 愛川琴音
25
+ 愛川咲樹
26
+ >> r = actress.name('Rio')
27
+ >> puts r.name, r.yomi, r.initial, r.year, r.aliases
28
+ Rio
29
+ りお
30
+
31
+ 2005
32
+ 柚木ティナ
33
+
34
+ ## Caching
35
+ >> require 'memcache'
36
+ >> memcache = MemCache.new('localhost:11211', :namespace => 'Acme-JapaneseAvActress')
37
+ >> actress = Acme::JapaneseAvActress.new(:cache => memcache)
38
+
39
+ >> require 'filecache'
40
+ >> filecache = FileCache.new('Acme-JapaneseAvActress', '/home/valda/tmp/caches', 3.days)
41
+ >> actress = Acme::JapaneseAvActress.new(:cache => filecache)
42
+
43
+ == REQUIREMENTS:
44
+
45
+ * memcache-client (suggested)
46
+ * filecache (suggested)
47
+
48
+ == INSTALL:
49
+
50
+ * sudo gem install acme_japanese_av_actress
51
+
52
+ == SEE ALSO:
53
+
54
+ * http://coderepos.org/share/browser/lang/perl/Acme-JapaneseAvActress
55
+
56
+ == LICENSE:
57
+
58
+ Copyright (c) 2009 YAMAGUCHI Seiji <valda at underscore.jp>
59
+
60
+ The license applies to original Acme::JapaneseAvActress.
61
+ ライセンスはオリジナルの Acme::JapaneseAvActress に準じます。
@@ -0,0 +1,144 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+ require 'rake/clean'
4
+ require 'rake/testtask'
5
+ require 'rake/packagetask'
6
+ require 'rake/gempackagetask'
7
+ require 'rake/rdoctask'
8
+ require 'rake/contrib/rubyforgepublisher'
9
+ require 'rake/contrib/sshpublisher'
10
+ require 'fileutils'
11
+ require 'lib/acme/japanese_av_actress'
12
+ include FileUtils
13
+
14
+ NAME = "acme_japanese_av_actress"
15
+ AUTHOR = "YAMAGUCHI Seiji"
16
+ EMAIL = "valda@underscore.jp"
17
+ DESCRIPTION = "Ruby port of Acme::JapaneseAvActress"
18
+ RUBYFORGE_PROJECT = "acme_japanese_av_actress"
19
+ HOMEPATH = "http://coderepos.org/share/browser/lang/ruby/Acme-JapaneseAvActress"
20
+ BIN_FILES = %w( )
21
+
22
+ VERS = Acme::JapaneseAvActress::VERSION
23
+ REV = File.read(".svn/entries")[/committed-rev="(d+)"/, 1] rescue nil
24
+ CLEAN.include ['**/.*.sw?', '*.gem', '.config']
25
+ RDOC_OPTS = [
26
+ '--title', "#{NAME} documentation",
27
+ "--charset", "utf-8",
28
+ "--opname", "index.html",
29
+ "--line-numbers",
30
+ "--main", "README",
31
+ "--inline-source",
32
+ ]
33
+
34
+ task :default => [:test]
35
+ task :package => [:clean]
36
+
37
+ Rake::TestTask.new("test") do |t|
38
+ t.libs << "test"
39
+ t.pattern = "test/**/*_test.rb"
40
+ t.verbose = true
41
+ end
42
+
43
+ spec = Gem::Specification.new do |s|
44
+ s.name = NAME
45
+ s.version = VERS
46
+ s.platform = Gem::Platform::RUBY
47
+ s.has_rdoc = true
48
+ s.extra_rdoc_files = ["README", "ChangeLog"]
49
+ s.rdoc_options += RDOC_OPTS + ['--exclude', '^(examples|extras)/']
50
+ s.summary = DESCRIPTION
51
+ s.description = DESCRIPTION
52
+ s.author = AUTHOR
53
+ s.email = EMAIL
54
+ s.homepage = HOMEPATH
55
+ s.executables = BIN_FILES
56
+ s.rubyforge_project = RUBYFORGE_PROJECT
57
+ s.bindir = "bin"
58
+ s.require_path = "lib"
59
+ #s.autorequire = ""
60
+ s.test_files = Dir["test/*_test.rb"]
61
+
62
+ #s.add_dependency('activesupport', '>=1.3.1')
63
+ #s.required_ruby_version = '>= 1.8.2'
64
+
65
+ s.files = %w(README ChangeLog Rakefile) +
66
+ Dir.glob("{bin,doc,test,lib,templates,generator,extras,website,script}/**/*") +
67
+ Dir.glob("ext/**/*.{h,c,rb}") +
68
+ Dir.glob("examples/**/*.rb") +
69
+ Dir.glob("tools/*.rb") +
70
+ Dir.glob("rails/*.rb")
71
+
72
+ s.extensions = FileList["ext/**/extconf.rb"].to_a
73
+ end
74
+
75
+ Rake::GemPackageTask.new(spec) do |p|
76
+ p.need_tar = true
77
+ p.gem_spec = spec
78
+ end
79
+
80
+ task :install do
81
+ name = "#{NAME}-#{VERS}.gem"
82
+ sh %{rake package}
83
+ sh %{sudo gem install pkg/#{name}}
84
+ end
85
+
86
+ task :uninstall => [:clean] do
87
+ sh %{sudo gem uninstall #{NAME}}
88
+ end
89
+
90
+
91
+ Rake::RDocTask.new do |rdoc|
92
+ rdoc.rdoc_dir = 'html'
93
+ rdoc.options += RDOC_OPTS
94
+ rdoc.template = "resh"
95
+ #rdoc.template = "#{ENV['template']}.rb" if ENV['template']
96
+ if ENV['DOC_FILES']
97
+ rdoc.rdoc_files.include(ENV['DOC_FILES'].split(/,\s*/))
98
+ else
99
+ rdoc.rdoc_files.include('README', 'ChangeLog')
100
+ rdoc.rdoc_files.include('lib/**/*.rb')
101
+ rdoc.rdoc_files.include('ext/**/*.c')
102
+ end
103
+ end
104
+
105
+ desc "Publish to RubyForge"
106
+ task :rubyforge => [:rdoc, :package] do
107
+ require 'rubyforge'
108
+ Rake::RubyForgePublisher.new(RUBYFORGE_PROJECT, 'yamaguchi').upload
109
+ end
110
+
111
+ desc 'Package and upload the release to rubyforge.'
112
+ task :release => [:clean, :package] do |t|
113
+ v = ENV["VERSION"] or abort "Must supply VERSION=x.y.z"
114
+ abort "Versions don't match #{v} vs #{VERS}" unless v == VERS
115
+ pkg = "pkg/#{NAME}-#{VERS}"
116
+
117
+ require 'rubyforge'
118
+ rf = RubyForge.new.configure
119
+ puts "Logging in"
120
+ rf.login
121
+
122
+ c = rf.userconfig
123
+ # c["release_notes"] = description if description
124
+ # c["release_changes"] = changes if changes
125
+ c["preformatted"] = true
126
+
127
+ files = [
128
+ "#{pkg}.tgz",
129
+ "#{pkg}.gem"
130
+ ].compact
131
+
132
+ puts "Releasing #{NAME} v. #{VERS}"
133
+ rf.add_release RUBYFORGE_PROJECT, NAME, VERS, *files
134
+ end
135
+
136
+ desc 'Show information about the gem.'
137
+ task :debug_gem do
138
+ puts spec.to_ruby
139
+ end
140
+
141
+ desc 'Update gem spec'
142
+ task :gemspec do
143
+ open("#{NAME}.gemspec", 'w').write spec.to_ruby
144
+ end
@@ -0,0 +1,115 @@
1
+ #!/usr/bin/ruby
2
+ # -*- mode:ruby; coding:utf-8 -*-
3
+
4
+ require 'rubygems'
5
+ require 'open-uri'
6
+ begin
7
+ require 'jcode'
8
+ rescue LoadError
9
+ end
10
+
11
+ module Acme
12
+ class JapaneseAvActress
13
+ VERSION = '0.0.5'
14
+
15
+ def initialize(options = {})
16
+ @wikipedia_url = "http://ja.wikipedia.org/wiki/%E7%89%B9%E5%88%A5:Export/AV%E5%A5%B3%E5%84%AA%E4%B8%80%E8%A6%A7"
17
+ @cache = options[:cache]
18
+ @actresses = []
19
+ end
20
+
21
+ def get
22
+ if @cache
23
+ unless @cache.respond_to?(:get) and @cache.respond_to?(:set)
24
+ raise RuntimeError, 'As for cache object what responds to :get and :set is required.'
25
+ end
26
+ unless content = @cache.get(@wikipedia_url)
27
+ content = open(@wikipedia_url) {|fh| fh.read }
28
+ @cache.set(@wikipedia_url, content)
29
+ end
30
+ else
31
+ content = open(@wikipedia_url) {|fh| fh.read }
32
+ end
33
+ actress = []
34
+ flag = false
35
+ initial = ''
36
+ re_yomi = /(?:(|\()(.*?)(?:)|\))/
37
+ re_year = /[((](?:\[\[)?(\d{4})\s*年(?:\]\])?[))]/
38
+ content.each_line do |line|
39
+ actress_info = { :aliases => [] }
40
+ (flag = true; next) if line =~ /==\s*あ行\s*==/
41
+ break if line =~ /==\s*関連項目\s*==/
42
+ next unless flag
43
+ if m = line.match(/===\s*([あ-ん]+)\s*===\s*\Z/)
44
+ initial = m[1]
45
+ elsif m = line.match(/\[\[([^\[\]]+)\]\](.*)/)
46
+ actress_info[:name] = m[1]
47
+ temp = m[2]
48
+ if m = temp.match(/#{re_yomi}.*#{re_year}/)
49
+ actress_info[:yomi] = m[1]
50
+ actress_info[:year] = m[2].to_i
51
+ elsif m = temp.match(re_year)
52
+ actress_info[:year] = m[1].to_i
53
+ elsif m = temp.match(re_yomi)
54
+ actress_info[:yomi] = m[1]
55
+ end
56
+ if m = temp.match(/=(\[\[.*\]\])/)
57
+ actress_info[:aliases] = m[1].scan(/\[\[(?:\|)*(.*?)\]\]/).flatten
58
+ end
59
+ (actress_info[:aliases] + [actress_info[:name]]).each do |name|
60
+ name.sub!(/.*\|/, '')
61
+ end
62
+ actress_info[:retired] = !temp.match(/[((]引退[))]/).nil?
63
+ actress_info[:yomi] ||= actress_info[:name]
64
+ decode_entities(actress_info[:name])
65
+ decode_entities(actress_info[:yomi])
66
+ actress_info[:initial] = initial
67
+ actress << Acme::JapaneseAvActress::Actress.new(actress_info)
68
+ end
69
+ end
70
+ @actresses = actress
71
+ self
72
+ end
73
+
74
+ def initial(initial)
75
+ @actresses.find_all {|actress| actress.initial == initial }
76
+ end
77
+
78
+ def year(year)
79
+ year = year.to_i
80
+ @actresses.find_all {|actress| actress.year == year }
81
+ end
82
+
83
+ def name(name)
84
+ name = name.delete('  ')
85
+ @actresses.find {|actress| actress.name.delete('  ') == name }
86
+ end
87
+
88
+ def yomi(yomi)
89
+ yomi = yomi.delete('  ')
90
+ @actresses.find_all {|actress| actress.yomi.delete('  ') == yomi }
91
+ end
92
+
93
+ def to_a
94
+ @actresses.dup
95
+ end
96
+
97
+ private
98
+ def decode_entities(str)
99
+ str.gsub!(/&#(?:(\d+)|[xX]([0-9a-fA-F]{4}));/) { [$1.nil? ? $2.to_i(16) : $1.to_i].pack('U') }
100
+ str.gsub!('&gt;', '>')
101
+ str.gsub!('&lt;', '<')
102
+ str.gsub!('&quot;', "'")
103
+ str.gsub!('&amp;', '&')
104
+ end
105
+
106
+ class Actress
107
+ attr_reader :name, :initial, :yomi, :year, :retired, :aliases
108
+ alias_method :retired?, :retired
109
+
110
+ def initialize(actress)
111
+ actress.each_pair {|k,v| instance_variable_set("@#{k}", v) }
112
+ end
113
+ end
114
+ end
115
+ end
@@ -0,0 +1,137 @@
1
+ # -*- mode:ruby; coding:utf-8 -*-
2
+
3
+ require 'test/unit'
4
+ require File.expand_path(File.join(File.dirname(__FILE__), "..", "..", "lib", "acme", "japanese_av_actress"))
5
+
6
+ require 'filecache'
7
+ require 'fileutils'
8
+ begin
9
+ require 'jcode'
10
+ rescue LoadError
11
+ end
12
+
13
+ module TestAcme
14
+ class Fixture
15
+ def initialize(filename)
16
+ path = File.expand_path(File.join(File.dirname(__FILE__), '..', 'fixtures', filename))
17
+ @fixture = File.open(path) { |fh| fh.read }
18
+ end
19
+ def get(key); @fixture; end
20
+ def set(k,v); end
21
+ end
22
+
23
+ class TestJapaneseAvActress < Test::Unit::TestCase
24
+ def setup
25
+ @cache_root = '/tmp/TestJapaneseAvActress/caches'
26
+ end
27
+
28
+ def teardown
29
+ #FileUtils.remove_entry_secure(@cache_root, true)
30
+ end
31
+
32
+ def get_cached_instance
33
+ actress = Acme::JapaneseAvActress.new(:cache => FileCache.new('Acme-JapaneseAvActress',
34
+ @cache_root,
35
+ 60 * 60))
36
+ actress.get
37
+ actress
38
+ end
39
+
40
+ def test_initial
41
+ actress = get_cached_instance
42
+ actress.initial('あ').each do |a|
43
+ assert_equal 'あ', a.initial
44
+ assert_equal 'あ', a.yomi.split(//u)[0]
45
+ end
46
+ end
47
+
48
+ def test_year
49
+ actress = get_cached_instance
50
+ actress.year(2007).each do |a|
51
+ assert_equal 2007, a.year
52
+ end
53
+ actress.year('2008').each do |a|
54
+ assert_equal 2008, a.year
55
+ end
56
+ end
57
+
58
+ def test_name
59
+ actress = get_cached_instance
60
+ a = actress.name('遥めぐみ')
61
+ assert_kind_of Acme::JapaneseAvActress::Actress, a
62
+ assert_equal '遥めぐみ', a.name
63
+ assert_equal 'はるか めぐみ', a.yomi
64
+ end
65
+
66
+ def test_yomi
67
+ actress = get_cached_instance
68
+ actress.yomi('さらいつき').each do |a|
69
+ assert_kind_of Acme::JapaneseAvActress::Actress, a
70
+ assert_equal '沙羅樹', a.name
71
+ assert_equal 'さら いつき', a.yomi
72
+ end
73
+ end
74
+
75
+ def test_aliases
76
+ actress = get_cached_instance
77
+ a = actress.name('宮地奈々')
78
+ assert_kind_of Acme::JapaneseAvActress::Actress, a
79
+ assert a.aliases.include?('宮路なな')
80
+ assert a.aliases.include?('宮路奈々')
81
+ assert a.aliases.include?('小野みく')
82
+ assert a.aliases.include?('中原真央')
83
+
84
+ a = actress.name('柚木ティナ')
85
+ assert_kind_of Acme::JapaneseAvActress::Actress, a
86
+ assert a.aliases.include?('Rio')
87
+
88
+ a = actress.name('Rio')
89
+ assert_kind_of Acme::JapaneseAvActress::Actress, a
90
+ assert a.aliases.include?('柚木ティナ')
91
+
92
+ a = actress.name('彩名杏子')
93
+ assert_kind_of Acme::JapaneseAvActress::Actress, a
94
+ assert_kind_of Enumerable, a.aliases
95
+ assert a.aliases.empty?
96
+ end
97
+
98
+ def test_retired?
99
+ actress = get_cached_instance
100
+ a = actress.name('及川奈央')
101
+ assert_kind_of Acme::JapaneseAvActress::Actress, a
102
+ assert a.retired?
103
+ end
104
+
105
+ def test_parse_aizawa_moe
106
+ # Ruby 1.8 では '(あいざわ もえ)'.match(/[((]([^()()]+)[))]/) が失敗してしまう
107
+ # …$KCODE='u' または /[((]([^()()]+)[))]/u のつもりでした、ごめんなさい
108
+ actress = Acme::JapaneseAvActress.new(:cache => Fixture.new('aizawa_moe.txt')).get
109
+ a = actress.yomi('あいざわ もえ').shift
110
+ assert_kind_of Acme::JapaneseAvActress::Actress, a
111
+ assert_equal '合沢萌', a.name
112
+ assert_equal 'あいざわ もえ', a.yomi
113
+ assert_equal 'あ', a.initial
114
+ end
115
+
116
+ def test_parse_miyachi_nana
117
+ # 複数の別名を持っている場合に、最初の要素しか取れていなかった
118
+ actress = Acme::JapaneseAvActress.new(:cache => Fixture.new('miyachi_nana.txt')).get
119
+ a = actress.name('宮地奈々')
120
+ assert_kind_of Acme::JapaneseAvActress::Actress, a
121
+ assert a.aliases.include?('宮路なな')
122
+ assert a.aliases.include?('宮路奈々')
123
+ assert a.aliases.include?('小野みく')
124
+ assert a.aliases.include?('中原真央')
125
+ end
126
+
127
+ def test_to_a
128
+ actress = get_cached_instance
129
+ assert ! actress.to_a.empty?
130
+ actress.to_a.each do |a|
131
+ assert_kind_of Acme::JapaneseAvActress::Actress, a
132
+ end
133
+ a = actress.to_a.find { |a| a.name == '伊東遥' }
134
+ assert_kind_of Acme::JapaneseAvActress::Actress, a
135
+ end
136
+ end
137
+ end
@@ -0,0 +1,4 @@
1
+ == あ行 ==
2
+ === あ ===
3
+ ==== あい ====
4
+ * [[合沢萌]](あいざわ もえ)(2007年)
@@ -0,0 +1,5 @@
1
+ == あ行 ==
2
+ == ま行 ==
3
+ === み ===
4
+ ==== みや ====
5
+ * [[宮地奈々]](みやち なな)(2003年)(引退)=[[宮地奈々|宮路なな]]、[[宮地奈々|宮路奈々]]、[[宮地奈々|小野みく]]、[[宮地奈々|中原真央]]
metadata ADDED
@@ -0,0 +1,73 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: acme_japanese_av_actress
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.5
5
+ platform: ruby
6
+ authors:
7
+ - YAMAGUCHI Seiji
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-11-02 00:00:00 +09:00
13
+ default_executable:
14
+ dependencies: []
15
+
16
+ description: Ruby port of Acme::JapaneseAvActress
17
+ email: valda@underscore.jp
18
+ executables: []
19
+
20
+ extensions: []
21
+
22
+ extra_rdoc_files:
23
+ - README
24
+ - ChangeLog
25
+ files:
26
+ - README
27
+ - ChangeLog
28
+ - Rakefile
29
+ - test/acme/test_japanese_av_actress.rb
30
+ - test/fixtures/miyachi_nana.txt
31
+ - test/fixtures/aizawa_moe.txt
32
+ - lib/acme/japanese_av_actress.rb
33
+ has_rdoc: true
34
+ homepage: http://coderepos.org/share/browser/lang/ruby/Acme-JapaneseAvActress
35
+ licenses: []
36
+
37
+ post_install_message:
38
+ rdoc_options:
39
+ - --title
40
+ - acme_japanese_av_actress documentation
41
+ - --charset
42
+ - utf-8
43
+ - --opname
44
+ - index.html
45
+ - --line-numbers
46
+ - --main
47
+ - README
48
+ - --inline-source
49
+ - --exclude
50
+ - ^(examples|extras)/
51
+ require_paths:
52
+ - lib
53
+ required_ruby_version: !ruby/object:Gem::Requirement
54
+ requirements:
55
+ - - ">="
56
+ - !ruby/object:Gem::Version
57
+ version: "0"
58
+ version:
59
+ required_rubygems_version: !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - ">="
62
+ - !ruby/object:Gem::Version
63
+ version: "0"
64
+ version:
65
+ requirements: []
66
+
67
+ rubyforge_project: acme_japanese_av_actress
68
+ rubygems_version: 1.3.5
69
+ signing_key:
70
+ specification_version: 3
71
+ summary: Ruby port of Acme::JapaneseAvActress
72
+ test_files: []
73
+