github actions #1

Merged
dickmao merged 7 commits from dev into master 2020-02-12 05:08:45 +00:00
8 changed files with 217 additions and 80 deletions

View File

@ -14,7 +14,7 @@ jobs:
matrix: matrix:
os: [ubuntu-latest, macos-latest] os: [ubuntu-latest, macos-latest]
emacs_version: [25.1, 26.3] emacs_version: [25.1, 26.3]
ruby-version: [2.6] ruby_version: [2.6]
include: include:
- emacs_version: 24.1 - emacs_version: 24.1
lint_ignore: 1 lint_ignore: 1
@ -26,13 +26,17 @@ jobs:
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v2
- uses: actions/setup-ruby@v1
with:
ruby-version: ${{ matrix.ruby_version }}
- uses: purcell/setup-emacs@master - uses: purcell/setup-emacs@master
with: with:
version: ${{ matrix.emacs_version }} version: ${{ matrix.emacs_version }}
- uses: dickmao/setup-paths@master - uses: dickmao/setup-paths@master
with: with:
paths: local/bin:local/cask/bin:.rbenv/bin paths: local/bin:local/cask/bin
- uses: actions/cache@v1 - uses: actions/cache@v1
if: startsWith(runner.os, 'Linux') if: startsWith(runner.os, 'Linux')
@ -46,13 +50,6 @@ jobs:
path: ~/Library/Caches/rubocop_cache path: ~/Library/Caches/rubocop_cache
key: ${{ runner.os }}-rubocop key: ${{ runner.os }}-rubocop
- uses: actions/cache@v1
with:
path: ~/.rbenv
key: ${{ runner.os }}-rbenv-${{ hashFiles('**/.ruby-version') }}
restore-keys: |
{{ runner.os }}-rbenv-
- uses: actions/cache@v1 - uses: actions/cache@v1
with: with:
path: ~/local path: ~/local
@ -68,24 +65,16 @@ jobs:
path: ~/.cask path: ~/.cask
key: cask-000 key: cask-000
- name: macos-rbenv - uses: actions/cache@v1
if: startsWith(runner.os, 'macOS') with:
run: brew list rbenv &>/dev/null || HOMEBREW_NO_AUTO_UPDATE=1 brew install rbenv path: nndiscourse/vendor/bundle
key: ${{ runner.os }}-gems-${{ hashFiles('**/Gemfile.lock') }}
- name: linux-rbenv restore-keys: |
if: startsWith(runner.os, 'Linux') ${{ runner.os }}-gems-
uses: |
masa-iwasaki/setup-rbenv@v1
- name: ruby
run: |
eval "eval $(rbenv init - --no-rehash)"
rbenv install -s ${{ matrix.ruby-version }}
- name: bundler - name: bundler
run: | run: |
eval "eval $(rbenv init - --no-rehash)" gem install --user-install bundler
gem install bundler
- name: apt-get - name: apt-get
if: startsWith(runner.os, 'Linux') if: startsWith(runner.os, 'Linux')
@ -113,5 +102,4 @@ jobs:
- name: test - name: test
run: | run: |
eval "eval $(rbenv init - --no-rehash)"
make test make test

View File

