whatsnew 0.4.1 → 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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9b53e6d9202e83aafd24207f57421ae4e9036c11
4
- data.tar.gz: 5b9d8b8a079f77cab4fed803369c6e3b631ede02
3
+ metadata.gz: 7afbacce07e4b62f2d0eb05bce8800e1da477ba2
4
+ data.tar.gz: afc225b4ba64d76501eaa7699a48d9c7e001c4b5
5
5
  SHA512:
6
- metadata.gz: 02e767373d4b467d119e005f3c480f3c6012dde3f19e7be05a7d8fd6bdbfa499f6e036f57847fb4cdeb9ec65946c342a05c34f11b02490215ce9ff026d3852cb
7
- data.tar.gz: 252e036c1d580ecb3688914becf9d5865c71d7fd2c921409ab9fde49c872e6f76dd280f95a41217268067f64083d463f698b30077ab7082e9c120783a5533a1d
6
+ metadata.gz: 5d5f790215ad630e912dd1de66b0aa4437576225f1de2cec77261aa2ededf8538457e6905389493ec0d99816afb56c06cb4cc92437418331375a9eb4f06df1f3
7
+ data.tar.gz: 3f6a9894eea53ff3f0e33743c3f447d29bcf6a9d2eabc249fa2e0fe46e7f42aabe77285a9e5a989444ef87044ed2084a90e841279416e7f8d8af30f800b31c2f
data/.gitignore CHANGED
@@ -7,3 +7,4 @@
7
7
  /pkg/
8
8
  /spec/reports/
9
9
  /tmp/
10
+ spec/examples.txt
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --require spec_helper
data/.travis.yml CHANGED
@@ -2,12 +2,14 @@ language: ruby
2
2
  sudo: false
3
3
  bundler_args: "--retry=3 --jobs=3"
4
4
  rvm:
5
- - 2.0
6
- - 2.1
7
- - 2.2
5
+ - 2.1.8
6
+ - 2.2.4
7
+ - 2.3.0
8
+ - 2.0.0
8
9
  - ruby-head
9
10
  matrix:
10
11
  allow_failures:
12
+ - rvm: 2.0.0
11
13
  - rvm: ruby-head
12
14
  fast_finish: true
13
15
  notifications:
data/CHANGELOG.md CHANGED
@@ -2,6 +2,8 @@
2
2
 
3
3
  ## Unrelease
4
4
 
