plan_my_stuff 0.15.0 → 0.17.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 +4 -4
- data/CHANGELOG.md +27 -0
- data/lib/plan_my_stuff/issue.rb +31 -0
- data/lib/plan_my_stuff/metadata_parser.rb +34 -6
- data/lib/plan_my_stuff/version.rb +1 -1
- data/lib/plan_my_stuff.rb +5 -0
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: fe4f92dc92eca010b6fc7f53f4ce7701c6852420c9a537fdf0902e591c3309ad
|
|
4
|
+
data.tar.gz: b167fd42a3b5a37fc897bebf8f3696ed2cd863ac7049359445a329d9a7861988
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 746332e19a507f81dc0ee902a87664dcb0a55e3170d688d878b14faf508bfb67cc5dd3236a4961c6b15768fd47e7489b6b0cdbe5bdd5d328bcf9836f805d561d
|
|
7
|
+
data.tar.gz: 26a20b3318c99f34360bba90eee5698242f4043043991bf53d59e55b2507516452a5094c14366b19f6f53a140ff0b8a41f326a7048c13c4077f447eb2a083513
|
data/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,32 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.17.0
|
|
4
|
+
|
|
5
|
+
### Added
|
|
6
|
+
|
|
7
|
+
- `PlanMyStuff.deprecator` returns a gem-scoped `ActiveSupport::Deprecation` instance.
|
|
8
|
+
Consuming apps can silence, filter, or re-route PMS deprecation warnings independently
|
|
9
|
+
of Rails' own deprecator.
|
|
10
|
+
|
|
11
|
+
### Changed
|
|
12
|
+
|
|
13
|
+
- Issue, comment, and project-readme metadata is now stored in a visible `<details>` block
|
|
14
|
+
with a JSON code fence instead of a hidden HTML comment. GitHub renders the block in-page
|
|
15
|
+
so the metadata is inspectable without opening the body editor (closes #58).
|
|
16
|
+
`MetadataParser.parse` still accepts the legacy `<!-- pms-metadata:... -->` format and
|
|
17
|
+
emits a deprecation warning when it sees one; pre-0.17.0 bodies keep parsing and
|
|
18
|
+
re-serialize to the new format on their next write. Legacy detection will be removed
|
|
19
|
+
in 1.0.0.
|
|
20
|
+
|
|
21
|
+
## 0.16.0
|
|
22
|
+
|
|
23
|
+
### Added
|
|
24
|
+
|
|
25
|
+
- `PlanMyStuff::Issue.count(repo:, state:, labels:)` returns the total count of matching issues via the
|
|
26
|
+
GitHub Search API in a single request, without paginating full issue payloads. Mirrors `Issue.list`
|
|
27
|
+
kwargs (minus `page`/`per_page`); returns an `Integer`. Excludes PRs server-side via the `is:issue`
|
|
28
|
+
qualifier.
|
|
29
|
+
|
|
3
30
|
## 0.15.0
|
|
4
31
|
|
|
5
32
|
### Breaking
|
data/lib/plan_my_stuff/issue.rb
CHANGED
|
@@ -312,6 +312,37 @@ module PlanMyStuff
|
|
|
312
312
|
filtered.map { |gi| build(gi, repo: resolved_repo) }
|
|
313
313
|
end
|
|
314
314
|
|
|
315
|
+
# Counts GitHub issues matching the given filters without paginating full payloads.
|
|
316
|
+
#
|
|
317
|
+
# Uses GitHub's Search API (+search/issues+), which returns +total_count+ in a single
|
|
318
|
+
# request. The +is:issue+ qualifier excludes PRs server-side.
|
|
319
|
+
#
|
|
320
|
+
# Caveats:
|
|
321
|
+
# - The search index lags writes by up to ~1 minute, so freshly created/closed issues
|
|
322
|
+
# may not be reflected immediately.
|
|
323
|
+
# - The Search API has its own rate limit (30 req/min authenticated) separate from
|
|
324
|
+
# the core REST API.
|
|
325
|
+
#
|
|
326
|
+
# @param repo [Symbol, String, nil] defaults to config.default_repo
|
|
327
|
+
# @param state [Symbol] :open, :closed, or :all
|
|
328
|
+
# @param labels [Array<String>]
|
|
329
|
+
#
|
|
330
|
+
# @return [Integer]
|
|
331
|
+
#
|
|
332
|
+
def count(repo: nil, state: :open, labels: [])
|
|
333
|
+
client = PlanMyStuff.client
|
|
334
|
+
resolved_repo = client.resolve_repo!(repo)
|
|
335
|
+
|
|
336
|
+
normalized_state = state.to_s
|
|
337
|
+
qualifiers = ["repo:#{resolved_repo}", 'is:issue']
|
|
338
|
+
qualifiers << "is:#{normalized_state}" unless normalized_state == 'all'
|
|
339
|
+
labels_to_use = Array.wrap(labels).sort
|
|
340
|
+
qualifiers += labels_to_use.map do |label|
|
|
341
|
+
"label:\"#{label}\""
|
|
342
|
+
end
|
|
343
|
+
client.rest(:search_issues, qualifiers.join(' '), per_page: 1).total_count
|
|
344
|
+
end
|
|
345
|
+
|
|
315
346
|
# Submits one or more pre-built payloads to GitHub's "Import Issues" preview endpoint
|
|
316
347
|
# (+POST /repos/:repo/import/issues+). One request per payload: the endpoint only accepts a single
|
|
317
348
|
# +{issue:, comments:}+ payload at a time.
|
|
@@ -1,10 +1,26 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
+
require 'active_support/deprecation'
|
|
3
4
|
require 'json'
|
|
4
5
|
|
|
5
6
|
module PlanMyStuff
|
|
6
7
|
module MetadataParser
|
|
7
|
-
|
|
8
|
+
LEGACY_DEPRECATION_MESSAGE =
|
|
9
|
+
'PlanMyStuff: legacy <!-- pms-metadata: ... --> body format detected. It will continue to parse ' \
|
|
10
|
+
'until 1.0.0, at which point legacy detection will be removed. New writes already use the visible ' \
|
|
11
|
+
'<details> block format introduced in 0.17.0; existing bodies migrate on their next write.'
|
|
12
|
+
|
|
13
|
+
# New format: collapsible <details> block containing a JSON code fence.
|
|
14
|
+
# Renders visibly on GitHub (issue #58) instead of being hidden in an HTML comment.
|
|
15
|
+
METADATA_PATTERN = %r{
|
|
16
|
+
\A<details><summary>pms-metadata</summary>\n\n
|
|
17
|
+
```json\n(.*?)\n```\n\n
|
|
18
|
+
</details>\n*
|
|
19
|
+
}mx
|
|
20
|
+
|
|
21
|
+
# Legacy format kept for parsing only - existing issues serialized before 0.17.0
|
|
22
|
+
# used a hidden HTML comment. They migrate to the new format on the next write.
|
|
23
|
+
LEGACY_METADATA_PATTERN = /\A<!-- pms-metadata:(.*?) -->\n*/m
|
|
8
24
|
|
|
9
25
|
module_function
|
|
10
26
|
|
|
@@ -17,11 +33,14 @@ module PlanMyStuff
|
|
|
17
33
|
def parse(raw_body)
|
|
18
34
|
return { metadata: {}, body: '' } if raw_body.blank?
|
|
19
35
|
|
|
20
|
-
|
|
21
|
-
return { metadata: {}, body: raw_body } if
|
|
36
|
+
pattern = matching_pattern(raw_body)
|
|
37
|
+
return { metadata: {}, body: raw_body } if pattern.nil?
|
|
22
38
|
|
|
39
|
+
PlanMyStuff.deprecator.warn(LEGACY_DEPRECATION_MESSAGE) if pattern == LEGACY_METADATA_PATTERN
|
|
40
|
+
|
|
41
|
+
match = raw_body.match(pattern)
|
|
23
42
|
metadata = JSON.parse(match[1], symbolize_names: true)
|
|
24
|
-
body = raw_body.sub(
|
|
43
|
+
body = raw_body.sub(pattern, '')
|
|
25
44
|
|
|
26
45
|
{ metadata: metadata, body: body }
|
|
27
46
|
rescue JSON::ParserError
|
|
@@ -44,12 +63,21 @@ module PlanMyStuff
|
|
|
44
63
|
|
|
45
64
|
json =
|
|
46
65
|
if metadata.is_a?(PlanMyStuff::CustomFields)
|
|
47
|
-
metadata.
|
|
66
|
+
JSON.pretty_generate(metadata.to_h)
|
|
48
67
|
else
|
|
49
68
|
JSON.pretty_generate(metadata)
|
|
50
69
|
end
|
|
51
70
|
|
|
52
|
-
"
|
|
71
|
+
"<details><summary>pms-metadata</summary>\n\n```json\n#{json}\n```\n\n</details>\n\n#{body}"
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
# @param raw_body [String]
|
|
75
|
+
#
|
|
76
|
+
# @return [Regexp, nil] the pattern that matches at the start of +raw_body+, or +nil+ when neither matches
|
|
77
|
+
#
|
|
78
|
+
def matching_pattern(raw_body)
|
|
79
|
+
return METADATA_PATTERN if raw_body.match?(METADATA_PATTERN)
|
|
80
|
+
return LEGACY_METADATA_PATTERN if raw_body.match?(LEGACY_METADATA_PATTERN)
|
|
53
81
|
end
|
|
54
82
|
end
|
|
55
83
|
end
|
data/lib/plan_my_stuff.rb
CHANGED
|
@@ -38,6 +38,11 @@ module PlanMyStuff
|
|
|
38
38
|
@configuration ||= PlanMyStuff::Configuration.new
|
|
39
39
|
end
|
|
40
40
|
|
|
41
|
+
# @return [ActiveSupport::Deprecation]
|
|
42
|
+
def deprecator
|
|
43
|
+
@deprecator ||= ActiveSupport::Deprecation.new('1.0', 'PlanMyStuff')
|
|
44
|
+
end
|
|
45
|
+
|
|
41
46
|
# @return [PlanMyStuff::Configuration]
|
|
42
47
|
def configure
|
|
43
48
|
yield(configuration)
|