sakura_gakuin 1.0.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 +7 -0
- data/.gitignore +17 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +33 -0
- data/Rakefile +1 -0
- data/config/club_members.yml +238 -0
- data/config/clubs.yml +41 -0
- data/config/members.yml +565 -0
- data/example/clubs_and_members.rb +12 -0
- data/example/dump_clubs.rb +9 -0
- data/example/dump_members.rb +9 -0
- data/example/heights_transition_table.rb +30 -0
- data/example/heights_transition_table_html.rb +67 -0
- data/example/over_the_ayami.rb +21 -0
- data/example/yui_profile.rb +43 -0
- data/lib/sakura_gakuin/club.rb +51 -0
- data/lib/sakura_gakuin/club_member.rb +55 -0
- data/lib/sakura_gakuin/date_hash.rb +43 -0
- data/lib/sakura_gakuin/member.rb +119 -0
- data/lib/sakura_gakuin/version.rb +3 -0
- data/lib/sakura_gakuin/yaml_loadable.rb +63 -0
- data/lib/sakura_gakuin.rb +7 -0
- data/sakura_gakuin.gemspec +25 -0
- metadata +109 -0
@@ -0,0 +1,43 @@
|
|
1
|
+
$LOAD_PATH << File.expand_path("../lib", File.dirname(__FILE__))
|
2
|
+
|
3
|
+
require 'sakura_gakuin'
|
4
|
+
require 'pp'
|
5
|
+
|
6
|
+
yui = SakuraGakuin::Member[:yui_mizuno]
|
7
|
+
|
8
|
+
puts "Name(ja): #{yui.name_ja}"
|
9
|
+
puts "Name(en): #{yui.name_en}"
|
10
|
+
puts "Nicknames: #{yui.nicknames.join(" ")}"
|
11
|
+
puts "Birthday: #{yui.birthday}"
|
12
|
+
puts "Age: #{yui.age}"
|
13
|
+
puts "Birthplace: #{yui.birthplace}"
|
14
|
+
puts "DiaryURL: #{yui.diary_url}"
|
15
|
+
puts
|
16
|
+
|
17
|
+
puts "Heights:"
|
18
|
+
yui.heights.each do |date, height|
|
19
|
+
puts " #{date}: #{height}"
|
20
|
+
end
|
21
|
+
puts
|
22
|
+
|
23
|
+
puts "AdmissionDate: #{yui.admission_date}"
|
24
|
+
puts "GraduationDate: #{yui.graduation_date}"
|
25
|
+
puts
|
26
|
+
|
27
|
+
puts "Introductions:"
|
28
|
+
yui.introductions.each do |year, introduction|
|
29
|
+
puts " #{year}:"
|
30
|
+
puts introduction.gsub(/^/, " ")
|
31
|
+
end
|
32
|
+
puts
|
33
|
+
|
34
|
+
puts "Attendances:"
|
35
|
+
yui.attendances.each do |year, attendance|
|
36
|
+
puts " #{year}: #{attendance}"
|
37
|
+
end
|
38
|
+
puts
|
39
|
+
|
40
|
+
puts "Clubs:"
|
41
|
+
yui.club_members.each do |club_member|
|
42
|
+
puts " #{club_member.name} in #{club_member.club.name}(#{club_member.admission_date}〜#{club_member.graduation_date})"
|
43
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
require 'sakura_gakuin/yaml_loadable'
|
2
|
+
|
3
|
+
module SakuraGakuin
|
4
|
+
class Club
|
5
|
+
include YamlLoadable
|
6
|
+
|
7
|
+
yaml_load "config/clubs.yml"
|
8
|
+
|
9
|
+
primary_key :club_name_en
|
10
|
+
|
11
|
+
|
12
|
+
# club
|
13
|
+
|
14
|
+
attr_reader :club_name_ja
|
15
|
+
attr_reader :club_name_en
|
16
|
+
alias :club :club_name_ja
|
17
|
+
|
18
|
+
attr_reader :group_name_ja
|
19
|
+
attr_reader :group_name_en
|
20
|
+
alias :group :group_name_ja
|
21
|
+
|
22
|
+
def name_ja(separator=" ")
|
23
|
+
"#{club_name_ja}#{separator}#{group_name_ja}"
|
24
|
+
end
|
25
|
+
|
26
|
+
def name_en(separator=" ")
|
27
|
+
"#{club_name_en}#{separator}#{group_name_en}"
|
28
|
+
end
|
29
|
+
|
30
|
+
alias :name :name_ja
|
31
|
+
|
32
|
+
|
33
|
+
# relations
|
34
|
+
|
35
|
+
def club_members
|
36
|
+
ClubMember.index_search(:club_id, id)
|
37
|
+
end
|
38
|
+
|
39
|
+
def members
|
40
|
+
club_members.map(&:member)
|
41
|
+
end
|
42
|
+
|
43
|
+
def active_club_members(date=Date.today)
|
44
|
+
club_members.select{|club_member| club_member.active?(date)}
|
45
|
+
end
|
46
|
+
|
47
|
+
def active_members(date=Date.today)
|
48
|
+
active_club_members.map(&:member)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
require 'sakura_gakuin/yaml_loadable'
|
2
|
+
|
3
|
+
module SakuraGakuin
|
4
|
+
class ClubMember
|
5
|
+
include YamlLoadable
|
6
|
+
|
7
|
+
yaml_load "config/club_members.yml"
|
8
|
+
|
9
|
+
primary_key :club_id, :member_id
|
10
|
+
create_index :club_id
|
11
|
+
create_index :member_id
|
12
|
+
|
13
|
+
|
14
|
+
# club personal data
|
15
|
+
|
16
|
+
attr_reader :club_id
|
17
|
+
attr_reader :member_id
|
18
|
+
|
19
|
+
def name_ja
|
20
|
+
@name_ja || member.name_ja
|
21
|
+
end
|
22
|
+
|
23
|
+
def name_en
|
24
|
+
@name_en || member.name_en
|
25
|
+
end
|
26
|
+
|
27
|
+
alias :name :name_ja
|
28
|
+
|
29
|
+
attr_reader :admission_date
|
30
|
+
attr_reader :graduation_date
|
31
|
+
|
32
|
+
def admitted?(date=Date.today)
|
33
|
+
admission_date<=date
|
34
|
+
end
|
35
|
+
|
36
|
+
def graduated?(date=Date.today)
|
37
|
+
graduation_date && graduation_date<date
|
38
|
+
end
|
39
|
+
|
40
|
+
def active?(date=Date.today)
|
41
|
+
admitted?(date) && !graduated?(date)
|
42
|
+
end
|
43
|
+
|
44
|
+
|
45
|
+
# relations
|
46
|
+
|
47
|
+
def club
|
48
|
+
Club[club_id]
|
49
|
+
end
|
50
|
+
|
51
|
+
def member
|
52
|
+
Member[member_id]
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'date'
|
2
|
+
|
3
|
+
module SakuraGakuin
|
4
|
+
class DateHash < Hash
|
5
|
+
attr_reader :sorted_keys
|
6
|
+
@sorted_keys = []
|
7
|
+
|
8
|
+
def []=(key, value)
|
9
|
+
super(key, value)
|
10
|
+
@sorted_keys = keys.sort
|
11
|
+
@pure_hash = nil
|
12
|
+
end
|
13
|
+
|
14
|
+
def [](key)
|
15
|
+
case key
|
16
|
+
when Date
|
17
|
+
else
|
18
|
+
key = Date.parse(key.to_s)
|
19
|
+
end
|
20
|
+
|
21
|
+
pre_key = nil
|
22
|
+
@sorted_keys.each do |k|
|
23
|
+
break if key<k
|
24
|
+
pre_key = k
|
25
|
+
end
|
26
|
+
|
27
|
+
super(pre_key)
|
28
|
+
end
|
29
|
+
|
30
|
+
def each(&block)
|
31
|
+
enum = Enumerator.new {
|
32
|
+
@sorted_keys.each do |key|
|
33
|
+
yield [key, self[key]]
|
34
|
+
end
|
35
|
+
}
|
36
|
+
enum.each(&block)
|
37
|
+
end
|
38
|
+
|
39
|
+
def to_hash
|
40
|
+
@pure_hash ||= Hash[self]
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,119 @@
|
|
1
|
+
require 'sakura_gakuin/date_hash'
|
2
|
+
require 'sakura_gakuin/yaml_loadable'
|
3
|
+
|
4
|
+
module SakuraGakuin
|
5
|
+
class Member
|
6
|
+
include YamlLoadable
|
7
|
+
|
8
|
+
yaml_load "config/members.yml"
|
9
|
+
|
10
|
+
primary_key :firstname_en, :lastname_en
|
11
|
+
|
12
|
+
|
13
|
+
# personal data
|
14
|
+
|
15
|
+
attr_reader :firstname_ja
|
16
|
+
attr_reader :firstname_kana
|
17
|
+
attr_reader :firstname_en
|
18
|
+
alias :firstname :firstname_ja
|
19
|
+
|
20
|
+
attr_reader :lastname_ja
|
21
|
+
attr_reader :lastname_kana
|
22
|
+
attr_reader :lastname_en
|
23
|
+
alias :lastname :lastname_ja
|
24
|
+
|
25
|
+
def name_ja(separator="")
|
26
|
+
"#{lastname_ja}#{separator}#{firstname_ja}"
|
27
|
+
end
|
28
|
+
|
29
|
+
def name_en(separator=" ", reverse=false)
|
30
|
+
if reverse
|
31
|
+
"#{firstname_en}#{separator}#{lastname_en}"
|
32
|
+
else
|
33
|
+
"#{lastname_en}#{separator}#{firstname_en}"
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
alias :name :name_ja
|
38
|
+
|
39
|
+
attr_reader :nicknames
|
40
|
+
|
41
|
+
attr_reader :birthday
|
42
|
+
|
43
|
+
def age(date=Date.today)
|
44
|
+
birthday_md = Date.new(date.year, birthday.month, birthday.day)
|
45
|
+
date.year - birthday.year - (date < birthday_md ? 1 : 0)
|
46
|
+
end
|
47
|
+
|
48
|
+
attr_reader :birthplace_ja
|
49
|
+
attr_reader :birthplace_en
|
50
|
+
alias :birthplace :birthplace_ja
|
51
|
+
|
52
|
+
|
53
|
+
# heights data
|
54
|
+
|
55
|
+
attr_reader :heights
|
56
|
+
|
57
|
+
def month_heights
|
58
|
+
@month_heights ||= heights.inject(DateHash.new){|h, (date, height)|
|
59
|
+
date = Date.new(date.year, date.month, 1)
|
60
|
+
h[date] = height
|
61
|
+
h
|
62
|
+
}
|
63
|
+
end
|
64
|
+
|
65
|
+
def month_height(date=Date.today)
|
66
|
+
month_heights[date]
|
67
|
+
end
|
68
|
+
|
69
|
+
def height(date=Date.today)
|
70
|
+
heights[date]
|
71
|
+
end
|
72
|
+
|
73
|
+
|
74
|
+
# sakrua data
|
75
|
+
|
76
|
+
attr_reader :admission_date
|
77
|
+
attr_reader :graduation_date
|
78
|
+
|
79
|
+
def admitted?(date=Date.today)
|
80
|
+
admission_date<=date
|
81
|
+
end
|
82
|
+
|
83
|
+
def graduated?(date=Date.today)
|
84
|
+
graduation_date && graduation_date<date
|
85
|
+
end
|
86
|
+
|
87
|
+
def active?(date=Date.today)
|
88
|
+
admitted?(date) && !graduated?(date)
|
89
|
+
end
|
90
|
+
|
91
|
+
attr_reader :diary_theme
|
92
|
+
|
93
|
+
def diary_url
|
94
|
+
"http://ameblo.jp/sakuragakuin/theme-#{diary_theme}.html"
|
95
|
+
end
|
96
|
+
|
97
|
+
attr_reader :introductions
|
98
|
+
attr_reader :attendances
|
99
|
+
|
100
|
+
|
101
|
+
# relations
|
102
|
+
|
103
|
+
def club_members
|
104
|
+
ClubMember.index_search(:member_id, id)
|
105
|
+
end
|
106
|
+
|
107
|
+
def clubs
|
108
|
+
club_members.map(&:club)
|
109
|
+
end
|
110
|
+
|
111
|
+
def active_club_members(date=Date.today)
|
112
|
+
club_members.select{|club_member| club_member.active?(date)}
|
113
|
+
end
|
114
|
+
|
115
|
+
def active_clubs(date=Date.today)
|
116
|
+
active_club_members.map(&:club)
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
require 'active_support/concern'
|
3
|
+
|
4
|
+
module SakuraGakuin
|
5
|
+
module YamlLoadable
|
6
|
+
extend ActiveSupport::Concern
|
7
|
+
|
8
|
+
included do
|
9
|
+
@data = []
|
10
|
+
@indexes = {}
|
11
|
+
@index_values = {}
|
12
|
+
|
13
|
+
attr_reader :id
|
14
|
+
create_index(:id, true)
|
15
|
+
end
|
16
|
+
|
17
|
+
module ClassMethods
|
18
|
+
include Enumerable
|
19
|
+
|
20
|
+
def yaml_load(path)
|
21
|
+
unless path.start_with?("/")
|
22
|
+
base = File.expand_path("../..", File.dirname(__FILE__))
|
23
|
+
path = File.expand_path(path, base)
|
24
|
+
end
|
25
|
+
|
26
|
+
@data = File.open(path){|f| YAML.load_documents(f)}
|
27
|
+
@index_values = {}
|
28
|
+
end
|
29
|
+
|
30
|
+
def primary_key(*keys)
|
31
|
+
define_method(:id, ->() {
|
32
|
+
@id ||= keys.map{|k| send(k)}.join("_").downcase.gsub(" ", "_").to_sym
|
33
|
+
})
|
34
|
+
end
|
35
|
+
|
36
|
+
def create_index(key, uniq=false)
|
37
|
+
@indexes[key] = ->(val) {
|
38
|
+
unless @index_values[key]
|
39
|
+
if uniq
|
40
|
+
@index_values[key] = Hash[@data.map{|item| [item.send(key), item]}]
|
41
|
+
else
|
42
|
+
@index_values[key] = @data.group_by{|item| item.send(key)}
|
43
|
+
end
|
44
|
+
end
|
45
|
+
@index_values[key][val]
|
46
|
+
}
|
47
|
+
@index_values.delete(key)
|
48
|
+
end
|
49
|
+
|
50
|
+
def index_search(key, val)
|
51
|
+
@indexes[key][val]
|
52
|
+
end
|
53
|
+
|
54
|
+
def each(&block)
|
55
|
+
@data.each(&block)
|
56
|
+
end
|
57
|
+
|
58
|
+
def [](id)
|
59
|
+
index_search(:id, id)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'sakura_gakuin/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "sakura_gakuin"
|
8
|
+
spec.version = SakuraGakuin::VERSION
|
9
|
+
spec.authors = ["Yoshida Tetsuya"]
|
10
|
+
spec.email = ["yoshida.eth0@gmail.com"]
|
11
|
+
spec.description = %q{All about a limited growth period only Japanese idol Sakura Gakuin.}
|
12
|
+
spec.summary = %q{All about a limited growth period only Japanese idol Sakura Gakuin.}
|
13
|
+
spec.homepage = "https://github.com/yoshida-eth0/ruby-sakura_gakuin"
|
14
|
+
spec.license = "MIT"
|
15
|
+
|
16
|
+
spec.files = `git ls-files`.split($/)
|
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.3"
|
22
|
+
spec.add_development_dependency "rake"
|
23
|
+
|
24
|
+
spec.add_dependency "active_support"
|
25
|
+
end
|
metadata
ADDED
@@ -0,0 +1,109 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: sakura_gakuin
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Yoshida Tetsuya
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-02-27 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.3'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ~>
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.3'
|
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: active_support
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - '>='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
description: All about a limited growth period only Japanese idol Sakura Gakuin.
|
56
|
+
email:
|
57
|
+
- yoshida.eth0@gmail.com
|
58
|
+
executables: []
|
59
|
+
extensions: []
|
60
|
+
extra_rdoc_files: []
|
61
|
+
files:
|
62
|
+
- .gitignore
|
63
|
+
- Gemfile
|
64
|
+
- LICENSE.txt
|
65
|
+
- README.md
|
66
|
+
- Rakefile
|
67
|
+
- config/club_members.yml
|
68
|
+
- config/clubs.yml
|
69
|
+
- config/members.yml
|
70
|
+
- example/clubs_and_members.rb
|
71
|
+
- example/dump_clubs.rb
|
72
|
+
- example/dump_members.rb
|
73
|
+
- example/heights_transition_table.rb
|
74
|
+
- example/heights_transition_table_html.rb
|
75
|
+
- example/over_the_ayami.rb
|
76
|
+
- example/yui_profile.rb
|
77
|
+
- lib/sakura_gakuin.rb
|
78
|
+
- lib/sakura_gakuin/club.rb
|
79
|
+
- lib/sakura_gakuin/club_member.rb
|
80
|
+
- lib/sakura_gakuin/date_hash.rb
|
81
|
+
- lib/sakura_gakuin/member.rb
|
82
|
+
- lib/sakura_gakuin/version.rb
|
83
|
+
- lib/sakura_gakuin/yaml_loadable.rb
|
84
|
+
- sakura_gakuin.gemspec
|
85
|
+
homepage: https://github.com/yoshida-eth0/ruby-sakura_gakuin
|
86
|
+
licenses:
|
87
|
+
- MIT
|
88
|
+
metadata: {}
|
89
|
+
post_install_message:
|
90
|
+
rdoc_options: []
|
91
|
+
require_paths:
|
92
|
+
- lib
|
93
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
94
|
+
requirements:
|
95
|
+
- - '>='
|
96
|
+
- !ruby/object:Gem::Version
|
97
|
+
version: '0'
|
98
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
99
|
+
requirements:
|
100
|
+
- - '>='
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: '0'
|
103
|
+
requirements: []
|
104
|
+
rubyforge_project:
|
105
|
+
rubygems_version: 2.0.0
|
106
|
+
signing_key:
|
107
|
+
specification_version: 4
|
108
|
+
summary: All about a limited growth period only Japanese idol Sakura Gakuin.
|
109
|
+
test_files: []
|