5
+ - Add support for GitHub releases [#9](https://github.com/jollygoodcode/whatsnew/pull/9)
6
+
5
7
  ## v0.4.1 - 2015-08-09
6
8
 
7
9
  ### Features
data/CONTRIBUTING.md CHANGED
@@ -5,3 +5,17 @@
5
5
  3. Commit your changes ( `git commit -am 'Add some feature'` )
6
6
  4. Push to the branch ( `git push origin my-new-feature` )
7
7
  5. Create a new Pull Request
8
+
9
+ ## Development
10
+
11
+ ### Install Dependencies
12
+
13
+ $ bundle
14
+
15
+ ### Running Tests
16
+
17
+ $ bundle exec rake
18
+
19
+ ### Run with local gem
20
+
21
+ $ bin/dev
data/Gemfile CHANGED
@@ -2,10 +2,13 @@ source "https://rubygems.org"
2
2
 
3
3
  gemspec
4
4
 
5
- gem "bundler"
6
- gem "rake"
7
- gem "pry"
8
- gem "minitest", "~> 5.8"
9
- gem "shoulda", "~> 3.5"
10
- gem "octokit", "~> 4.0.1"
11
- gem "dish"
5
+ group :development do
6
+ gem "bundler"
7
+ gem "rake"
8
+ gem "pry"
9
+ gem "rspec", "~> 3.3.0"
10
+ gem "octokit", "~> 4.1.1"
11
+ gem "dish"
12
+ gem "webmock"
13
+ gem "pry-byebug"
14
+ end
data/README.md CHANGED
@@ -3,11 +3,11 @@
3
3
  [![Gem Version](https://badge.fury.io/rb/whatsnew.svg)](http://badge.fury.io/rb/whatsnew)
4
4
  [![Build Status](https://travis-ci.org/jollygoodcode/whatsnew.svg?branch=master)](https://travis-ci.org/jollygoodcode/whatsnew)
5
5
 
6
- What's New about a project?
6
+ What's New in a project?
7
7
 
8
- --
8
+ This gem is used in [deppbot](https://www.deppbot.com) to find changelog in Pull Request body, an example could be found in [this Pull Request on ruby-bench/ruby-bench-web](https://github.com/ruby-bench/ruby-bench-web/pull/122).
9
9
 
10
- Where is the document which documents changes between two releases?
10
+ --
11
11
 
12
12
  ## Installation
13
13
 
@@ -19,24 +19,87 @@ gem "whatsnew"
19
19
 
20
20
  And then execute:
21
21
 
22
- $ bundle
22
+ ```
23
+ $ bundle
24
+ ```
23
25
 
24
- Or install it yourself as:
26
+ Or install it yourself:
25
27
 
26
- $ gem install whatsnew
28
+ ```
29
+ $ gem install whatsnew
30
+ ```
27
31
 
28
32
  ## Usage
29
33
 
30
- ### Command line usage
34
+ ### First Setup a OAuth Token
31
35
 
36
+ Either pass in as command line argument
37
+
38
+ ```
39
+ whatsnew --access-token=<your-40-char-token>
32
40
  ```
33
- $ whatsnew
34
41
 
42
+ Or stored in ENV variable: `OAUTH_ACCESS_TOKEN`.
43
+
44
+ ### Get a OAuth Token
45
+
46
+ You can either get a [Personal Access Token](https://help.github.com/articles/creating-an-access-token-for-command-line-use/) or [get an OAuth token](https://developer.github.com/v3/oauth).
47
+
48
+ If you need to access private repository, make sure to specify the `repo` scope while creating your token.
49
+
50
+ If no OAuth token is provided, unauthenticated limits to [60 requests per hour](https://developer.github.com/v3/#rate-limiting).
51
+
52
+ ### Command Line Usage
53
+
54
+ By default `whatsnew about` without argument will search for current folder:
55
+
56
+ ```
57
+ $ whatsnew about
35
58
  What's New:
36
59
  See CHANGELOG.md: https://github.com/jollygoodcode/whatsnew/blob/master/CHANGELOG.md.
37
60
  ```
38
61
 
39
- ### API usage for Local Files
62
+ You can also search for a GitHub repository:
63
+
64
+ ```
65
+ $ whatsnew about jollygoodcode/twemoji
66
+ What's New:
67
+ See CHANGELOG.md: https://github.com/jollygoodcode/twemoji/blob/master/CHANGELOG.md.
68
+ ```
69
+
70
+ If a [changelog-like file](#what-does-it-search-for) cannot be found, whatsnew will search for [GitHub Releases](https://github.com/blog/1547-release-your-software) (if it has any releases with non-empty release body):
71
+
72
+ ```
73
+ $ whatsnew about benbalter/licensee
74
+ What's New:
75
+ See Releases: https://github.com/benbalter/licensee/releases.
76
+ ```
77
+
78
+ Both changelog and release cannot be found:
79
+
80
+ ```
81
+ $ whatsnew about
82
+ Not found. This project should keep a changelog.
83
+ Please see http://keepachangelog.com.
84
+ ```
85
+
86
+ ## What Does It Search For?
87
+
88
+ * changelog-like file
89
+
90
+ `CHANGELOG`, `CHANGE`, `CHANGES`, `HISTORY`, `NEWS` in the root of the project (regardless of file extension).
91
+
92
+ * If a changelog-like file cannot be found, will try to see if [GitHub Releases](https://github.com/blog/1547-release-your-software) has contents to show
93
+
94
+ * It doesn't search for changelog listed in README
95
+
96
+ ### API usage
97
+
98
+ `Whatsnew.about` API can take a path (see Local section below) or `owner/repo` (see Remote section below) string.
99
+
100
+ #### Local
101
+
102
+ Search in given path:
40
103
 
41
104
  ```ruby
42
105
  news = Whatsnew.about "/Users/Juan/dev/whatsnew"
@@ -46,24 +109,26 @@ news.file_name
46
109
 
47
110
  news.file_url
48
111
  => "https://github.com/jollygoodcode/whatsnew/blob/master/CHANGELOG.md"
112
+ # or returns changelog's path if this project is not a git repository
113
+ => "/Users/Juan/dev/whatsnew/CHANGELOG.md"
49
114
 
50
115
  news.content
51
- => "Content of CHANGELOG.md"
116
+ => "Prints Content of CHANGELOG.md"
52
117
 
53
118
  news.read
54
119
  => "What's New:\nSee CHANGELOG.md: https://github.com/jollygoodcode/whatsnew/blob/master/CHANGELOG.md."
55
120
  ```
56
121
 
57
- ### API usage for Remote Files
122
+ #### Remote
58
123
 
59
- #### Example use with [Octokit](https://github.com/octokit/octokit.rb)
124
+ Search changelog-like file / releases on GitHub.
60
125
 
61
- First [get an access token](https://help.github.com/articles/creating-an-access-token-for-command-line-use/), then:
126
+ It will first search if a remote repository has a changelog file:
62
127
 
63
- ```ruby
64
- client = Octokit::Client.new(access_token: ENV["OAUTH_TOKEN"])
128
+ Search in given `owner/repo`:
65
129
 
66
- news = Whatsnew.about client.contents("jollygoodcode/whatsnew")
130
+ ```ruby
131
+ news = Whatsnew.about "jollygoodcode/whatsnew", oauth_token: "e72e16c7e42f292c6912e7710c838347ae178b4a"
67
132
 
68
133
  news.file_name
69
134
  => "CHANGELOG.md"
@@ -71,52 +136,49 @@ news.file_name
71
136
  news.file_url
72
137
  => "https://github.com/jollygoodcode/whatsnew/blob/master/CHANGELOG.md"
73
138
 
139
+ news.content
140
+ => "Please see: https://github.com/jollygoodcode/whatsnew/blob/master/CHANGELOG.md."
141
+
74
142
  news.read
75
143
  => "What's New:\nSee CHANGELOG.md: https://github.com/jollygoodcode/whatsnew/blob/master/CHANGELOG.md."
76
144
  ```
77
145
 
78
- Note that you can pass in array of any objects to `Whatsnew.about`, each object must respond to `:name` and `:html_url` messages:
146
+ Then search for GitHub Releases with non-empty body.
79
147
 
80
- ```ruby
81
- Resource = Struct.new(:name, :html_url)
82
-
83
- news = Whatsnew.about [Resource.new("NEWS", "https://github.com/ruby/ruby/blob/trunk/NEWS")]
148
+ ```
149
+ news = Whatsnew.about "benbalter/licensee", oauth_token: "e72e16c7e42f292c6912e7710c838347ae178b4a"
84
150
 
85
151
  news.file_name
86
- => "NEWS"
152
+ => "Releases"
87
153
 
88
154
  news.file_url
89
- => "https://github.com/ruby/ruby/blob/trunk/NEWS"
155
+ => "https://github.com/benbalter/licensee/releases"
156
+
157
+ news.content
158
+ => "See https://github.com/benbalter/licensee/releases."
90
159
 
91
160
  news.read
92
- => "What's New:\nSee NEWS: https://github.com/ruby/ruby/blob/trunk/NEWS."
161
+ => "What's New:\nSee Releases: https://github.com/benbalter/licensee/releases."
93
162
  ```
94
163
 
164
+ ## Inspired by
95
165
 
96
- ## What it searches for?
97
-
98
- * `CHANGELOG`, `CHANGE`, `CHANGES`, `HISTORY`, `NEWS` in the root of project (regardless of file extension).
99
-
100
- * It doesn't search for changelog listed in README.
101
-
102
- ## Development
103
-
104
- See [DEVELOPMENT.md](DEVELOPMENT.md).
166
+ [benbalter/licensee](https://github.com/benbalter/licensee) - A RubyGem to detect under what license a project is distributed.
105
167
 
106
168
  ## Contributing
107
169
 
108
- See [CONTRIBUTING.md](CONTRIBUTING.md).
109
-
110
- ## Inspired by
111
-
112
- [benbalter/licensee](https://github.com/benbalter/licensee) - A RubyGem to detect under what license a project is distributed.
170
+ Please see the [CONTRIBUTING.md](/CONTRIBUTING.md) file.
113
171
 
114
172
  ## Credits
115
173
 
116
174
  A huge THANK YOU to all our [contributors](https://github.com/jollygoodcode/whatsnew/graphs/contributors)! :heart:
117
175
 
118
- This project is maintained by [Jolly Good Code](http://www.jollygoodcode.com).
119
-
120
176
  ## License
121
177
 
122
- The gem is available as open source under the terms of the [MIT License](LICENSE.md).
178
+ Please see the [LICENSE.md](/LICENSE.md) file.
179
+
180
+ ## Maintained by Jolly Good Code
181
+
182
+ [![Jolly Good Code](https://cloud.githubusercontent.com/assets/1000669/9362336/72f9c406-46d2-11e5-94de-5060e83fcf83.jpg)](http://www.jollygoodcode.com)
183
+
184
+ We specialise in Agile practices and Ruby, and we love contributing to open source. [Speak to us](http://www.jollygoodcode.com/#get-in-touch) about your next big idea, or [check out our projects](http://www.jollygoodcode.com/open-source).
data/Rakefile CHANGED
@@ -1,10 +1,4 @@
1
1
  require "bundler/gem_tasks"
2
- require "rake/testtask"
3
-
4
- Rake::TestTask.new(:test) do |t|
5
- t.libs << "test"
6
- t.libs << "lib"
7
- t.test_files = FileList["test/**/*_test.rb"]
8
- end
9
-
10
- task default: :test
2
+ require "rspec/core/rake_task"
3
+ RSpec::Core::RakeTask.new(:spec)
4
+ task default: [:spec]
data/bin/whatsnew CHANGED
@@ -2,12 +2,8 @@
2
2
 
3
3
  Signal.trap("INT") { abort }
4
4
 
5
- require "whatsnew"
5
+ lib_dir = File.expand_path(File.join(File.dirname(__FILE__), "..", "lib"))
6
+ $LOAD_PATH << lib_dir unless $LOAD_PATH.include?(lib_dir)
7
+ require "whatsnew/cli"
6
8
 
7
- if news = Whatsnew.about(Dir.pwd)
8
- puts news.read
9
- else
10
- puts "Not found. Do you mind keep a changelog?"
11
- puts "Or tell the project owner to keep a changelog :)"
12
- puts "See http://keepachangelog.com"
13
- end
9
+ Whatsnew::CLI.start
@@ -0,0 +1,31 @@
1
+ require "thor"
2
+ require "whatsnew"
3
+
4
+ module Whatsnew
5
+ class CLI < Thor
6
+ desc "version", "Show Whatsnew version."
7
+ def version
8
+ say Whatsnew::VERSION
9
+ end
10
+ map %w(-v --version) => :version
11
+
12
+ desc "about", "Find changelog / releases of a given path or repo on GitHub. If no argument is given, look for current path's changelog."
13
+ option :access_token, type: :string, aliases: "-a"
14
+ def about(path_or_repo = nil)
15
+ news = Whatsnew.about path_or_repo, options[:access_token]
16
+
17
+ if news.is_a? Whatsnew::NoNewsFile
18
+ say_in_green "Not found. This project should keep a changelog."
19
+ say_in_green "Please see http://keepachangelog.com."
20
+ else
21
+ say_in_green news.read
22
+ end
23
+ end
24
+
25
+ private
26
+
27
+ def say_in_green(content)
28
+ say content, :green
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,8 @@
1
+ module Whatsnew
2
+ DOT = ".".freeze
3
+ DOT_GIT = ".git".freeze
4
+ EMPTY_STRING = "".freeze
5
+ STAR = "*".freeze
6
+ NOT_FOUND = "NOT FOUND".freeze
7
+ FILES_TO_SEARCH_REGEXP = %r{(CHANGE|CHANGES|CHANGELOG|NEWS|HISTORY)}i.freeze
8
+ end
@@ -1,21 +1,12 @@
1
- require "pathname"
2
-
3
1
  module Whatsnew
4
2
  class LocalFiles
5
3
  def initialize(path)
6
- @path = path
7
- @news = Dir.glob(File.join(path, "*".freeze)).find do |file|
8
- file =~ %r{(CHANGE|CHANGES|CHANGELOG|NEWS|HISTORY)}i.freeze
9
- end
4
+ @path = path || DOT
10
5
  end
11
6
 
12
7
  def to_news_file
13
- if news
14
- NewsFile.new(
15
- file_name,
16
- content: file.read,
17
- file_url: "#{project_uri}/blob/master/#{file_name}"
18
- )
8
+ if news = find_news_at_local
9
+ LocalNewsFile.new(news, path)
19
10
  else
20
11
  NoNewsFile.new
21
12
  end
@@ -23,30 +14,12 @@ module Whatsnew
23
14
 
24
15
  private
25
16
 
26
- attr_reader :path, :news, :matched
27
-
28
- def project_uri
29
- if File.exist?("#{path}/.git") && matched_from_git_config
30
- "https://#{matched[:host]}/#{matched[:owner]}/#{matched[:repo]}"
31
- else
32
- "NOT FOUND".freeze
33
- end
34
- end
17
+ attr_reader :path
35
18
 
36
- def matched_from_git_config
37
- @matched ||= Dir.chdir(Pathname(path).to_path) do
38
- `git config --get remote.origin.url`.match(
39
- %r{(http://|https://|git.+)(?<host>(github.com|bitbucket.com|bitbucket.org))[:/](?<owner>\S+)/(?<repo>\S+)\.git}
40
- )
19
+ def find_news_at_local
20
+ Dir.glob(File.join(path, STAR)).find do |local_file|
21
+ local_file =~ FILES_TO_SEARCH_REGEXP
41
22
  end
42
23
  end
43
-
44
- def file
45
- @file ||= Pathname(news)
46
- end
47
-
48
- def file_name
49
- @file_name ||= file.basename.to_s
50
- end
51
24
  end
52
25
  end
@@ -0,0 +1,49 @@
1
+ require "pathname"
2
+
3
+ module Whatsnew
4
+ class LocalNewsFile
5
+ def initialize(news, path)
6
+ @news = news
7
+ @path = path
8
+ end
9
+
10
+ def file_name
11
+ @file_name ||= file.basename.to_s
12
+ end
13
+
14
+ def file_url
15
+ return NOT_FOUND unless news
16
+ return file.to_path unless File.exist?(File.join(path, DOT_GIT))
17
+
18
+ "https://#{matched[:host]}/#{matched[:owner]}/#{matched[:repo]}/blob/master/#{file_name}"
19
+ end
20
+
21
+ def content
22
+ file.read
23
+ end
24
+
25
+ def read
26
+ "What's New:\n" "See #{file_name}: #{file_url}."
27
+ end
28
+
29
+ private
30
+
31
+ attr_reader :news, :path
32
+
33
+ def file
34
+ @file ||= Pathname(news)
35
+ end
36
+
37
+ def matched
38
+ @matched ||= matched_from_git_config
39
+ end
40
+
41
+ def matched_from_git_config
42
+ Dir.chdir(Pathname(path).to_path) do
43
+ `git config --get remote.origin.url`.match(
44
+ %r{(http://|https://|git.+)(?<host>(github.com|bitbucket.com|bitbucket.org))[:/](?<owner>\S+)/(?<repo>\S+)\.git}.freeze
45
+ )
46
+ end
47
+ end
48
+ end
49
+ end
@@ -1,17 +1,31 @@
1
- require "pathname"
2
-
3
1
  module Whatsnew
4
2
  class NewsFile
5
- attr_reader :file_name, :content, :file_url
3
+ def initialize(news)
4
+ @news = news
5
+ end
6
6
 
7
- def initialize(file_name, content: nil, file_url: nil)
8
- @file_name = file_name
9
- @content = content
10
- @file_url = file_url
7
+ def file_name
8
+ news.name
9
+ end
10
+
11
+ def file_url
12
+ news_html_url
13
+ end
14
+
15
+ def content
16
+ "See #{file_url}."
11
17
  end
12
18
 
13
19
  def read
14
20
  "What's New:\n" "See #{file_name}: #{file_url}."
15
21
  end
22
+
23
+ private
24
+
25
+ attr_reader :news
26
+
27
+ def news_html_url
28
+ news.html_url
29
+ end
16
30
  end
17
31
  end
@@ -1,9 +1,5 @@
1
- require "pathname"
2
-
3
1
  module Whatsnew
4
2
  class NoNewsFile
5
- NOT_FOUND = "NOT FOUND".freeze
6
-
7
3
  def file_name
8
4
  NOT_FOUND
9
5
  end
@@ -12,12 +8,12 @@ module Whatsnew
12
8
  NOT_FOUND
13
9
  end
14
10
 
15
- def read
16
- NOT_FOUND
11
+ def content
12
+ EMPTY_STRING
17
13
  end
18
14
 
19
- def content
20
- "".freeze
15
+ def read
16
+ NOT_FOUND
21
17
  end
22
18
  end
23
19
  end
@@ -2,24 +2,28 @@ module Whatsnew
2
2
  class Project
3
3
  attr_reader :news_file
4
4
 
5
- def initialize(path_or_resources)
6
- @path_or_resources = Array(path_or_resources)
5
+ def initialize(path_or_repo, access_token = nil)
6
+ @path_or_repo = path_or_repo
7
+ @access_token = access_token
8
+ end
9
+
10
+ def news_file
11
+ return LocalFiles.new(path_or_repo).to_news_file unless path_or_repo
7
12
 
8
- @news_file = if resources?
9
- RemoteFiles.new(path_or_resources).to_news_file
13
+ if query_for_a_repo?
14
+ RemoteFiles.new(path_or_repo, access_token).to_news_file
10
15
  else
11
- LocalFiles.new(path_or_resources).to_news_file
16
+ LocalFiles.new(path_or_repo).to_news_file
12
17
  end
13
18
  end
14
19
 
15
20
  private
16
21
 
17
- attr_reader :path_or_resources
22
+ attr_reader :path_or_repo, :access_token
18
23
 
19
- def resources?
20
- path_or_resources &&
21
- path_or_resources.first.respond_to?(:name) &&
22
- path_or_resources.first.respond_to?(:html_url)
24
+ def query_for_a_repo?
25
+ path_or_repo.count("/".freeze) == 1 &&
26
+ path_or_repo =~ %r(^.+/.+$).freeze
23
27
  end
24
28
  end
25
29
  end
@@ -0,0 +1,31 @@
1
+ module Whatsnew
2
+ class ReleaseFile
3
+ def initialize(release)
4
+ @release = release
5
+ end
6
+
7
+ def file_name
8
+ "Releases".freeze
9
+ end
10
+
11
+ def file_url
12
+ release_html_url
13
+ end
14
+
15
+ def content
16
+ "See #{file_url}."
17
+ end
18
+
19
+ def read
20
+ "What's New:\n" "See #{file_name}: #{file_url}."
21
+ end
22
+
23
+ private
24
+
25
+ attr_reader :release
26
+
27
+ def release_html_url
28
+ release.html_url.sub(%r(/releases/.+), "/releases".freeze)
29
+ end
30
+ end
31
+ end
@@ -1,25 +1,62 @@
1
+ require "octokit"
2
+
1
3
  module Whatsnew
2
4
  class RemoteFiles
3
- def initialize(resources)
4
- @news = resources.find do |resource|
5
- resource.name =~ %r{(CHANGE|CHANGES|CHANGELOG|NEWS|HISTORY)}i.freeze
5
+ REPO_NOT_FOUND = Class.new(Exception)
6
+ REPO_NOT_FOUND_MESSAGE = "This repository cannot be found. Specify OAuth token if this is a private repository.".freeze
7
+ INVALID_OAUTH_TOKEN = Class.new(Exception)
8
+
9
+ def initialize(repo, access_token = nil)
10
+ @repo = repo
11
+ @token =
12
+ access_token ||
13
+ ENV.fetch("OAUTH_ACCESS_TOKEN") { prints_no_token_warning }
14
+
15
+ if token && token.size != 40
16
+ abort "ERROR: OAuth token should be 40-char long.".freeze
6
17
  end
7
18
  end
8
19
 
9
20
  def to_news_file
10
- if news
11
- NewsFile.new(news.name, content: "See #{news_html_url}", file_url: news_html_url)
21
+ if contents = find_from_contents
22
+ NewsFile.new(contents)
23
+ elsif releases = find_from_releases
24
+ ReleaseFile.new(releases)
12
25
  else
13
26
  NoNewsFile.new
14
27
  end
28
+ rescue Octokit::NotFound
29
+ raise REPO_NOT_FOUND, REPO_NOT_FOUND_MESSAGE
30
+ rescue Octokit::Unauthorized
31
+ raise INVALID_OAUTH_TOKEN, "ERROR: Your OAuth token: #{token} is invalid or revoked."
15
32
  end
16
33
 
17
34
  private
18
35
 
19
- attr_reader :news
36
+ attr_reader :repo, :token
37
+
38
+ def prints_no_token_warning
39
+ puts "WARNING: No OAuth token is provided.".freeze
40
+ end
41
+
42
+ def client
43
+ @client ||= Octokit::Client.new(access_token: token)
44
+ end
45
+
46
+ def find_from_contents
47
+ if resources = client.contents(repo)
48
+ resources.find do |resource|
49
+ resource.name =~ FILES_TO_SEARCH_REGEXP
50
+ end
51
+ end
52
+ end
20
53
 
21
- def news_html_url
22
- @news_html_url ||= news.html_url
54
+ def find_from_releases
55
+ if resources = client.releases(repo)
56
+ resources.find do |release|
57
+ release.respond_to?(:body) && !release.body.empty?
58
+ end
59
+ end
23
60
  end
24
61
  end
25
62
  end
@@ -1,3 +1,3 @@
1
1
  module Whatsnew
2
- VERSION = "0.4.1"
2
+ VERSION = "1.0.0".freeze
3
3
  end
data/lib/whatsnew.rb CHANGED
@@ -1,13 +1,19 @@
1
1
  require "whatsnew/version"
2
- require "whatsnew/remote_files"
2
+ require "whatsnew/constants"
3
+
4
+ require "whatsnew/no_news_file"
5
+
6
+ require "whatsnew/local_news_file"
3
7
  require "whatsnew/local_files"
8
+
4
9
  require "whatsnew/news_file"
5
- require "whatsnew/no_news_file"
10
+ require "whatsnew/release_file"
11
+ require "whatsnew/remote_files"
12
+
6
13
  require "whatsnew/project"
7
14
 
8
15
  module Whatsnew
9
- # Each resource must respond to message :name and :html.
10
- def self.about(path_or_resources)
11
- Whatsnew::Project.new(path_or_resources).news_file
16
+ def self.about(path_or_repo, access_token = nil)
17
+ Project.new(path_or_repo, access_token).news_file
12
18
  end
13
19
  end
data/whatsnew.gemspec CHANGED
@@ -20,4 +20,7 @@ Gem::Specification.new do |spec|
20
20
  spec.require_paths = ["lib"]
21
21
 
22
22
  spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
23
+
24
+ spec.add_dependency "thor", [">= 0.19.1", "< 2"]
25
+ spec.add_dependency "octokit", [">= 4.1.1", "< 5"]
23
26
  end
metadata CHANGED
@@ -1,15 +1,55 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: whatsnew
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.1
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Juanito Fatas
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-08-09 00:00:00.000000000 Z
12
- dependencies: []
11
+ date: 2015-12-26 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: thor
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 0.19.1
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: '2'
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ version: 0.19.1
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: '2'
33
+ - !ruby/object:Gem::Dependency
34
+ name: octokit
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: 4.1.1
40
+ - - "<"
41
+ - !ruby/object:Gem::Version
42
+ version: '5'
43
+ type: :runtime
44
+ prerelease: false
45
+ version_requirements: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - ">="
48
+ - !ruby/object:Gem::Version
49
+ version: 4.1.1
50
+ - - "<"
51
+ - !ruby/object:Gem::Version
52
+ version: '5'
13
53
  description: Find out what's new about a project
14
54
  email:
15
55
  - katehuang0320@gmail.com
@@ -19,10 +59,10 @@ extensions: []
19
59
  extra_rdoc_files: []
20
60
  files:
21
61
  - ".gitignore"
62
+ - ".rspec"
22
63
  - ".travis.yml"
23
64
  - CHANGELOG.md
24
65
  - CONTRIBUTING.md
25
- - DEVELOPMENT.md
26
66
  - Gemfile
27
67
  - LICENSE.md
28
68
  - README.md
@@ -30,10 +70,14 @@ files:
30
70
  - bin/dev
31
71
  - bin/whatsnew
32
72
  - lib/whatsnew.rb
73
+ - lib/whatsnew/cli.rb
74
+ - lib/whatsnew/constants.rb
33
75
  - lib/whatsnew/local_files.rb
76
+ - lib/whatsnew/local_news_file.rb
34
77
  - lib/whatsnew/news_file.rb
35
78
  - lib/whatsnew/no_news_file.rb
36
79
  - lib/whatsnew/project.rb
80
+ - lib/whatsnew/release_file.rb
37
81
  - lib/whatsnew/remote_files.rb
38
82
  - lib/whatsnew/version.rb
39
83
  - whatsnew.gemspec
@@ -57,9 +101,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
57
101
  version: '0'
58
102
  requirements: []
59
103
  rubyforge_project:
60
- rubygems_version: 2.4.8
104
+ rubygems_version: 2.4.5.1
61
105
  signing_key:
62
106
  specification_version: 4
63
107
  summary: Find out what's new about a project
64
108
  test_files: []
65
- has_rdoc:
data/DEVELOPMENT.md DELETED
@@ -1,13 +0,0 @@
1
- # Development
2
-
3
- ## Install Dependencies
4
-
5
- $ bundle
6
-
7
- ## Running Tests
8
-
9
- $ bundle exec rake
10
-
11
- ## Run with local gem
12
-
13
- $ bin/dev