meibo 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/lib/meibo/academic_session_set.rb +1 -1
- data/lib/meibo/builder.rb +4 -4
- data/lib/meibo/classroom_set.rb +3 -10
- data/lib/meibo/course_set.rb +2 -8
- data/lib/meibo/data_set.rb +5 -2
- data/lib/meibo/demographic_set.rb +1 -6
- data/lib/meibo/enrollment_set.rb +3 -10
- data/lib/meibo/factory_bot/all.rb +1 -1
- data/lib/meibo/factory_bot/{memory_package.rb → roster.rb} +1 -3
- data/lib/meibo/factory_bot/user.rb +8 -0
- data/lib/meibo/japan_profile/academic_session.rb +1 -1
- data/lib/meibo/japan_profile/classroom.rb +4 -2
- data/lib/meibo/japan_profile/course.rb +1 -1
- data/lib/meibo/japan_profile/demographic.rb +1 -1
- data/lib/meibo/japan_profile/enrollment.rb +1 -1
- data/lib/meibo/japan_profile/organization.rb +1 -1
- data/lib/meibo/japan_profile/role.rb +1 -1
- data/lib/meibo/japan_profile/user.rb +1 -1
- data/lib/meibo/japan_profile/user_set.rb +16 -0
- data/lib/meibo/japan_profile.rb +15 -17
- data/lib/meibo/organization_set.rb +1 -1
- data/lib/meibo/{base_profile.rb → profile.rb} +29 -5
- data/lib/meibo/reader.rb +1 -1
- data/lib/meibo/role_set.rb +3 -10
- data/lib/meibo/roster.rb +15 -11
- data/lib/meibo/user.rb +1 -1
- data/lib/meibo/user_profile_set.rb +1 -6
- data/lib/meibo/user_set.rb +2 -7
- data/lib/meibo/version.rb +1 -1
- metadata +5 -5
- data/lib/meibo/japan_profile/user_profile.rb +0 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 21b36f34e47cc0cf3e7ec35cf14f2e0ec6e9b3ba42f12286b18b72f2d7c680fe
|
4
|
+
data.tar.gz: e576cb1930c7e2df3aac74b0a3810c7cf7013f25238fbe16ab763b87f66d6046
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: de81e72cff7f4fc8817d818fe211e3d7a6e83966b20bfde5de6c579d059d122ced9a98709acf37e7e997b1b3aeea5ac7f62a29b07bc7b3d9300744ce48f3a56d
|
7
|
+
data.tar.gz: 58c35c5ae0e31e6981816219fe893cc294336b6c58bb99a3c62227d77e063c86bf29c536165ccd7eaa22643db1d280ab85cf17cd511d8a9deb13e45c0f822adb
|
data/Gemfile.lock
CHANGED
data/lib/meibo/builder.rb
CHANGED
@@ -6,12 +6,12 @@ module Meibo
|
|
6
6
|
class Builder
|
7
7
|
extend Forwardable
|
8
8
|
|
9
|
-
attr_reader :
|
9
|
+
attr_reader :roster, :profile
|
10
10
|
|
11
|
-
def_delegators :@
|
11
|
+
def_delegators :@roster, :academic_sessions, :classes, :courses, :demographics, :enrollments, :organizations, :roles, :users, :user_profiles
|
12
12
|
|
13
|
-
def initialize(
|
14
|
-
@
|
13
|
+
def initialize(roster:, profile: Profile.new)
|
14
|
+
@roster = roster
|
15
15
|
@profile = profile
|
16
16
|
end
|
17
17
|
|
data/lib/meibo/classroom_set.rb
CHANGED
@@ -2,26 +2,19 @@
|
|
2
2
|
|
3
3
|
module Meibo
|
4
4
|
class ClassroomSet < DataSet
|
5
|
-
def initialize(data, academic_session_set:, course_set:, organization_set:)
|
6
|
-
super(data)
|
7
|
-
@academic_session_set = academic_session_set
|
8
|
-
@course_set = course_set
|
9
|
-
@organization_set = organization_set
|
10
|
-
end
|
11
|
-
|
12
5
|
def check_semantically_consistent
|
13
6
|
super
|
14
7
|
|
15
8
|
each do |classroom|
|
16
|
-
|
17
|
-
|
9
|
+
roster.organizations.find(classroom.school_sourced_id)
|
10
|
+
roster.courses.find(classroom.course_sourced_id)
|
18
11
|
|
19
12
|
if classroom.term_sourced_ids.empty?
|
20
13
|
raise DataNotFoundError, "termSourcedIdは1つ以上指定してください"
|
21
14
|
end
|
22
15
|
|
23
16
|
classroom.term_sourced_ids.each do |term_sourced_id|
|
24
|
-
|
17
|
+
roster.academic_sessions.find(term_sourced_id)
|
25
18
|
end
|
26
19
|
end
|
27
20
|
end
|
data/lib/meibo/course_set.rb
CHANGED
@@ -2,21 +2,15 @@
|
|
2
2
|
|
3
3
|
module Meibo
|
4
4
|
class CourseSet < DataSet
|
5
|
-
def initialize(data, academic_session_set:, organization_set:)
|
6
|
-
super(data)
|
7
|
-
@academic_session_set = academic_session_set
|
8
|
-
@organization_set = organization_set
|
9
|
-
end
|
10
|
-
|
11
5
|
def check_semantically_consistent
|
12
6
|
super
|
13
7
|
|
14
8
|
each do |course|
|
15
9
|
if course.school_year_sourced_id
|
16
|
-
|
10
|
+
roster.academic_sessions.find(course.school_year_sourced_id)
|
17
11
|
end
|
18
12
|
|
19
|
-
|
13
|
+
roster.organizations.find(course.org_sourced_id)
|
20
14
|
end
|
21
15
|
end
|
22
16
|
end
|
data/lib/meibo/data_set.rb
CHANGED
@@ -1,8 +1,11 @@
|
|
1
1
|
module Meibo
|
2
2
|
class DataSet
|
3
|
-
|
3
|
+
attr_reader :roster
|
4
|
+
|
5
|
+
def initialize(data, roster:)
|
4
6
|
@data = data
|
5
7
|
@data_hash = data.to_h {|datum| [datum.sourced_id, datum] }
|
8
|
+
@roster = roster
|
6
9
|
end
|
7
10
|
|
8
11
|
def <<(new_data)
|
@@ -31,7 +34,7 @@ module Meibo
|
|
31
34
|
@data.empty?
|
32
35
|
end
|
33
36
|
|
34
|
-
def
|
37
|
+
def find(sourced_id)
|
35
38
|
@data_hash.fetch(sourced_id)
|
36
39
|
rescue KeyError
|
37
40
|
raise DataNotFoundError, "sourcedId: #{sourced_id} が見つかりません"
|
@@ -2,16 +2,11 @@
|
|
2
2
|
|
3
3
|
module Meibo
|
4
4
|
class DemographicSet < DataSet
|
5
|
-
def initialize(data, user_set:)
|
6
|
-
super(data)
|
7
|
-
@user_set = user_set
|
8
|
-
end
|
9
|
-
|
10
5
|
def check_semantically_consistent
|
11
6
|
super
|
12
7
|
|
13
8
|
each do |demographic|
|
14
|
-
|
9
|
+
roster.users.find(demographic.sourced_id)
|
15
10
|
end
|
16
11
|
end
|
17
12
|
end
|
data/lib/meibo/enrollment_set.rb
CHANGED
@@ -2,20 +2,13 @@
|
|
2
2
|
|
3
3
|
module Meibo
|
4
4
|
class EnrollmentSet < DataSet
|
5
|
-
def initialize(data, classroom_set:, organization_set:, user_set:)
|
6
|
-
super(data)
|
7
|
-
@classroom_set = classroom_set
|
8
|
-
@organization_set = organization_set
|
9
|
-
@user_set = user_set
|
10
|
-
end
|
11
|
-
|
12
5
|
def check_semantically_consistent
|
13
6
|
super
|
14
7
|
|
15
8
|
each do |enrollment|
|
16
|
-
|
17
|
-
|
18
|
-
|
9
|
+
roster.classes.find(enrollment.class_sourced_id)
|
10
|
+
roster.organizations.find(enrollment.school_sourced_id)
|
11
|
+
roster.users.find(enrollment.user_sourced_id)
|
19
12
|
end
|
20
13
|
end
|
21
14
|
end
|
@@ -6,8 +6,8 @@ require 'meibo/factory_bot/course'
|
|
6
6
|
require 'meibo/factory_bot/demographic'
|
7
7
|
require 'meibo/factory_bot/enrollment'
|
8
8
|
require 'meibo/factory_bot/manifest'
|
9
|
-
require 'meibo/factory_bot/memory_package'
|
10
9
|
require 'meibo/factory_bot/organization'
|
11
10
|
require 'meibo/factory_bot/role'
|
11
|
+
require 'meibo/factory_bot/roster'
|
12
12
|
require 'meibo/factory_bot/user_profile'
|
13
13
|
require 'meibo/factory_bot/user'
|
@@ -19,4 +19,12 @@ FactoryBot.define do
|
|
19
19
|
agent_sourced_ids { agents&.map(&:sourced_id) }
|
20
20
|
primary_org_sourced_id { primary_organization&.sourced_id }
|
21
21
|
end
|
22
|
+
|
23
|
+
factory :meibo_jp_user, class: 'Meibo::JapanProfile::User', parent: :meibo_user do
|
24
|
+
transient do
|
25
|
+
homeroom { nil }
|
26
|
+
end
|
27
|
+
|
28
|
+
home_class { homeroom&.sourced_id }
|
29
|
+
end
|
22
30
|
end
|
@@ -1,11 +1,13 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Meibo
|
4
|
-
|
4
|
+
class JapanProfile < ::Meibo::Profile
|
5
5
|
class Classroom < ::Meibo::Classroom
|
6
6
|
DataModel.define(
|
7
7
|
self,
|
8
|
-
attribute_name_to_header_field_map: superclass.attribute_name_to_header_field_map.merge(
|
8
|
+
attribute_name_to_header_field_map: superclass.attribute_name_to_header_field_map.merge(
|
9
|
+
special_needs: 'metadata.jp.specialNeeds'
|
10
|
+
).freeze,
|
9
11
|
converters: superclass.converters.merge(
|
10
12
|
boolean: [:special_needs].freeze,
|
11
13
|
enum: { class_type: TYPES.values.freeze }.freeze
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Meibo
|
4
|
+
class JapanProfile < ::Meibo::Profile
|
5
|
+
class UserSet < ::Meibo::UserSet
|
6
|
+
def check_semantically_consistent
|
7
|
+
super
|
8
|
+
each do |user|
|
9
|
+
if user.home_class
|
10
|
+
roster.classes.find(user.home_class)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
data/lib/meibo/japan_profile.rb
CHANGED
@@ -1,9 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Meibo
|
4
|
-
|
5
|
-
include BaseProfile
|
6
|
-
|
4
|
+
class JapanProfile < ::Meibo::Profile
|
7
5
|
BUILDERS = {
|
8
6
|
academic_session: Builder::AcademicSessionBuilder.create(AcademicSession),
|
9
7
|
class: Builder::ClassroomBuilder.create(Classroom),
|
@@ -17,23 +15,23 @@ module Meibo
|
|
17
15
|
}
|
18
16
|
|
19
17
|
DATA_MODELS = {
|
20
|
-
file_academic_sessions:
|
21
|
-
file_classes:
|
22
|
-
file_courses:
|
23
|
-
file_demographics:
|
24
|
-
file_enrollments:
|
25
|
-
file_orgs:
|
26
|
-
file_roles:
|
27
|
-
file_user_profiles:
|
28
|
-
file_users:
|
18
|
+
file_academic_sessions: AcademicSession,
|
19
|
+
file_classes: Classroom,
|
20
|
+
file_courses: Course,
|
21
|
+
file_demographics: Demographic,
|
22
|
+
file_enrollments: Enrollment,
|
23
|
+
file_orgs: Organization,
|
24
|
+
file_roles: Role,
|
25
|
+
file_user_profiles: UserProfile,
|
26
|
+
file_users: User
|
29
27
|
}
|
30
28
|
|
31
|
-
|
32
|
-
|
33
|
-
|
29
|
+
DATA_SET = ::Meibo::Profile::DATA_SET.merge(
|
30
|
+
users: UserSet
|
31
|
+
)
|
34
32
|
|
35
|
-
def
|
36
|
-
|
33
|
+
def initialize(builders: BUILDERS, data_models: DATA_MODELS, data_set: DATA_SET)
|
34
|
+
super
|
37
35
|
end
|
38
36
|
end
|
39
37
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Meibo
|
4
|
-
|
4
|
+
class Profile
|
5
5
|
BUILDERS = {
|
6
6
|
academic_session: Builder::AcademicSessionBuilder.create(AcademicSession),
|
7
7
|
class: Builder::ClassroomBuilder.create(Classroom),
|
@@ -26,12 +26,36 @@ module Meibo
|
|
26
26
|
file_users: Meibo::User
|
27
27
|
}
|
28
28
|
|
29
|
-
|
30
|
-
|
29
|
+
DATA_SET = {
|
30
|
+
academic_sessions: Meibo::AcademicSessionSet,
|
31
|
+
classes: Meibo::ClassroomSet,
|
32
|
+
courses: Meibo::CourseSet,
|
33
|
+
demographics: Meibo::DemographicSet,
|
34
|
+
enrollments: Meibo::EnrollmentSet,
|
35
|
+
orgs: Meibo::OrganizationSet,
|
36
|
+
roles: Meibo::RoleSet,
|
37
|
+
user_profiles: Meibo::UserProfileSet,
|
38
|
+
users: Meibo::UserSet
|
39
|
+
}
|
40
|
+
|
41
|
+
attr_reader :builders, :data_models, :data_set
|
42
|
+
|
43
|
+
def initialize(builders: BUILDERS, data_models: DATA_MODELS, data_set: DATA_SET)
|
44
|
+
@builders = builders
|
45
|
+
@data_models = data_models
|
46
|
+
@data_set = data_set
|
47
|
+
end
|
48
|
+
|
49
|
+
def builder_for(key)
|
50
|
+
builders[key]
|
51
|
+
end
|
52
|
+
|
53
|
+
def data_model_for(file_attribute)
|
54
|
+
data_models[file_attribute]
|
31
55
|
end
|
32
56
|
|
33
|
-
def
|
34
|
-
|
57
|
+
def data_set_for(name)
|
58
|
+
data_set[name]
|
35
59
|
end
|
36
60
|
end
|
37
61
|
end
|
data/lib/meibo/reader.rb
CHANGED
data/lib/meibo/role_set.rb
CHANGED
@@ -2,22 +2,15 @@
|
|
2
2
|
|
3
3
|
module Meibo
|
4
4
|
class RoleSet < DataSet
|
5
|
-
def initialize(data, organization_set:, user_set:, user_profile_set:)
|
6
|
-
super(data)
|
7
|
-
@organization_set = organization_set
|
8
|
-
@user_set = user_set
|
9
|
-
@user_profile_set = user_profile_set
|
10
|
-
end
|
11
|
-
|
12
5
|
def check_semantically_consistent
|
13
6
|
super
|
14
7
|
|
15
8
|
each do |role|
|
16
|
-
|
17
|
-
|
9
|
+
roster.organizations.find(role.org_sourced_id)
|
10
|
+
roster.users.find(role.user_sourced_id)
|
18
11
|
|
19
12
|
if role.user_profile_sourced_id
|
20
|
-
|
13
|
+
roster.user_profiles.find(role.user_profile_sourced_id)
|
21
14
|
end
|
22
15
|
end
|
23
16
|
end
|
data/lib/meibo/roster.rb
CHANGED
@@ -6,7 +6,7 @@ require 'csv'
|
|
6
6
|
module Meibo
|
7
7
|
class Roster
|
8
8
|
class << self
|
9
|
-
def from_file(file_path, profile:
|
9
|
+
def from_file(file_path, profile: Profile.new)
|
10
10
|
Reader.open(file_path, profile: profile) do |reader|
|
11
11
|
begin
|
12
12
|
manifest = reader.manifest
|
@@ -66,18 +66,22 @@ module Meibo
|
|
66
66
|
|
67
67
|
attr_reader :profile, :manifest_properties, :academic_sessions, :classes, :courses, :demographics, :enrollments, :organizations, :roles, :user_profiles, :users
|
68
68
|
|
69
|
-
def initialize(profile:
|
69
|
+
def initialize(profile: Profile.new, manifest_properties: {}, academic_sessions: [], classes: [], courses: [], demographics: [], enrollments: [], organizations: [], roles: [], user_profiles: [], users: [])
|
70
70
|
@profile = profile
|
71
71
|
@manifest_properties = manifest_properties
|
72
|
-
@academic_sessions = AcademicSessionSet.new(academic_sessions)
|
73
|
-
@organizations = OrganizationSet.new(organizations)
|
74
|
-
@courses = CourseSet.new(courses,
|
75
|
-
@classes = ClassroomSet.new(classes,
|
76
|
-
@users = UserSet.new(users,
|
77
|
-
@demographics = DemographicSet.new(demographics,
|
78
|
-
@user_profiles = UserProfileSet.new(user_profiles,
|
79
|
-
@roles = RoleSet.new(roles,
|
80
|
-
@enrollments = EnrollmentSet.new(enrollments,
|
72
|
+
@academic_sessions = AcademicSessionSet.new(academic_sessions, roster: self)
|
73
|
+
@organizations = OrganizationSet.new(organizations, roster: self)
|
74
|
+
@courses = CourseSet.new(courses, roster: self)
|
75
|
+
@classes = ClassroomSet.new(classes, roster: self)
|
76
|
+
@users = UserSet.new(users, roster: self)
|
77
|
+
@demographics = DemographicSet.new(demographics, roster: self)
|
78
|
+
@user_profiles = UserProfileSet.new(user_profiles, roster: self)
|
79
|
+
@roles = RoleSet.new(roles, roster: self)
|
80
|
+
@enrollments = EnrollmentSet.new(enrollments, roster: self)
|
81
|
+
end
|
82
|
+
|
83
|
+
def builder
|
84
|
+
Builder.new(roster: self, profile: profile)
|
81
85
|
end
|
82
86
|
|
83
87
|
def check_semantically_consistent
|
data/lib/meibo/user.rb
CHANGED
@@ -41,7 +41,7 @@ module Meibo
|
|
41
41
|
}.freeze
|
42
42
|
)
|
43
43
|
|
44
|
-
def initialize(sourced_id:, status: nil, date_last_modified: nil, enabled_user: nil, username:, user_ids: nil, given_name:, family_name:, middle_name: nil, identifier: nil, email: nil, sms: nil, phone: nil, agent_sourced_ids: [], grades: nil, password: nil, user_master_identifier: nil, resource_sourced_ids: nil, preferred_given_name: nil, preferred_middle_name: nil, preferred_family_name: nil, primary_org_sourced_id: nil, pronouns: nil,
|
44
|
+
def initialize(sourced_id:, status: nil, date_last_modified: nil, enabled_user: nil, username:, user_ids: nil, given_name:, family_name:, middle_name: nil, identifier: nil, email: nil, sms: nil, phone: nil, agent_sourced_ids: [], grades: nil, password: nil, user_master_identifier: nil, resource_sourced_ids: nil, preferred_given_name: nil, preferred_middle_name: nil, preferred_family_name: nil, primary_org_sourced_id: nil, pronouns: nil, **extension_fields)
|
45
45
|
@sourced_id = sourced_id
|
46
46
|
@status = status
|
47
47
|
@date_last_modified = date_last_modified
|
@@ -2,16 +2,11 @@
|
|
2
2
|
|
3
3
|
module Meibo
|
4
4
|
class UserProfileSet < DataSet
|
5
|
-
def initialize(data, user_set:)
|
6
|
-
super(data)
|
7
|
-
@user_set = user_set
|
8
|
-
end
|
9
|
-
|
10
5
|
def check_semantically_consistent
|
11
6
|
super
|
12
7
|
|
13
8
|
each do |user_profile|
|
14
|
-
|
9
|
+
roster.users.find(user_profile.user_sourced_id)
|
15
10
|
end
|
16
11
|
end
|
17
12
|
end
|
data/lib/meibo/user_set.rb
CHANGED
@@ -2,21 +2,16 @@
|
|
2
2
|
|
3
3
|
module Meibo
|
4
4
|
class UserSet < DataSet
|
5
|
-
def initialize(data, organization_set:)
|
6
|
-
super(data)
|
7
|
-
@organization_set = organization_set
|
8
|
-
end
|
9
|
-
|
10
5
|
def check_semantically_consistent
|
11
6
|
super
|
12
7
|
|
13
8
|
each do |user|
|
14
9
|
if user.primary_org_sourced_id
|
15
|
-
|
10
|
+
roster.organizations.find(user.primary_org_sourced_id)
|
16
11
|
end
|
17
12
|
|
18
13
|
user.agent_sourced_ids.each do |agent_sourced_id|
|
19
|
-
|
14
|
+
find(agent_sourced_id)
|
20
15
|
end
|
21
16
|
end
|
22
17
|
end
|
data/lib/meibo/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: meibo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Seiei Miyagi
|
@@ -57,7 +57,6 @@ files:
|
|
57
57
|
- lib/meibo.rb
|
58
58
|
- lib/meibo/academic_session.rb
|
59
59
|
- lib/meibo/academic_session_set.rb
|
60
|
-
- lib/meibo/base_profile.rb
|
61
60
|
- lib/meibo/builder.rb
|
62
61
|
- lib/meibo/builder/academic_session_builder.rb
|
63
62
|
- lib/meibo/builder/base_builder.rb
|
@@ -88,9 +87,9 @@ files:
|
|
88
87
|
- lib/meibo/factory_bot/demographic.rb
|
89
88
|
- lib/meibo/factory_bot/enrollment.rb
|
90
89
|
- lib/meibo/factory_bot/manifest.rb
|
91
|
-
- lib/meibo/factory_bot/memory_package.rb
|
92
90
|
- lib/meibo/factory_bot/organization.rb
|
93
91
|
- lib/meibo/factory_bot/role.rb
|
92
|
+
- lib/meibo/factory_bot/roster.rb
|
94
93
|
- lib/meibo/factory_bot/user.rb
|
95
94
|
- lib/meibo/factory_bot/user_profile.rb
|
96
95
|
- lib/meibo/japan_profile.rb
|
@@ -102,11 +101,12 @@ files:
|
|
102
101
|
- lib/meibo/japan_profile/organization.rb
|
103
102
|
- lib/meibo/japan_profile/role.rb
|
104
103
|
- lib/meibo/japan_profile/user.rb
|
105
|
-
- lib/meibo/japan_profile/
|
104
|
+
- lib/meibo/japan_profile/user_set.rb
|
106
105
|
- lib/meibo/manifest.rb
|
107
106
|
- lib/meibo/manifest/processing_mode.rb
|
108
107
|
- lib/meibo/organization.rb
|
109
108
|
- lib/meibo/organization_set.rb
|
109
|
+
- lib/meibo/profile.rb
|
110
110
|
- lib/meibo/reader.rb
|
111
111
|
- lib/meibo/role.rb
|
112
112
|
- lib/meibo/role_set.rb
|
@@ -125,7 +125,7 @@ metadata:
|
|
125
125
|
allowed_push_host: https://rubygems.org/
|
126
126
|
homepage_uri: https://github.com/hanachin/meibo
|
127
127
|
source_code_uri: https://github.com/hanachin/meibo
|
128
|
-
changelog_uri: https://github.com/hanachin/meibo/blob/meibo/v0.
|
128
|
+
changelog_uri: https://github.com/hanachin/meibo/blob/meibo/v0.2.0/CHANGELOG.md
|
129
129
|
post_install_message:
|
130
130
|
rdoc_options: []
|
131
131
|
require_paths:
|