@ -3,7 +3,7 @@ export CASK := $(shell which cask)
ifeq ($(CASK),) ifeq ($(CASK),)
$(error Please install CASK at https://cask.readthedocs.io/en/latest/guide/installation.html) $(error Please install CASK at https://cask.readthedocs.io/en/latest/guide/installation.html)
endif endif
CASK_DIR := $(shell EMACS=$(EMACS) cask package-directory || exit 1) CASK_DIR := $(shell $(CASK) package-directory || exit 1)
SRC = $(shell $(CASK) files) SRC = $(shell $(CASK) files)
PKBUILD = 2.3 PKBUILD = 2.3
VERSION = $(shell $(CASK) version) VERSION = $(shell $(CASK) version)
@ -17,6 +17,12 @@ ELCTESTS = $(TESTSSRC:.el=.elc)
autoloads: autoloads:
$(EMACS) -Q --batch --eval "(package-initialize)" --eval "(package-generate-autoloads \"nndiscourse\" \".\")" $(EMACS) -Q --batch --eval "(package-initialize)" --eval "(package-generate-autoloads \"nndiscourse\" \".\")"
README.rst: README.in.rst nndiscourse.el
grep ';;' nndiscourse.el \
| awk '/;;;\s*Commentary/{within=1;next}/;;;\s*/{within=0}within' \
| sed -e 's/^\s*;;*\s*//g' \
| tools/readme-sed.sh "COMMENTARY" README.in.rst > README.rst
.PHONY: clean .PHONY: clean
clean: clean:
$(CASK) clean-elc $(CASK) clean-elc

67
README.in.rst 100644
View File

@ -0,0 +1,67 @@
|build-status|
.. COMMENTARY (see Makefile)
.. |build-status|
image:: https://github.com/dickmao/nndiscourse/workflows/CI/badge.svg
:target: https://github.com/dickmao/nndiscourse/actions
:alt: Build Status
.. |melpa-dev|
image:: http://melpa.milkbox.net/packages/nndiscourse-badge.svg
:target: http://melpa.milkbox.net/#/nndiscourse
:alt: MELPA development version
.. image:: screenshot.png
.. |--| unicode:: U+2013 .. en dash
.. |---| unicode:: U+2014 .. em dash, trimming surrounding whitespace
:trim:
Install
=======
As described in `Getting started`_, ensure melpa's whereabouts in ``init.el`` or ``.emacs``::
(add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/"))
Then
::
M-x package-refresh-contents RET
M-x package-install RET nndiscourse RET
Alternatively, directly clone this repo and ``make install``.
Also see Troubleshooting_.
Usage
=====
In your ``.emacs`` or ``init.el``, use ONE of the following:
::
;; Applies to first-time Gnus users
(custom-set-variables '(gnus-select-method (quote (nndiscourse ""))))
or, if you're an existing Gnus user,
::
;; Applies to existing Gnus users
(add-to-list 'gnus-secondary-select-methods '(nndiscourse ""))
Then ``M-x gnus``.
Select a topic category via ``RET``. Rapidly catch yourself up via ``N`` and ``P``. Instantly catch-up with ``c``.
From the ``*Group*`` buffer, press ``g`` to refresh all categories. ``M-g`` on a particular category to refresh individually.
From the summary buffer, ``/o`` redisplays posts already read. ``x`` undisplays them.
Gnus beginners may find the interface bewildering. In particular, categories with no unread posts do not display. Use ``L`` to bring them out of hiding.
Troubleshooting
===============
Clone this repo. Then install Cask_. Then try ``make test-run-interactive``.
.. _Cask: https://cask.readthedocs.io/en/latest/guide/installation.html
.. _Getting started: http://melpa.org/#/getting-started

View File

@ -1 +1,67 @@
Read ``emacs-china.org`` in Gnus. |build-status|
A Gnus backend for Discourse.
.. |build-status|
image:: https://github.com/dickmao/nndiscourse/workflows/CI/badge.svg
:target: https://github.com/dickmao/nndiscourse/actions
:alt: Build Status
.. |melpa-dev|
image:: http://melpa.milkbox.net/packages/nndiscourse-badge.svg
:target: http://melpa.milkbox.net/#/nndiscourse
:alt: MELPA development version
.. image:: screenshot.png
.. |--| unicode:: U+2013 .. en dash
.. |---| unicode:: U+2014 .. em dash, trimming surrounding whitespace
:trim:
Install
=======
As described in `Getting started`_, ensure melpa's whereabouts in ``init.el`` or ``.emacs``::
(add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/"))
Then
::
M-x package-refresh-contents RET
M-x package-install RET nndiscourse RET
Alternatively, directly clone this repo and ``make install``.
Also see Troubleshooting_.
Usage
=====
In your ``.emacs`` or ``init.el``, use ONE of the following:
::
;; Applies to first-time Gnus users
(custom-set-variables '(gnus-select-method (quote (nndiscourse ""))))
or, if you're an existing Gnus user,
::
;; Applies to existing Gnus users
(add-to-list 'gnus-secondary-select-methods '(nndiscourse ""))
Then ``M-x gnus``.
Select a topic category via ``RET``. Rapidly catch yourself up via ``N`` and ``P``. Instantly catch-up with ``c``.
From the ``*Group*`` buffer, press ``g`` to refresh all categories. ``M-g`` on a particular category to refresh individually.
From the summary buffer, ``/o`` redisplays posts already read. ``x`` undisplays them.
Gnus beginners may find the interface bewildering. In particular, categories with no unread posts do not display. Use ``L`` to bring them out of hiding.
Troubleshooting
===============
Clone this repo. Then install Cask_. Then try ``make test-run-interactive``.
.. _Cask: https://cask.readthedocs.io/en/latest/guide/installation.html
.. _Getting started: http://melpa.org/#/getting-started

View File

@ -8,7 +8,7 @@ Scenario: install
And I go to word "david" And I go to word "david"
And I press "RET" And I press "RET"
And I switch to buffer "*Article nndiscourse+meta.discourse.org:bug*" And I switch to buffer "*Article nndiscourse+meta.discourse.org:bug*"
Then I should see ":eyes:" Then I should see "Recent Changes"
Then prospective unreads for "nndiscourse+meta.discourse.org:bug" is 1 Then prospective unreads for "nndiscourse+meta.discourse.org:bug" is 1
And I switch to buffer "*Summary nndiscourse+meta.discourse.org:bug*" And I switch to buffer "*Summary nndiscourse+meta.discourse.org:bug*"
And I press "q" And I press "q"

View File

@ -262,6 +262,8 @@ Starting in emacs-src commit c1b63af, Gnus moved from obarrays to normal hashtab
(make-mutex "nndiscourse--mutex-rpc-request")) (make-mutex "nndiscourse--mutex-rpc-request"))
"Only one jsonrpc output buffer, so avoid two requests using at the same time.") "Only one jsonrpc output buffer, so avoid two requests using at the same time.")
(declare-function set-process-thread "process" t t) ;; emacs-25
(defun nndiscourse-rpc-request (server method &rest args) (defun nndiscourse-rpc-request (server method &rest args)
"Make jsonrpc call to SERVER invoking METHOD ARGS. "Make jsonrpc call to SERVER invoking METHOD ARGS.
@ -277,7 +279,7 @@ reinstantiated with every call.
Return response of METHOD ARGS of type `json-object-type' or nil if failure." Return response of METHOD ARGS of type `json-object-type' or nil if failure."
(when (and (nndiscourse-good-server server) (nndiscourse-server-opened server)) (when (and (nndiscourse-good-server server) (nndiscourse-server-opened server))
(condition-case-unless-debug err (condition-case err
(let* ((port (nndiscourse-proc-info-port (let* ((port (nndiscourse-proc-info-port
(cdr (assoc server nndiscourse-processes)))) (cdr (assoc server nndiscourse-processes))))
(connection (json-rpc-connect nndiscourse-localhost port))) (connection (json-rpc-connect nndiscourse-localhost port)))
@ -400,6 +402,47 @@ I am counting on `gnus-check-server` in `gnus-read-active-file-1' in
(unless original-global-rbenv-mode (unless original-global-rbenv-mode
(global-rbenv-mode -1)))))) (global-rbenv-mode -1))))))
(defun nndiscourse-alist-get (key alist &optional default remove testfn)
"Replicated library function for emacs-25.
Same argument meanings for KEY ALIST DEFAULT REMOVE and TESTFN."
(ignore remove)
(let ((x (if (not testfn)
(assq key alist)
(assoc key alist))))
(if x (cdr x) default)))
(gv-define-expander nndiscourse-alist-get
(lambda (do key alist &optional default remove testfn)
(macroexp-let2 macroexp-copyable-p k key
(gv-letplace (getter setter) alist
(macroexp-let2 nil p `(if (and ,testfn (not (eq ,testfn 'eq)))
(assoc ,k ,getter)
(assq ,k ,getter))
(funcall do (if (null default) `(cdr ,p)
`(if ,p (cdr ,p) ,default))
(lambda (v)
(macroexp-let2 nil v v
(let ((set-exp
`(if ,p (setcdr ,p ,v)
,(funcall setter
`(cons (setq ,p (cons ,k ,v))
,getter)))))
`(progn
,(cond
((null remove) set-exp)
((or (eql v default)
(and (eq (car-safe v) 'quote)
(eq (car-safe default) 'quote)
(eql (cadr v) (cadr default))))
`(if ,p ,(funcall setter `(delq ,p ,getter))))
(t
`(cond
((not (eql ,default ,v)) ,set-exp)
(,p ,(funcall setter
`(delq ,p ,getter))))))
,v))))))))))
(defun nndiscourse-register-process (port proc) (defun nndiscourse-register-process (port proc)
"Register PORT and PROC with a server-name-qua-url. "Register PORT and PROC with a server-name-qua-url.
Return PROC if success, nil otherwise." Return PROC if success, nil otherwise."
@ -409,7 +452,8 @@ Return PROC if success, nil otherwise."
(prog1 proc (prog1 proc
(gnus-message 5 "nndiscourse-register-process: registering %s" (gnus-message 5 "nndiscourse-register-process: registering %s"
(process-name proc)) (process-name proc))
(setf (alist-get (process-name proc) nndiscourse-processes nil nil #'equal) (setf (nndiscourse-alist-get (process-name proc) nndiscourse-processes
nil nil #'equal)
(make-nndiscourse-proc-info :port port :process proc))) (make-nndiscourse-proc-info :port port :process proc)))
(prog1 nil (prog1 nil
(gnus-message 3 "`nndiscourse-register-process': dead process %s" (gnus-message 3 "`nndiscourse-register-process': dead process %s"
@ -418,12 +462,12 @@ Return PROC if success, nil otherwise."
(defun nndiscourse-deregister-process (server) (defun nndiscourse-deregister-process (server)
"Disavow any knowledge of SERVER's process." "Disavow any knowledge of SERVER's process."
(aif (alist-get server nndiscourse-processes nil nil #'equal) (aif (nndiscourse-alist-get server nndiscourse-processes nil nil #'equal)
(let ((proc (nndiscourse-proc-info-process it))) (let ((proc (nndiscourse-proc-info-process it)))
(gnus-message 5 "`nndiscourse-deregister-process': deregistering %s %s pid=%s" (gnus-message 5 "`nndiscourse-deregister-process': deregistering %s %s pid=%s"
server (process-name proc) (process-id proc)) server (process-name proc) (process-id proc))
(delete-process proc))) (delete-process proc)))
(setf (alist-get server nndiscourse-processes nil nil #'equal) nil)) (setf (nndiscourse-alist-get server nndiscourse-processes nil nil #'equal) nil))
(deffoo nndiscourse-close-server (&optional server _defs) (deffoo nndiscourse-close-server (&optional server _defs)
"Patterning after nnimap.el." "Patterning after nnimap.el."
@ -531,7 +575,6 @@ Originally written by Paul Issartel."
(nndiscourse--with-group server group (nndiscourse--with-group server group
(gnus-message 5 "nndiscourse-request-group-scan: scanning %s..." group) (gnus-message 5 "nndiscourse-request-group-scan: scanning %s..." group)
(nndiscourse-request-scan nil server) (nndiscourse-request-scan nil server)
(gnus-activate-group gnus-newsgroup-name t nil (gnus-info-method info))
(gnus-get-unread-articles-in-group (gnus-get-unread-articles-in-group
(or info (gnus-get-info gnus-newsgroup-name)) (or info (gnus-get-info gnus-newsgroup-name))
(gnus-active (gnus-info-group info))) (gnus-active (gnus-info-group info)))
@ -579,7 +622,8 @@ Originally written by Paul Issartel."
(defun nndiscourse-get-categories (server) (defun nndiscourse-get-categories (server)
"Query SERVER /categories.json." "Query SERVER /categories.json."
(seq-filter (lambda (x) (eq json-false (plist-get x :read_restricted))) (seq-filter (lambda (x) (eq json-false (plist-get x :read_restricted)))
(funcall #'nndiscourse-rpc-request server "categories"))) (let ((cats (funcall #'nndiscourse-rpc-request server "categories")))
(if (seqp cats) cats nil))))
(cl-defun nndiscourse-get-topics (server slug &key (page 0)) (cl-defun nndiscourse-get-topics (server slug &key (page 0))
"Query SERVER /c/SLUG/l/latest.json, optionally for PAGE." "Query SERVER /c/SLUG/l/latest.json, optionally for PAGE."
@ -589,7 +633,9 @@ Originally written by Paul Issartel."
(cl-defun nndiscourse-get-posts (server &key (before 0)) (cl-defun nndiscourse-get-posts (server &key (before 0))
"Query SERVER /posts.json for posts before BEFORE." "Query SERVER /posts.json for posts before BEFORE."
(plist-get (funcall #'nndiscourse-rpc-request server "posts" :before before) :latest_posts)) (plist-get (let ((result (funcall #'nndiscourse-rpc-request server
"posts" :before before)))
(if (listp result) result nil)) :latest_posts))
(defun nndiscourse--number-to-header (server group topic-id post-number) (defun nndiscourse--number-to-header (server group topic-id post-number)
"O(n) search for SERVER GROUP TOPIC-ID POST-NUMBER in headers." "O(n) search for SERVER GROUP TOPIC-ID POST-NUMBER in headers."
@ -603,16 +649,23 @@ Originally written by Paul Issartel."
(= post-number* (plist-get plst :post_number)))))))) (= post-number* (plist-get plst :post_number))))))))
(elt headers found))) (elt headers found)))
(defsubst nndiscourse-hash-count (table-or-obarray)
"Return number items in TABLE-OR-OBARRAY."
(let ((result 0))
(nndiscourse--maphash (lambda (&rest _args) (cl-incf result)) table-or-obarray)
result))
(defun nndiscourse--incoming (server) (defun nndiscourse--incoming (server)
"Drink from the SERVER firehose." "Drink from the SERVER firehose."
(interactive) (interactive)
(setq nndiscourse--debug-request-posts nil) (setq nndiscourse--debug-request-posts nil)
(unless (nndiscourse--maphash #'cons nndiscourse--categories-hashtb) (when (zerop (nndiscourse-hash-count nndiscourse--categories-hashtb))
(nndiscourse-request-list server)) (nndiscourse-request-list server))
(cl-loop (cl-loop
with new-posts with new-posts
for page-bottom = 1 then (plist-get (elt posts (1- (length posts))) :id) for page-bottom = 1 then (plist-get (elt posts (1- (length posts))) :id)
for posts = (nndiscourse-get-posts server :before (1- page-bottom)) for posts = (nndiscourse-get-posts server :before (1- page-bottom))
until (null posts)
do (unless nndiscourse--last-id do (unless nndiscourse--last-id
(setq nndiscourse--last-id (setq nndiscourse--last-id
(1- (plist-get (elt posts (1- (length posts))) :id)))) (1- (plist-get (elt posts (1- (length posts))) :id))))
@ -662,7 +715,7 @@ Originally written by Paul Issartel."
(nconc (nndiscourse-get-headers server group) (list plst))))) (nconc (nndiscourse-get-headers server group) (list plst)))))
(gnus-message (gnus-message
5 (concat "nndiscourse--incoming: " 5 (concat "nndiscourse--incoming: "
(format "last-id: %d, " nndiscourse--last-id) (format "last-id: %s, " nndiscourse--last-id)
(let ((result "")) (let ((result ""))
(nndiscourse--maphash (nndiscourse--maphash
(lambda (key value) (lambda (key value)

View File

@ -1,19 +0,0 @@
#!/bin/bash
# Install evm for Travis CI
# or if already installed, then check for updates
# Author: gonewest818 https://github.com/clojure-emacs/cider/pull/2139
set -x
WORKDIR=${HOME}/local
EVMDIR=$WORKDIR/evm
. tools/retry.sh
if [ -d $EVMDIR ]
then
cd $EVMDIR
git pull origin master
else
git clone https://github.com/rejeep/evm.git $EVMDIR
fi

View File

@ -1,24 +0,0 @@
#!/bin/bash
# Create virtualenvs for python{2,3} for Travis CI on OSX
set -x
WORKDIR=${HOME}/local
. tools/retry.sh
if [ "x$TRAVIS_OS_NAME" = "xosx" ]; then
brew list pyenv-virtualenv || HOMEBREW_NO_AUTO_UPDATE=1 brew install pyenv-virtualenv
case "${TOXENV}" in
py27)
pyenv install -s 2.7.13
pyenv virtualenv -f 2.7.13 py27
;;
py35)
pyenv install -s 3.5.2
pyenv virtualenv -f 3.5.2 py35
;;
esac
fi