github_members 0.0.1 → 0.0.2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f27c99dd181831eb919dead2f515dbdfe8677732df33a529681f3218523fd045
4
- data.tar.gz: 2a8315bd3492878505168b9d6bb1b77f58e5aa50cd7780eece32d48c8fd0e45c
3
+ metadata.gz: b3252336e573db141cb2b04483678c6265eef27c14935fac81f5fc11764c3d68
4
+ data.tar.gz: e7fd29914612158a441f083af6a0a382287b1bf07c56fee013de1d5226a70136
5
5
  SHA512:
6
- metadata.gz: ad928b3fad1ff61336a0c435e113ab534538465144c38f0bd056898018d2ee29b98d52cd63f75191610af477e548cbb197894d159a2f3f0c422f07086ec4a736
7
- data.tar.gz: 90a313c90fa74106671683b6143e84c7189bee49b1262df2ba88062a4b3a7ee6ebb119df07a2255675adb53bdbe2f3e60c15748c7c4a0f0e118ec73d63a195c3
6
+ metadata.gz: 82fb677c50b06554eceb70fa95c798e26f8236aa47ed4af5cc3a82a382d357139f0073852676b456fd48494fb19a8eed42d853789253d6a5da5588884bb544b0
7
+ data.tar.gz: 00b2bd9ad58d25d21a9f4a4cb197d5efa6816cb5a1388418c632fd4996b4271c0cb00d54e54ca4aa0dde2516dc5ed0f16ca9bf1b82de675f352961357ab8a978
data/README.md CHANGED
@@ -1,3 +1,5 @@
1
+ [![Gem Version](https://badge.fury.io/rb/github_members.svg)](https://badge.fury.io/rb/github_members)
2
+
1
3
  # GitHub Members
2
4
 
3
5
  Manage GitHub members who belong to an organization.
@@ -43,6 +45,8 @@ Examples:
43
45
 
44
46
  <!-- HELP:END -->
45
47
 
48
+ You can use also the `github-members` command instead of `github_members`.
49
+
46
50
  ### Prepare GitHub access token
47
51
 
48
52
  By default, only public members of a specified organization is fetched.
@@ -70,3 +74,8 @@ When running `github_members`, a table of a specified organization members is in
70
74
 
71
75
  <!-- GITHUB_MEMBERS:END -->
72
76
  ```
77
+
78
+ ## Releasing
79
+
80
+ 1. Update [`GithubMembers::VERSION`](lib/github_members/version.rb) and commit the updated file.
81
+ 2. Run workflow on [Actions](https://github.com/ybiquitous/github_members/actions/workflows/release.yml).
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require_relative "../lib/github_members"
4
+
5
+ exit GithubMembers::CLI.new(ARGV).run
@@ -1,5 +1,7 @@
1
1
  module GithubMembers
2
2
  class CLI
3
+ class RequiredMemberAttributes < Error; end
4
+
3
5
  EXIT_SUCCESS = 0
4
6
  EXIT_FAILURE = 1
5
7
 
@@ -32,9 +34,18 @@ module GithubMembers
32
34
  return EXIT_FAILURE
33
35
  end
34
36
 
35
- members = read_members
37
+ org = Organization.new(client.fetch_organization(options.github_org))
38
+
39
+ yaml_file = options.yaml_file
40
+ members =
41
+ begin
42
+ read_members(yaml_file)
43
+ rescue RequiredMemberAttributes => e
44
+ warn e.message
45
+ return EXIT_FAILURE
46
+ end
36
47
 
37
- Client.new(options).fetch_members(options.github_org).each do |new_member|
48
+ client.fetch_members(org.name).each do |new_member|
38
49
  github = new_member.fetch(:github)
39
50
  fullname = new_member.fetch(:fullname)
40
51
  avatar = new_member.fetch(:avatar)
@@ -57,29 +68,44 @@ module GithubMembers
57
68
 
58
69
  members.delete_if { |_, m| !m.updated }
59
70
 
60
- write_members(members.values)
71
+ write_members(members.values, yaml_file)
72
+ puts "Updated: #{yaml_file}"
61
73
 
62
- MarkdownWriter.new.write(members: members.values, file: options.markdown_file)
74
+ markdown_file = options.markdown_file
75
+ MarkdownWriter.new.write(org: org, members: members.values, file: markdown_file)
76
+ puts "Updated: #{markdown_file}"
63
77
 
64
78
  EXIT_SUCCESS
65
79
  end
66
80
 
67
- private def member_class
81
+ private
82
+
83
+ def client
84
+ @client ||= Client.new(options)
85
+ end
86
+
87
+ def member_class
68
88
  @member_class ||= Member.new.define_class(*options.fields)
69
89
  end
70
90
 
71
- private def read_members
72
- file = options.yaml_file
91
+ def read_members(file)
73
92
  return {} unless file.exist?
74
93
 
75
- YAML.safe_load(File.read(file)).each_with_object({}) do |member, hash|
76
- m = member_class.new(**member, updated: false)
77
- hash[m.github] = m
94
+ YAML.safe_load(File.read(file)).each_with_object({}) do |member_attrs, hash|
95
+ member = member_class.new(updated: false)
96
+
97
+ required_attrs = member_attrs.keys.map(&:to_sym) - member.members
98
+ unless required_attrs.empty?
99
+ raise RequiredMemberAttributes, "Needed to specify the option: --fields #{required_attrs.join(",")}"
100
+ end
101
+
102
+ member_attrs.each { |key, value| member[key] = value }
103
+ hash[member.github] = member
78
104
  end
79
105
  end
80
106
 
81
- private def write_members(members)
82
- options.yaml_file.write(members.map(&:to_h).to_yaml)
107
+ def write_members(members, file)
108
+ file.write(members.map(&:to_h).to_yaml)
83
109
  end
84
110
  end
85
111
  end
@@ -27,5 +27,15 @@ module GithubMembers
27
27
  }
28
28
  end
29
29
  end
30
+
31
+ def fetch_organization(org)
32
+ Octokit.organization(org).then do |gh_org|
33
+ {
34
+ name: gh_org.login,
35
+ fullname: gh_org.name,
36
+ url: gh_org.html_url
37
+ }
38
+ end
39
+ end
30
40
  end
31
41
  end
@@ -5,7 +5,7 @@ module GithubMembers
5
5
  TAG_BEGIN = "<!-- GITHUB_MEMBERS:BEGIN -->"
6
6
  TAG_END = "<!-- GITHUB_MEMBERS:END -->"
7
7
 
8
- def write(members:, file:)
8
+ def write(org:, members:, file:)
9
9
  unless file.exist?
10
10
  file.write(<<~MARKDOWN)
11
11
  # Members
@@ -16,14 +16,14 @@ module GithubMembers
16
16
  end
17
17
 
18
18
  table = render_table(members)
19
- write_file(table, members.size, file)
19
+ write_file(table, members.size, org, file)
20
20
  end
21
21
 
22
22
  private def render_table(members)
23
23
  return "" if members.empty?
24
24
 
25
25
  fields = members.first.additional_fields
26
- labels = ["", "GitHub", "Fullname"]
26
+ labels = [" ", "GitHub", "Fullname"]
27
27
  align = ["c", "l", "l"]
28
28
 
29
29
  fields.each do |field|
@@ -48,7 +48,7 @@ module GithubMembers
48
48
  MarkdownTables.make_table(labels, data, is_rows: true, align: align)
49
49
  end
50
50
 
51
- private def write_file(table, member_count, file)
51
+ private def write_file(table, member_count, org, file)
52
52
  content = file.read
53
53
 
54
54
  unless content.include?(TAG_BEGIN)
@@ -61,7 +61,7 @@ module GithubMembers
61
61
 
62
62
  content.sub!(/#{TAG_BEGIN}.+#{TAG_END}/mo, <<~MARKDOWN.strip)
63
63
  #{TAG_BEGIN}
64
- **#{member_count}** member#{member_count == 1 ? "" : "s"}
64
+ **#{member_count}** member#{member_count == 1 ? "" : "s"} of [#{org.name}](#{org.url})
65
65
 
66
66
  #{table}
67
67
  #{TAG_END}
@@ -17,7 +17,7 @@ module GithubMembers
17
17
  self.github_token = ENV["GITHUB_TOKEN"].to_s
18
18
 
19
19
  args = parser.parse!(argv)
20
- self.help = parser.help + help_examples
20
+ self.help = parser.help + help_examples(parser.program_name)
21
21
  self.github_org = args.first
22
22
  self.markdown_file = Pathname(markdown_file || Defaults::MARKDOWN_FILE)
23
23
  self.yaml_file = Pathname(yaml_file || Defaults::YAML_FILE)
@@ -27,7 +27,7 @@ module GithubMembers
27
27
 
28
28
  private def parser
29
29
  @parser ||= OptionParser.new do |opts|
30
- opts.banner = "Usage: github_members [options] <org>"
30
+ opts.banner = "Usage: #{opts.program_name} [options] <org>"
31
31
 
32
32
  opts.on("-g", "--github-token GITHUB_TOKEN",
33
33
  "A GitHub access token. The `GITHUB_TOKEN` environment variable",
@@ -57,22 +57,22 @@ module GithubMembers
57
57
  end
58
58
  end
59
59
 
60
- private def help_examples
60
+ private def help_examples(program_name)
61
61
  <<~HELP
62
62
 
63
63
  Examples:
64
64
  # By default
65
- github_members <org>
65
+ #{program_name} <org>
66
66
 
67
67
  # Set a token
68
- GITHUB_TOKEN=*** github_members <org>
69
- github_members <org> -g ***
68
+ GITHUB_TOKEN=*** #{program_name} <org>
69
+ #{program_name} <org> -g ***
70
70
 
71
71
  # Specify files
72
- github_members <org> -m README.md -y company_members.yml
72
+ #{program_name} <org> -m README.md -y company_members.yml
73
73
 
74
74
  # Add fields
75
- github_members <org> -f slack,note
75
+ #{program_name} <org> -f slack,note
76
76
  HELP
77
77
  end
78
78
  end
@@ -0,0 +1,3 @@
1
+ module GithubMembers
2
+ Organization = Struct.new(:name, :fullname, :url, keyword_init: true)
3
+ end
@@ -1,3 +1,3 @@
1
1
  module GithubMembers
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2".freeze
3
3
  end
@@ -9,6 +9,7 @@ require_relative "github_members/defaults"
9
9
  require_relative "github_members/markdown_writer"
10
10
  require_relative "github_members/member"
11
11
  require_relative "github_members/options"
12
+ require_relative "github_members/organization"
12
13
  require_relative "github_members/version"
13
14
 
14
15
  require_relative "github_members/cli"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: github_members
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Masafumi Koba
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-08-27 00:00:00.000000000 Z
11
+ date: 2021-09-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: markdown-tables
@@ -43,12 +43,14 @@ email:
43
43
  - ybiquitous@gmail.com
44
44
  executables:
45
45
  - github_members
46
+ - github-members
46
47
  extensions: []
47
48
  extra_rdoc_files: []
48
49
  files:
49
50
  - CHANGELOG.md
50
51
  - LICENSE
51
52
  - README.md
53
+ - exe/github-members
52
54
  - exe/github_members
53
55
  - lib/github_members.rb
54
56
  - lib/github_members/cli.rb
@@ -58,6 +60,7 @@ files:
58
60
  - lib/github_members/markdown_writer.rb
59
61
  - lib/github_members/member.rb
60
62
  - lib/github_members/options.rb
63
+ - lib/github_members/organization.rb
61
64
  - lib/github_members/version.rb
62
65
  homepage: https://github.com/ybiquitous/github_members
63
66
  licenses: