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.
@@ -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,3 @@
1
+ module SakuraGakuin
2
+ VERSION = "1.0.0"
3
+ 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,7 @@
1
+ require 'sakura_gakuin/member'
2
+ require 'sakura_gakuin/club'
3
+ require 'sakura_gakuin/club_member'
4
+ require 'sakura_gakuin/version'
5
+
6
+ module SakuraGakuin
7
+ 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: []