sakura_gakuin 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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: []