how_is 12.0.0 → 13.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f94a1942844fecd5d67a87e5bcfa10fa8cfb9218
4
- data.tar.gz: 71f9b9df67822471f710bb78ecec7e8ce7e7c219
3
+ metadata.gz: 7e016f1b7f3e89bf467f6ecedf72a5381ddb1efa
4
+ data.tar.gz: b5a681c62fac3083352a7b998d8dc37e74edd3bd
5
5
  SHA512:
6
- metadata.gz: 4ed0992ecdf4d9a7f4b0351ede0961e3daa82a33d759652b20643b7238fcc515487a4b820c0e4643c95e60f9ee76e1a88566c83f5ea115e4298a24b1b9cac425
7
- data.tar.gz: 1fbe9fd60239c6f478164ffc3feb2e890053a87c7fd44e7cb821da869ca976f881b5c368948c00d9c48f7b4cdd87b6396d35ef039b7ff6ed9f9c2bc51822af10
6
+ metadata.gz: 0a99668e69ed19eacd4e430be5571600fdf55589a5a7261120ae03d8d3af43aa95b445f7385f7f3a4be443df3f3173ec79b639ab9c798944e8a1671d67595150
7
+ data.tar.gz: 37c55d12b41138e5fd73aa6e8fb0070de3a8999805a096836575140d70548cc73861cbe35847681aced55c34af0c4e86c384256f89fe6fe67381a90d363e2483
data/.travis.yml CHANGED
@@ -1,5 +1,3 @@
1
1
  language: ruby
2
- script: "bundle exec rake spec"
3
2
  rvm:
4
- - 2.2
5
- before_install: gem install bundler -v 1.11.2
3
+ - 2.3.3
data/CHANGELOG.md CHANGED
@@ -9,10 +9,26 @@ this project adheres to [Semantic Versioning](http://semver.org).
9
9
 
10
10
  (Nothing so far.)
11
11
 
12
+ ## [v13.0.0]
13
+
14
+ This release ([snapshot](https://github.com/how-is/how_is/tree/v13.0.0))
15
+ largely focused on an API redesign.
16
+
17
+ Pull requests for this release can be [viewe on
18
+ GitHub](https://github.com/how-is/how_is/pulls?utf8=&q=is%3Apr%20created%3A2016-12-12..2017-02-09).
19
+
20
+ ### Changed
21
+
22
+ * API overhaul. ([#115](https://github.com/how-is/how_is/issues/115), [#117](https://github.com/how-is/how_is/pull/117))
23
+ * Raise an exception/show a CLI warning if the provided repository name
24
+ isn't in the "user/repo" format.
25
+ ([#98](https://github.com/how-is/how_is/pull/98))
26
+
12
27
  ## [v12.0.0]
13
28
 
14
- This release largely focused on refactoring and developer experience
15
- improvements (e.g. adding Rake tasks and improving the generated JSON and HTML).
29
+ This release ([snapshot](https://github.com/how-is/how_is/tree/v12.0.0))
30
+ largely focused on refactoring and developer experience improvements
31
+ (e.g. adding Rake tasks and improving the generated JSON and HTML).
16
32
 
17
33
  Pull Requests for this release can be [viewed on
18
34
  GitHub](https://github.com/how-is/how_is/pulls?utf8=&q=is%3Apr%20created%3A2016-11-11..2016-12-11).
@@ -35,6 +51,9 @@ GitHub](https://github.com/how-is/how_is/pulls?utf8=&q=is%3Apr%20created%3A2016-
35
51
 
36
52
  ## [11.0.0]
37
53
 
54
+ This release ([snapshot](https://github.com/how-is/how_is/tree/v11.0.0))
55
+ removed PDF reports, handles more edge cases, and improves tests.
56
+
38
57
  ### Added
39
58
 
40
59
  - Document Ruby API
data/ISSUES.md ADDED
@@ -0,0 +1,86 @@
1
+ # Issue Management
2
+
3
+ The goal of issue management is to organize the work that needs to be
4
+ done when working on a project, by allowing users to report bugs,
5
+ request features or documentation, and start discussions.
6
+
7
+ To simplify that task, issues have _labels_. The purpose of labels is to
8
+ group issues in ways developers find useful. The obvious examples being
9
+ bug reports and feature requests.
10
+
11
+ This document is intended as a guide to help you understand what labels
12
+ on a given issue mean, or to help you choose labels for a new issue.
13
+
14
+ Labels on this repository are grouped, using the section before the
15
+ first colon in an issue name.
16
+
17
+ Issue groups:
18
+
19
+ * [(ungrouped)](#ungrouped)
20
+ * [category](#categories)
21
+ * [closed](#closed)
22
+ * [size](#size)
23
+ * [status](#status)
24
+ * [type](#type)
25
+
26
+ ---
27
+
28
+ ## (ungrouped)
29
+
30
+ ### blocked
31
+
32
+ An issue which can't be worked on until some other work is finished.
33
+ If an issue has this label, it _should_ (but, unfortunately, may not)
34
+ have an explanation of what other work needs to be done before it can be
35
+ worked on.
36
+
37
+ ### duplicate
38
+
39
+ A duplicate issue.
40
+
41
+ ### in progress
42
+
43
+ An issue which is currently being worked on. This should be added when
44
+ someone begins work on an issue.
45
+
46
+ ### ready
47
+
48
+ An issue which is ready to be worked on. This should be removed when
49
+ someone begins work on an issue.
50
+
51
+ ## categories
52
+
53
+ ### category: export
54
+
55
+ Issues relating to exporting reports.
56
+
57
+ ## size
58
+
59
+ ### size: small
60
+
61
+ An issue which should, at least in theory, be relatively simple to
62
+ resolve.
63
+
64
+ ### size: large
65
+
66
+ An issue which is expected to take a large amount of effort to resolve.
67
+
68
+ ### size: here be dragons
69
+
70
+ An issue which is extremely difficult, possibly impossible, to determine
71
+ the actual difficulty of. It could be resolved quickly, or it could grow
72
+ significantly.
73
+
74
+ ## type
75
+
76
+ ### type: bug report
77
+
78
+ A bug report.
79
+
80
+ ### type: feature request
81
+
82
+ A request for a new feature to be added.
83
+
84
+ ### type: question
85
+
86
+ An issue which is a question or discussion.
data/README.md CHANGED
@@ -1,5 +1,5 @@
1
- [![Stories in Ready](https://badge.waffle.io/duckinator/how_is.png?label=ready&title=Ready)](https://waffle.io/duckinator/how_is)
2
- [![Build Status](https://travis-ci.org/duckinator/how_is.svg?branch=master)](https://travis-ci.org/duckinator/how_is)
1
+ [![Stories in Ready](https://badge.waffle.io/how-is/how_is.png?label=ready&title=Ready)](https://waffle.io/how-is/how_is)
2
+ [![Build Status](https://travis-ci.org/how-is/how_is.svg?branch=master)](https://travis-ci.org/how-is/how_is)
3
3
 
4
4
  # How is [your repo]?
5
5
 
@@ -121,7 +121,7 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
121
121
 
122
122
  ## Contributing
123
123
 
124
- Bug reports and pull requests are welcome on GitHub at https://github.com/duckinator/how_is. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
124
+ Bug reports and pull requests are welcome on GitHub at https://github.com/how-is/how_is. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
125
125
 
126
126
 
127
127
  ## License
@@ -0,0 +1,155 @@
1
+ # how_is functional specification
2
+
3
+ By [Ellen Marie Dash](https://twitter.com/duckinator)
4
+ Last Updated: 2017-01-03
5
+
6
+ This document is a _functional specification_ (in other words, it documents
7
+ how the program works from an end-user perspective).
8
+ See [02-implementation.md](02-implementation.md) for a technical
9
+ specification (that is, how it is implemented).
10
+
11
+ *This document is incomplete.* It will take significant revisions before
12
+ this document can be considered complete.
13
+
14
+ ## Overview
15
+
16
+ how_is is a command-line tool to quantify the state of a GitHub
17
+ repository, and suggest actionable tasks to improve maintenance. It uses
18
+ information from the issue tracker, the codebase itself, and third-party
19
+ APIs to accomplish this. The expected audience is project managers, or
20
+ people in similar roles, and software developers.
21
+
22
+ ## Scenarios
23
+
24
+ When designing products, it helps to imagine a few real life stories of
25
+ how actual (stereotypical) people would use them. Let's look at some
26
+ scenarios.
27
+
28
+ ### Scenario 1: Jill (Project Manager)
29
+
30
+ Jill is a project manager for a large software project, which is hosted
31
+ on GitHub. She recently realized the project is falling behind on
32
+ managing issues and pull requests, and would like to get more detailed
33
+ information about this.
34
+
35
+ She runs `how_is some_org/some_project` to generate a report, which
36
+ contains information about the oldest and newest issues/PRs, the rate at
37
+ which issues/PRs are being opened and closed, and what issues fall under
38
+ whiat label. It also includes suggestions for improving management of
39
+ the project — such as possible approaches to keep on top of new
40
+ pull requests.
41
+
42
+ ### Scenario 2: Jesse (Developer)
43
+
44
+ Jesse is a developer who works on the same project as Jill.
45
+ ??? Why do people use a config file? It feels like it may actually
46
+ be redundant after the dashboard is implemented? Maybe we should discuss
47
+ the Ruby API instead? ???
48
+
49
+ ## Nongoals
50
+
51
+ This project is not:
52
+
53
+ * A dashboard. It generates a static report. However, a dashboard is
54
+ going to be implemented _using_ how\_is. See:
55
+ [how-is/dashboard](https://github.com/how-is/dashboard).
56
+ * Magic. It can at best give suggestions based on data. It can't know
57
+ the context or nuance to provide tailored advice. It needs human
58
+ interpretation and understanding in order to be useful.
59
+
60
+ ## Contents of a Report
61
+
62
+ Reports will contain the following:
63
+
64
+ * Number of open issues/PRs (+ links to listing of open issues/PRs).
65
+ * Links to newest and oldest issues/PRs + dates they were opened.
66
+ * Average issue/PR age.
67
+ * Number of issues closed in the past month (+ link to GitHub page listing
68
+ them).\*
69
+ * Number of PRs merged in the past month (+ link to GitHub page listing
70
+ them).\*
71
+ * Number of issues/PRs not updated in the past month (+ link to GitHub
72
+ page listing them, if possible).\*
73
+ * A graph showing the number of issues with each label (grouped by
74
+ category — explained later), as well as with no label (+ links
75
+ to lists of issues with each label).\*\*
76
+ * Clicking a label will pull information about issue labels from
77
+ various files, if they exist. Assuming one of those files exists,
78
+ clicking on a label will show the description of that label if it is
79
+ defined. If it is not defined, it will show a message explaining
80
+ that. The description will include a link to the file it was pulled
81
+ from.\*
82
+ * Code churn (via Code Climate) — TODO: determine presentation
83
+ details.\*
84
+ * Average length of time it takes for any team member to respond to a
85
+ new issue/PR.\*
86
+ * If a directory containing previous reports is specified, generate a
87
+ graph of this response time per week.\*
88
+
89
+ Items with an asterisk (\*) have yet to be implemented.
90
+ Items with two asterisks (\*\*) have been partially implemented.
91
+
92
+ ## UI Specification
93
+
94
+ ## Infmation about how_is
95
+
96
+ `how_is --help` prints help text and exits.
97
+
98
+ `how_is --version` prints the version and exits.
99
+
100
+ ### Generating a report
101
+
102
+ How\_is can generate HTML reports for https://github.com/rubygems/rubygems.
103
+ By default, it generates reports at `./report.html`.
104
+ To view an HTML report, open it in aweb browser.
105
+
106
+ There is no output when it succeeds.
107
+
108
+ ```
109
+ $ how_is rubygems/rubygems
110
+ $
111
+ ```
112
+
113
+ ### Generate a report, specifying the filename
114
+
115
+ You can generate reports with other filenames, as well as different
116
+ report formats, using the `--report FILENAME` parameter.
117
+
118
+ The FILENAME can be any filename that ends with a lowercase
119
+ extension specifying a supported format (currently `.html` and `.json`).
120
+
121
+ If the filename ends with `.html` it'll generate an HTML report,
122
+ if it ends with `.json` it'll generate a JSON report.
123
+
124
+ There is no output when it succeeds.
125
+
126
+ ```
127
+ $ how_is --report report.json rubygems/rubygems
128
+ $
129
+ ```
130
+
131
+ ### Generate a report, using data from a JSON report
132
+
133
+ If you have a JSON report (see above), you can use that to generate
134
+ another report (probably HTML) using that data.
135
+
136
+ E.g.,
137
+
138
+ ```
139
+ $ how_is --from report.json --report report.html
140
+ $
141
+ ```
142
+
143
+ This generates an HTML report just like `how_is --report report.html
144
+ REPOSITORY`, except it uses the data from `report.json` instead of
145
+ fetching it again.
146
+
147
+ tl;dr: you're using the JSON file as a cache.
148
+
149
+ ### Generating a report using a config file
150
+
151
+ See [the README](https://github.com/how-is/how_is/blob/master/README.md#generating-reports-from-a-config-file).
152
+
153
+ ### Ruby API
154
+
155
+ See [the README](https://github.com/how-is/how_is/blob/master/README.md#ruby-api).
@@ -0,0 +1,18 @@
1
+ # how_is technical specification
2
+
3
+ By [Ellen Marie Dash](https://twitter.com/duckinator)
4
+ Last Updated: 2017-01-??
5
+
6
+ This document is a _technical specification_ (in other words, how the
7
+ program is implemented).
8
+ See [01-functionality.md](01-functionality.md) for a functional
9
+ specification (that is, how it works from an end-user perspective).
10
+
11
+ *This document is incomplete.* It will take significant revisions before
12
+ this document can be considered complete.
13
+
14
+ ## Overview
15
+
16
+ TODO (high-level overview of architecture)
17
+
18
+ ##
data/exe/how_is CHANGED
@@ -19,12 +19,21 @@ opts = result[:opts]
19
19
  options = result[:options]
20
20
  arguments = result[:arguments]
21
21
 
22
- if options[:help]
23
- puts result[:opts]
24
- elsif options[:version]
25
- puts HowIs::VERSION
26
- elsif options[:config]
27
- HowIs::CLI.new.from_config_file(options[:config])
28
- else
29
- HowIs.generate_report_file(options)
22
+ begin
23
+ if options[:help]
24
+ puts result[:opts]
25
+ elsif options[:version]
26
+ puts HowIs::VERSION
27
+ elsif options[:config]
28
+ HowIs.from_config_file(YAML.load_file(options[:config]))
29
+ else
30
+ HowIs.generate_report_file(options)
31
+ end
32
+ rescue => e
33
+ if ENV['SHOW_TRACE']
34
+ raise
35
+ else
36
+ abort "Error: #{e.message}"
37
+ end
30
38
  end
39
+
data/how_is.gemspec CHANGED
@@ -21,13 +21,8 @@ Gem::Specification.new do |spec|
21
21
  spec.add_runtime_dependency "github_api", "~> 0.14.5"
22
22
  spec.add_runtime_dependency "contracts", "~> 0.14.0"
23
23
  spec.add_runtime_dependency "slop", "~> 4.4.1"
24
- spec.add_runtime_dependency "prawn", "~> 2.1.0"
25
24
 
26
- spec.add_runtime_dependency "mini_magick", "~> 4.5.1"
27
-
28
- # Travis CI only supports up to Ruby 2.2.0, but Rack 2.0+ requires Ruby 2.2.2+,
29
- # so this pegs Rack to the latest version that works with Ruby 2.2.0.
30
- spec.add_runtime_dependency "rack", "< 2.0"
25
+ spec.add_runtime_dependency "rack", "~> 2.0"
31
26
 
32
27
  spec.add_runtime_dependency "tessellator-fetcher", "~> 5.0.0"
33
28
 
@@ -3,7 +3,7 @@ require 'ostruct'
3
3
  require 'date'
4
4
  require 'json'
5
5
 
6
- module HowIs
6
+ class HowIs
7
7
  ##
8
8
  # Represents a completed analysis of the repository being analyzed.
9
9
  class Analysis < OpenStruct
data/lib/how_is/cli.rb CHANGED
@@ -6,91 +6,5 @@ require 'stringio'
6
6
  class HowIs::CLI
7
7
  include Contracts::Core
8
8
 
9
- DEFAULT_CONFIG_FILE = 'how_is.yml'
10
9
 
11
- # Generates YAML frontmatter, as is used in Jekyll and other blog engines.
12
- #
13
- # E.g.,
14
- # generate_frontmatter({'foo' => "bar %{baz}"}, {'baz' => "asdf"})
15
- # => "---\nfoo: bar asdf\n"
16
- Contract C::HashOf[C::Or[String, Symbol] => String],
17
- C::HashOf[C::Or[String, Symbol] => C::Any] => String
18
- def generate_frontmatter(frontmatter, report_data)
19
- frontmatter = convert_keys(frontmatter, :to_s)
20
- report_data = convert_keys(report_data, :to_sym)
21
-
22
- frontmatter = frontmatter.map { |k, v|
23
- v = v % report_data
24
-
25
- [k, v]
26
- }.to_h
27
-
28
- YAML.dump(frontmatter)
29
- end
30
-
31
- ##
32
- # Generates a series of report files based on a YAML config file.
33
- def from_config_file(config_file = nil, **kwargs)
34
- config_file ||= DEFAULT_CONFIG_FILE
35
-
36
- from_config(YAML.load_file(config_file), **kwargs)
37
- end
38
-
39
- ##
40
- # Generates a series of report files based on a config Hash.
41
- def from_config(config,
42
- github: nil,
43
- report_class: nil)
44
- report_class ||= HowIs::Report
45
-
46
- date = Date.strptime(Time.now.to_i.to_s, '%s')
47
- date_string = date.strftime('%Y-%m-%d')
48
- friendly_date = date.strftime('%B %d, %y')
49
-
50
- analysis = HowIs.generate_analysis(repository: config['repository'], github: github)
51
-
52
- report_data = {
53
- repository: config['repository'],
54
- date: date,
55
- friendly_date: friendly_date,
56
- }
57
-
58
- config['reports'].map do |format, report_config|
59
- filename = report_config['filename'] % report_data
60
- file = File.join(report_config['directory'], filename)
61
-
62
- report = report_class.export(analysis, format)
63
-
64
- result = build_report(report_config['frontmatter'], report_data, report)
65
-
66
- File.open(file, 'w') do |f|
67
- f.puts result
68
- end
69
-
70
- result
71
- end
72
- end
73
-
74
- # Combine the frontmatter, report data, and raw report into a report with
75
- # frontmatter.
76
- def build_report(frontmatter, report_data, report)
77
- str = StringIO.new
78
-
79
- if frontmatter
80
- str.puts generate_frontmatter(frontmatter, report_data)
81
- str.puts "---"
82
- str.puts
83
- end
84
-
85
- str.puts report
86
-
87
- str.string
88
- end
89
-
90
- private
91
- # convert_keys({'foo' => 'bar'}, :to_sym)
92
- # => {:foo => 'bar'}
93
- def convert_keys(data, method_name)
94
- data.map {|k, v| [k.send(method_name), v]}.to_h
95
- end
96
10
  end
@@ -31,6 +31,9 @@ class HowIs::Fetcher
31
31
  github = nil)
32
32
  github ||= Github.new(auto_pagination: true)
33
33
  user, repo = repository.split('/', 2)
34
+ raise HowIs::CLI::OptionsError, 'To generate a report from GitHub, ' \
35
+ 'provide the repository username/project. ' \
36
+ 'Quitting!' unless user && repo
34
37
  issues = github.issues.list user: user, repo: repo
35
38
  pulls = github.pulls.list user: user, repo: repo
36
39
 
data/lib/how_is/pulse.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  require 'tessellator/fetcher'
2
2
 
3
- module HowIs
3
+ class HowIs
4
4
  # This entire class is a monstrous hack, because GitHub doesn't provide a good
5
5
  # API for Pulse.
6
6
  class Pulse
@@ -1,6 +1,6 @@
1
1
  require 'json'
2
2
 
3
- module HowIs
3
+ class HowIs
4
4
  ##
5
5
  # Subclasses of BaseReport represent complete reports.
6
6
  class BaseReport < Struct.new(:analysis)
@@ -1,7 +1,7 @@
1
1
  require 'cgi'
2
2
  require 'how_is/report/base_report'
3
3
 
4
- module HowIs
4
+ class HowIs
5
5
  class HtmlReport < BaseReport
6
6
  def format
7
7
  :html
@@ -1,6 +1,6 @@
1
1
  require 'how_is/report/base_report'
2
2
 
3
- module HowIs
3
+ class HowIs
4
4
  class JsonReport < BaseReport
5
5
  def format
6
6
  :json
data/lib/how_is/report.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  require 'date'
2
2
  require 'how_is/pulse'
3
3
 
4
- module HowIs
4
+ class HowIs
5
5
  class UnsupportedExportFormat < StandardError
6
6
  def initialize(format)
7
7
  super("Unsupported export format: #{format}")
@@ -1,3 +1,3 @@
1
- module HowIs
2
- VERSION = "12.0.0"
1
+ class HowIs
2
+ VERSION = "13.0.0"
3
3
  end
data/lib/how_is.rb CHANGED
@@ -6,7 +6,7 @@ Cacert.set_in_env
6
6
 
7
7
  C = Contracts
8
8
 
9
- module HowIs
9
+ class HowIs
10
10
  include Contracts::Core
11
11
 
12
12
  require 'how_is/fetcher'
@@ -25,10 +25,16 @@ module HowIs
25
25
 
26
26
  ##
27
27
  # Generates and returns a report as a String.
28
- def self.generate_report(format:, **kw_args)
29
- analysis = self.generate_analysis(**kw_args)
28
+ def initialize(repository, **kw_args)
29
+ @analysis = HowIs.generate_analysis(repository: repository, **kw_args)
30
+ end
31
+
32
+ def to_html
33
+ Report.export(@analysis, :html)
34
+ end
30
35
 
31
- Report.export(analysis, format)
36
+ def to_json
37
+ Report.export(@analysis, :json)
32
38
  end
33
39
 
34
40
  ##
@@ -65,4 +71,85 @@ module HowIs
65
71
 
66
72
  analysis
67
73
  end
74
+
75
+ # Generates YAML frontmatter, as is used in Jekyll and other blog engines.
76
+ #
77
+ # E.g.,
78
+ # generate_frontmatter({'foo' => "bar %{baz}"}, {'baz' => "asdf"})
79
+ # => "---\nfoo: bar asdf\n"
80
+ Contract C::HashOf[C::Or[String, Symbol] => String],
81
+ C::HashOf[C::Or[String, Symbol] => C::Any] => String
82
+ def self.generate_frontmatter(frontmatter, report_data)
83
+ frontmatter = convert_keys(frontmatter, :to_s)
84
+ report_data = convert_keys(report_data, :to_sym)
85
+
86
+ frontmatter = frontmatter.map { |k, v|
87
+ v = v % report_data
88
+
89
+ [k, v]
90
+ }.to_h
91
+
92
+ YAML.dump(frontmatter)
93
+ end
94
+
95
+ ##
96
+ # Generates a series of report files based on a config Hash.
97
+ def self.from_config(config,
98
+ github: nil,
99
+ report_class: nil)
100
+ report_class ||= HowIs::Report
101
+
102
+ date = Date.strptime(Time.now.to_i.to_s, '%s')
103
+ date_string = date.strftime('%Y-%m-%d')
104
+ friendly_date = date.strftime('%B %d, %y')
105
+
106
+ analysis = HowIs.generate_analysis(repository: config['repository'], github: github)
107
+
108
+ report_data = {
109
+ repository: config['repository'],
110
+ date: date,
111
+ friendly_date: friendly_date,
112
+ }
113
+
114
+ generated_reports = {}
115
+
116
+ config['reports'].map do |format, report_config|
117
+ filename = report_config['filename'] % report_data
118
+ file = File.join(report_config['directory'], filename)
119
+
120
+ report = report_class.export(analysis, format)
121
+
122
+ result = build_report(report_config['frontmatter'], report_data, report)
123
+
124
+ generated_reports[file] = result
125
+
126
+ result
127
+ end
128
+
129
+ generated_reports
130
+ end
131
+
132
+ # Combine the frontmatter, report data, and raw report into a report with
133
+ # frontmatter.
134
+ def self.build_report(frontmatter, report_data, report)
135
+ str = StringIO.new
136
+
137
+ if frontmatter
138
+ str.puts generate_frontmatter(frontmatter, report_data)
139
+ str.puts "---"
140
+ str.puts
141
+ end
142
+
143
+ str.puts report
144
+
145
+ str.string
146
+ end
147
+
148
+ private
149
+ # convert_keys({'foo' => 'bar'}, :to_sym)
150
+ # => {:foo => 'bar'}
151
+ def self.convert_keys(data, method_name)
152
+ data.map {|k, v| [k.send(method_name), v]}.to_h
153
+ end
154
+
68
155
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: how_is
3
3
  version: !ruby/object:Gem::Version
4
- version: 12.0.0
4
+ version: 13.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ellen Marie Dash
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-12-11 00:00:00.000000000 Z
11
+ date: 2017-02-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: github_api
@@ -52,46 +52,18 @@ dependencies:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: 4.4.1
55
- - !ruby/object:Gem::Dependency
56
- name: prawn
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - "~>"
60
- - !ruby/object:Gem::Version
61
- version: 2.1.0
62
- type: :runtime
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - "~>"
67
- - !ruby/object:Gem::Version
68
- version: 2.1.0
69
- - !ruby/object:Gem::Dependency
70
- name: mini_magick
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - "~>"
74
- - !ruby/object:Gem::Version
75
- version: 4.5.1
76
- type: :runtime
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - "~>"
81
- - !ruby/object:Gem::Version
82
- version: 4.5.1
83
55
  - !ruby/object:Gem::Dependency
84
56
  name: rack
85
57
  requirement: !ruby/object:Gem::Requirement
86
58
  requirements:
87
- - - "<"
59
+ - - "~>"
88
60
  - !ruby/object:Gem::Version
89
61
  version: '2.0'
90
62
  type: :runtime
91
63
  prerelease: false
92
64
  version_requirements: !ruby/object:Gem::Requirement
93
65
  requirements:
94
- - - "<"
66
+ - - "~>"
95
67
  - !ruby/object:Gem::Version
96
68
  version: '2.0'
97
69
  - !ruby/object:Gem::Dependency
@@ -206,11 +178,14 @@ files:
206
178
  - CHANGELOG.md
207
179
  - CODE_OF_CONDUCT.md
208
180
  - Gemfile
181
+ - ISSUES.md
209
182
  - LICENSE.txt
210
183
  - README.md
211
184
  - Rakefile
212
185
  - bin/console
213
186
  - bin/setup
187
+ - design/01-functionality.md
188
+ - design/02-implementation.md
214
189
  - exe/how_is
215
190
  - fixtures/vcr_cassettes/how-is-example-empty-repository.yml
216
191
  - fixtures/vcr_cassettes/how-is-example-repository.yml
@@ -248,7 +223,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
248
223
  version: '0'
249
224
  requirements: []
250
225
  rubyforge_project:
251
- rubygems_version: 2.4.5.2
226
+ rubygems_version: 2.5.2
252
227
  signing_key:
253
228
  specification_version: 4
254
229
  summary: Quantify the health of a GitHub repository is.