sinew 4.0.0 → 4.0.1

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: c16f880ce1bf6454b10c34dd1f071daf1a758eebb52e598262d6357cebb2e9f2
4
- data.tar.gz: 4e57acae70775805a96fd5e6bd7ed00ebd5d74dbc0e6daa3348fd9161118d00d
3
+ metadata.gz: 30b6d7da43f53885bd23a2d283ec2dc34f0f38640d4bac3c5f3275deed4f8e84
4
+ data.tar.gz: dfb86670352efb63ddad965418b619ab74edf8738a7ae55ed4c8ea521c2f625c
5
5
  SHA512:
6
- metadata.gz: 99bf3da2db47a04dbd6f18dfb7aa3f2bc5f706bbe460633f3f8e3589c85377ae14b35d43c750d384fbdeac0883247b5dbab696127700c6fee71731818df57e74
7
- data.tar.gz: 1ecda4412fc9f2384bf01aa38ed40327ac5855c37eb3c82ce65d21779a8a582880c6afaffa5d68954759ddccaa04cec9a6f36f8460c96849722ecafe4ac2ba6e
6
+ metadata.gz: 230c4c81b27dd5087bb44ac3b89b29bed65222d81327c4dd8580c5762e50cb1d54d5521d5d3349f7d40a228244e9fc436d502fa22e879909ce2b983b9d1cee0f
7
+ data.tar.gz: ce76f649971d961bd22de2f8b71f1226838b9e8385dd269fe2e695e93164e850b16fff3a6c4c42b5fb961beff9a6675deb6fa5e66060053274a464d878cd0d35
@@ -2,11 +2,7 @@ name: test
2
2
 
3
3
  on:
4
4
  push:
5
- paths-ignore:
6
- - '**.md'
7
5
  pull_request:
8
- paths-ignore:
9
- - '**.md'
10
6
  workflow_dispatch:
11
7
 
12
8
  jobs:
@@ -15,12 +11,12 @@ jobs:
15
11
  max-parallel: 3
16
12
  matrix:
17
13
  os: [ubuntu, macos]
18
- ruby-version: [3.0, 2.7]
14
+ ruby-version: [head, 3.2, 3.1]
19
15
  runs-on: ${{ matrix.os }}-latest
20
16
  steps:
21
- - uses: actions/checkout@v2
17
+ - uses: actions/checkout@v3
18
+ - uses: taiki-e/install-action@just
22
19
  - uses: ruby/setup-ruby@v1
23
20
  with:
24
21
  ruby-version: ${{ matrix.ruby-version }}
25
- - run: bundle install
26
- - run: bundle exec rake test
22
+ - run: just ci
data/.rubocop.yml CHANGED
@@ -1,34 +1,17 @@
1
+ require:
2
+ - standard
3
+
4
+ inherit_gem:
5
+ standard: config/base.yml
6
+
1
7
  AllCops:
2
8
  NewCops: enable
3
9
  SuggestExtensions: false
4
- TargetRubyVersion: 2.7
10
+ TargetRubyVersion: 3.1
5
11
 
6
- # this is buggy in 2.7.0
7
- Style/HashTransformValues: { Enabled: false }
12
+ #
13
+ # fight with standardrb!
14
+ #
8
15
 
9
- # minimal personal preference
10
- Layout/CaseIndentation: { Enabled: false }
11
- Layout/EndAlignment: { EnforcedStyleAlignWith: variable }
12
- Lint/AssignmentInCondition: { Enabled: false }
13
- Lint/NonLocalExitFromIterator: { Enabled: false }
14
- Metrics: { Enabled: false }
15
- Naming/HeredocDelimiterNaming: { Enabled: false }
16
- Naming/MethodParameterName: { Enabled: false }
17
- Naming/VariableNumber: { Enabled: false }
18
- Style/AsciiComments: { Enabled: false }
19
- Style/ClassVars: { Enabled: false }
20
- Style/CommentAnnotation: { Enabled: false }
21
- Style/Documentation: { Enabled: false }
22
- Style/DoubleNegation: { Enabled: false }
23
- Style/EmptyCaseCondition: { Enabled: false }
24
- Style/FormatStringToken: { Enabled: false }
25
- Style/FrozenStringLiteralComment: { Enabled: false }
26
- Style/GuardClause: { Enabled: false }
27
- Style/IfUnlessModifier: { Enabled: false }
28
- Style/NegatedIf: { Enabled: false }
29
- Style/NumericPredicate: { Enabled: false }
30
- Style/ParallelAssignment: { Enabled: false }
31
- Style/StderrPuts: { Enabled: false }
32
- Style/StringConcatenation: { Enabled: false }
33
- Style/TrailingCommaInArrayLiteral: { EnforcedStyleForMultiline: consistent_comma }
34
- Style/TrailingCommaInHashLiteral: { EnforcedStyleForMultiline: consistent_comma }
16
+ Style/RedundantReturn: { Enabled: false }
17
+ Style/HashSyntax: { EnforcedShorthandSyntax: always }
data/Gemfile CHANGED
@@ -1,11 +1,11 @@
1
- source 'http://rubygems.org'
1
+ source "http://rubygems.org"
2
2
  gemspec
3
3
 
4
4
  group :development, :test do
5
- gem 'minitest'
6
- gem 'mocha'
7
- gem 'pry'
8
- gem 'rake'
9
- gem 'rubocop', '~> 1.18'
10
- gem 'webmock'
5
+ gem "minitest"
6
+ gem "mocha"
7
+ gem "pry"
8
+ gem "rake"
9
+ gem "standard", require: false
10
+ gem "webmock"
11
11
  end
data/Gemfile.lock CHANGED
@@ -1,124 +1,132 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- sinew (4.0.0)
5
- amazing_print (~> 1.3)
6
- faraday (~> 1.4)
7
- faraday-encoding (~> 0)
4
+ sinew (4.0.1)
5
+ amazing_print (~> 1.5)
6
+ faraday (~> 2.7)
7
+ faraday-encoding (~> 0.0)
8
8
  faraday-rate_limiter (~> 0.0)
9
- hashie (~> 4.1)
10
- httpdisk (~> 0.5)
11
- nokogiri (~> 1.11)
12
- slop (~> 4.8)
9
+ faraday-retry (~> 2.0)
10
+ hashie (~> 5.0)
11
+ httpdisk (~> 1.0)
12
+ nokogiri (~> 1.15)
13
+ slop (~> 4.10)
13
14
  sterile (~> 1.0)
14
15
 
15
16
  GEM
16
17
  remote: http://rubygems.org/
17
18
  specs:
18
- addressable (2.8.0)
19
- public_suffix (>= 2.0.2, < 5.0)
20
- amazing_print (1.3.0)
19
+ addressable (2.8.5)
20
+ public_suffix (>= 2.0.2, < 6.0)
21
+ amazing_print (1.5.0)
21
22
  ast (2.4.2)
22
23
  coderay (1.1.3)
23
- content-type (0.0.1)
24
- parslet (~> 1.5)
24
+ content-type (0.0.2)
25
+ parslet (~> 2.0)
25
26
  crack (0.4.5)
26
27
  rexml
27
28
  domain_name (0.5.20190701)
28
29
  unf (>= 0.0.5, < 1.0.0)
29
- faraday (1.5.0)
30
- faraday-em_http (~> 1.0)
31
- faraday-em_synchrony (~> 1.0)
32
- faraday-excon (~> 1.1)
33
- faraday-httpclient (~> 1.0.1)
34
- faraday-net_http (~> 1.0)
35
- faraday-net_http_persistent (~> 1.1)
36
- faraday-patron (~> 1.0)
37
- multipart-post (>= 1.2, < 3)
30
+ faraday (2.7.10)
31
+ faraday-net_http (>= 2.0, < 3.1)
38
32
  ruby2_keywords (>= 0.0.4)
39
33
  faraday-cookie_jar (0.0.7)
40
34
  faraday (>= 0.8.0)
41
35
  http-cookie (~> 1.0.0)
42
- faraday-em_http (1.0.0)
43
- faraday-em_synchrony (1.0.0)
44
36
  faraday-encoding (0.0.5)
45
37
  faraday
46
- faraday-excon (1.1.0)
47
- faraday-httpclient (1.0.1)
48
- faraday-net_http (1.0.1)
49
- faraday-net_http_persistent (1.1.0)
50
- faraday-patron (1.0.0)
38
+ faraday-follow_redirects (0.3.0)
39
+ faraday (>= 1, < 3)
40
+ faraday-net_http (3.0.2)
51
41
  faraday-rate_limiter (0.0.4)
52
42
  faraday
53
- faraday_middleware (1.0.0)
54
- faraday (~> 1.0)
43
+ faraday-retry (2.0.0)
44
+ faraday (~> 2.0)
55
45
  hashdiff (1.0.1)
56
- hashie (4.1.0)
57
- http-cookie (1.0.4)
46
+ hashie (5.0.0)
47
+ http-cookie (1.0.5)
58
48
  domain_name (~> 0.5)
59
- httpdisk (0.5.2)
49
+ httpdisk (1.0.0)
60
50
  content-type (~> 0.0)
61
- faraday (~> 1.4)
51
+ faraday (~> 2.7)
62
52
  faraday-cookie_jar (~> 0.0)
63
- faraday_middleware (~> 1.0)
64
- slop (~> 4.8)
53
+ faraday-follow_redirects (~> 0.0)
54
+ slop (~> 4.10)
55
+ json (2.6.3)
56
+ language_server-protocol (3.17.0.3)
57
+ lint_roller (1.1.0)
65
58
  method_source (1.0.0)
66
- mini_portile2 (2.5.3)
67
- minitest (5.14.4)
68
- mocha (1.13.0)
69
- multipart-post (2.1.1)
70
- nokogiri (1.11.7)
71
- mini_portile2 (~> 2.5.0)
59
+ minitest (5.19.0)
60
+ mocha (2.1.0)
61
+ ruby2_keywords (>= 0.0.5)
62
+ nokogiri (1.15.4-arm64-darwin)
72
63
  racc (~> 1.4)
73
- parallel (1.20.1)
74
- parser (3.0.2.0)
64
+ parallel (1.23.0)
65
+ parser (3.2.2.3)
75
66
  ast (~> 2.4.1)
76
- parslet (1.8.2)
77
- pry (0.14.1)
67
+ racc
68
+ parslet (2.0.0)
69
+ pry (0.14.2)
78
70
  coderay (~> 1.1)
79
71
  method_source (~> 1.0)
80
- public_suffix (4.0.6)
81
- racc (1.5.2)
82
- rainbow (3.0.0)
72
+ public_suffix (5.0.3)
73
+ racc (1.7.1)
74
+ rainbow (3.1.1)
83
75
  rake (13.0.6)
84
- regexp_parser (2.1.1)
85
- rexml (3.2.5)
86
- rubocop (1.18.3)
76
+ regexp_parser (2.8.1)
77
+ rexml (3.2.6)
78
+ rubocop (1.52.1)
79
+ json (~> 2.3)
87
80
  parallel (~> 1.10)
88
- parser (>= 3.0.0.0)
81
+ parser (>= 3.2.2.3)
89
82
  rainbow (>= 2.2.2, < 4.0)
90
83
  regexp_parser (>= 1.8, < 3.0)
91
- rexml
92
- rubocop-ast (>= 1.7.0, < 2.0)
84
+ rexml (>= 3.2.5, < 4.0)
85
+ rubocop-ast (>= 1.28.0, < 2.0)
93
86
  ruby-progressbar (~> 1.7)
94
- unicode-display_width (>= 1.4.0, < 3.0)
95
- rubocop-ast (1.7.0)
96
- parser (>= 3.0.1.1)
97
- ruby-progressbar (1.11.0)
98
- ruby2_keywords (0.0.4)
99
- slop (4.9.1)
100
- sterile (1.0.23)
87
+ unicode-display_width (>= 2.4.0, < 3.0)
88
+ rubocop-ast (1.29.0)
89
+ parser (>= 3.2.1.0)
90
+ rubocop-performance (1.18.0)
91
+ rubocop (>= 1.7.0, < 2.0)
92
+ rubocop-ast (>= 0.4.0)
93
+ ruby-progressbar (1.13.0)
94
+ ruby2_keywords (0.0.5)
95
+ slop (4.10.1)
96
+ standard (1.30.1)
97
+ language_server-protocol (~> 3.17.0.2)
98
+ lint_roller (~> 1.0)
99
+ rubocop (~> 1.52.0)
100
+ standard-custom (~> 1.0.0)
101
+ standard-performance (~> 1.1.0)
102
+ standard-custom (1.0.2)
103
+ lint_roller (~> 1.0)
104
+ rubocop (~> 1.50)
105
+ standard-performance (1.1.2)
106
+ lint_roller (~> 1.1)
107
+ rubocop-performance (~> 1.18.0)
108
+ sterile (1.0.25)
101
109
  nokogiri (>= 1.11.7)
102
110
  unf (0.1.4)
103
111
  unf_ext
104
- unf_ext (0.0.7.7)
105
- unicode-display_width (2.0.0)
106
- webmock (3.13.0)
107
- addressable (>= 2.3.6)
112
+ unf_ext (0.0.8.2)
113
+ unicode-display_width (2.4.2)
114
+ webmock (3.18.1)
115
+ addressable (>= 2.8.0)
108
116
  crack (>= 0.3.2)
109
117
  hashdiff (>= 0.4.0, < 2.0.0)
110
118
 
111
119
  PLATFORMS
112
- ruby
120
+ arm64-darwin-20
113
121
 
114
122
  DEPENDENCIES
115
123
  minitest
116
124
  mocha
117
125
  pry
118
126
  rake
119
- rubocop (~> 1.18)
120
127
  sinew!
128
+ standard
121
129
  webmock
122
130
 
123
131
  BUNDLED WITH
124
- 2.1.4
132
+ 2.4.19
data/LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2012-2018 Adam Doppelt
1
+ Copyright (c) 2012-2023 Adam Doppelt
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- [![Build Status](https://github.com/gurgeous/sinew/workflows/test/badge.svg?branch=master)](https://github.com/gurgeous/sinew/action)
1
+ [![Build Status](https://github.com/gurgeous/sinew/workflows/test/badge.svg?branch=main)](https://github.com/gurgeous/sinew/action)
2
2
 
3
3
  ## Welcome to Sinew
4
4
 
@@ -221,7 +221,11 @@ end.map(&:text)
221
221
 
222
222
  ## Changelog
223
223
 
224
- #### 4.0.0 (July 2021)
224
+ #### 4.0.1 (Aug 2023)
225
+
226
+ - Updated dependencies, added justfile
227
+
228
+ #### 4.0.0 (Jul 2021)
225
229
 
226
230
  - Rewritten to use simpler DSL
227
231
  - Upgraded to httpdisk 0.5 to take advantage of the new encoding support
data/Rakefile CHANGED
@@ -1,54 +1,5 @@
1
- require 'bundler/setup'
2
- require 'rake/testtask'
1
+ require "bundler/setup"
2
+ require "minitest/test_task"
3
3
 
4
- # load the spec, we use it below
5
- spec = Gem::Specification.load('sinew.gemspec')
6
-
7
- #
8
- # testing
9
- # don't forget about TESTOPTS="--verbose" rake
10
- # also: rake install && rm -rf ~/.sinew/www.amazon.com && /usr/local/bin/sinew sample.sinew
11
- #
12
-
13
- # test (default)
14
- Rake::TestTask.new
15
4
  task default: :test
16
-
17
- # Watch rb files, run tests whenever something changes
18
- task :watch do
19
- sh "find . -name '*.rb' -o -name '*.sinew' | entr -c rake"
20
- end
21
-
22
- #
23
- # pry
24
- #
25
-
26
- task :pry do
27
- sh 'pry -I lib -r sinew.rb'
28
- end
29
-
30
- #
31
- # rubocop
32
- #
33
-
34
- task :rubocop do
35
- sh 'bundle exec rubocop -A .'
36
- end
37
-
38
- #
39
- # gem
40
- #
41
-
42
- task :build do
43
- sh 'gem build --quiet sinew.gemspec'
44
- end
45
-
46
- task install: :build do
47
- sh "gem install --quiet sinew-#{spec.version}.gem"
48
- end
49
-
50
- task release: %i[rubocop test build] do
51
- sh "git tag -a #{spec.version} -m 'Tagging #{spec.version}'"
52
- sh 'git push --tags'
53
- sh "gem push sinew-#{spec.version}.gem"
54
- end
5
+ Minitest::TestTask.create
data/bin/sinew CHANGED
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- $LOAD_PATH.unshift(File.join(__dir__, '../lib'))
3
+ $LOAD_PATH.unshift(File.join(__dir__, "../lib"))
4
4
 
5
5
  BIN = File.basename($PROGRAM_NAME)
6
6
 
@@ -8,12 +8,12 @@ BIN = File.basename($PROGRAM_NAME)
8
8
  # Load the bare minimum and parse args with slop. For speed.
9
9
  #
10
10
 
11
- require 'sinew/args'
11
+ require "sinew/args"
12
12
  begin
13
13
  slop = Sinew::Args.slop(ARGV)
14
14
  rescue Slop::Error => e
15
- $stderr.puts "#{BIN}: #{e}" if e.message != ''
16
- $stderr.puts("#{BIN}: try '#{BIN} --help' for more information")
15
+ warn "#{BIN}: #{e}" if e.message != ""
16
+ warn("#{BIN}: try '#{BIN} --help' for more information")
17
17
  exit 1
18
18
  end
19
19
 
@@ -21,5 +21,5 @@ end
21
21
  # now load everything and run
22
22
  #
23
23
 
24
- require 'sinew'
24
+ require "sinew"
25
25
  Sinew::Main.new(slop).run
data/justfile ADDED
@@ -0,0 +1,59 @@
1
+
2
+ # read gem version
3
+ gemver := `cat lib/sinew/version.rb | grep -Eo "[0-9]+\.[0-9]+\.[0-9]+"`
4
+
5
+ #
6
+ # dev
7
+ #
8
+
9
+ default: test
10
+
11
+ check: lint test
12
+
13
+ fmt:
14
+ bundle exec rubocop -a
15
+
16
+ lint:
17
+ @just banner lint...
18
+ bundle exec rubocop
19
+
20
+ pry:
21
+ bundle exec pry -I lib -r sinew.rb
22
+
23
+ test:
24
+ @just banner test...
25
+ bundle exec rake test
26
+
27
+ watch:
28
+ @watchexec --watch lib --watch test --clear bundle exec rake test
29
+
30
+ #
31
+ # ci
32
+ #
33
+
34
+ ci:
35
+ bundle install
36
+ just check
37
+
38
+ #
39
+ # gem tasks
40
+ #
41
+
42
+ gem-push: check-git-status
43
+ @just banner gem build...
44
+ gem build sinew.gemspec
45
+ @just banner tag...
46
+ git tag -a "v{{gemver}}" -m "Tagging {{gemver}}"
47
+ git push --tags
48
+ @just banner gem push...
49
+ gem push "sinew-{{gemver}}.gem"
50
+
51
+ #
52
+ # util
53
+ #
54
+
55
+ banner *ARGS:
56
+ @printf '\e[42;37;1m[%s] %-72s \e[m\n' "$(date +%H:%M:%S)" "{{ARGS}}"
57
+
58
+ check-git-status:
59
+ @if [ ! -z "$(git status --porcelain)" ]; then echo "git status is dirty, bailing."; exit 1; fi
data/lib/sinew/args.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  # manually load dependencies here since this is loaded standalone by bin
2
- require 'httpdisk/slop_duration'
3
- require 'sinew/version'
4
- require 'slop'
2
+ require "httpdisk/slop_duration"
3
+ require "sinew/version"
4
+ require "slop"
5
5
 
6
6
  #
7
7
  # This is used to parse command line arguments with Slop. We don't set any
@@ -13,26 +13,26 @@ module Sinew
13
13
  module Args
14
14
  def self.slop(args)
15
15
  slop = Slop.parse(args) do |o|
16
- o.banner = 'Usage: sinew [options] [recipe.sinew]'
17
- o.integer '-l', '--limit', 'quit after emitting this many rows'
18
- o.string '--proxy', 'use host[:port] as HTTP proxy (can be a comma-delimited list)'
19
- o.integer '--timeout', 'maximum time allowed for the transfer'
20
- o.bool '-s', '--silent', 'suppress some output'
21
- o.bool '-v', '--verbose', 'dump emitted rows while running'
16
+ o.banner = "Usage: sinew [options] [recipe.sinew]"
17
+ o.integer "-l", "--limit", "quit after emitting this many rows"
18
+ o.string "--proxy", "use host[:port] as HTTP proxy (can be a comma-delimited list)"
19
+ o.integer "--timeout", "maximum time allowed for the transfer"
20
+ o.bool "-s", "--silent", "suppress some output"
21
+ o.bool "-v", "--verbose", "dump emitted rows while running"
22
22
 
23
- o.separator 'From httpdisk:'
24
- o.string '--dir', 'set custom cache directory'
23
+ o.separator "From httpdisk:"
24
+ o.string "--dir", "set custom cache directory"
25
25
  # note: uses slop_duration from HTTPDisk
26
- o.duration '--expires', 'when to expire cached requests (ex: 1h, 2d, 3w)'
27
- o.bool '--force', "don't read anything from cache (but still write)"
28
- o.bool '--force-errors', "don't read errors from cache (but still write)"
26
+ o.duration "--expires", "when to expire cached requests (ex: 1h, 2d, 3w)"
27
+ o.bool "--force", "don't read anything from cache (but still write)"
28
+ o.bool "--force-errors", "don't read errors from cache (but still write)"
29
29
 
30
30
  # generic
31
- o.boolean '--version', 'show version' do
31
+ o.boolean "--version", "show version" do
32
32
  puts "sinew #{Sinew::VERSION}"
33
33
  exit
34
34
  end
35
- o.on('--help', 'show this help') do
35
+ o.on("--help", "show this help") do
36
36
  puts o
37
37
  exit
38
38
  end
@@ -40,9 +40,9 @@ module Sinew
40
40
 
41
41
  # recipe argument
42
42
  recipe = slop.args.first
43
- raise Slop::Error, '' if args.empty?
44
- raise Slop::Error, 'no RECIPE specified' if !recipe
45
- raise Slop::Error, 'more than one RECIPE specified' if slop.args.length > 1
43
+ raise Slop::Error, "" if args.empty?
44
+ raise Slop::Error, "no RECIPE specified" if !recipe
45
+ raise Slop::Error, "more than one RECIPE specified" if slop.args.length > 1
46
46
  raise Slop::Error, "#{recipe} not found" if !File.exist?(recipe)
47
47
 
48
48
  slop.to_h.tap do
data/lib/sinew/base.rb CHANGED
@@ -1,8 +1,9 @@
1
- require 'amazing_print'
2
- require 'faraday-encoding'
3
- require 'faraday/logging/formatter'
4
- require 'faraday-rate_limiter'
5
- require 'httpdisk'
1
+ require "amazing_print"
2
+ require "faraday-encoding"
3
+ require "faraday-rate_limiter"
4
+ require "faraday/logging/formatter"
5
+ require "faraday/retry"
6
+ require "httpdisk"
6
7
 
7
8
  module Sinew
8
9
  # Sinew base class, for in standalone scripts or via the sinew binary.
@@ -17,7 +18,7 @@ module Sinew
17
18
  #
18
19
 
19
20
  # default :rate_limit, typically 1
20
- default_rate_limit = ENV['SINEW_TEST'] ? 0 : 1
21
+ default_rate_limit = ENV["SINEW_TEST"] ? 0 : 1
21
22
 
22
23
  #
23
24
  # note: uses HTTPDisk::Sloptions
@@ -32,7 +33,7 @@ module Sinew
32
33
  _1.boolean :verbose
33
34
 
34
35
  # httpdisk
35
- _1.string :dir, default: File.join(ENV['HOME'], '.sinew')
36
+ _1.string :dir, default: File.join(ENV["HOME"], ".sinew")
36
37
  _1.integer :expires
37
38
  _1.boolean :force
38
39
  _1.boolean :force_errors
@@ -75,7 +76,7 @@ module Sinew
75
76
  # http post json, returns a Response
76
77
  def post_json(url, body = nil, headers = nil)
77
78
  body = body.to_json
78
- headers = (headers || {}).merge('Content-Type' => 'application/json')
79
+ headers = (headers || {}).merge("Content-Type" => "application/json")
79
80
  post(url, body, headers)
80
81
  end
81
82
 
@@ -93,7 +94,7 @@ module Sinew
93
94
  # Returns true if request is cached. Defaults to form body type.
94
95
  def cached?(method, url, params = nil, body = nil)
95
96
  status = status(method, url, params, body)
96
- status[:status] != 'miss'
97
+ status[:status] != "miss"
97
98
  end
98
99
 
99
100
  # Remove cache file, if any. Defaults to form body type.
@@ -159,8 +160,8 @@ module Sinew
159
160
 
160
161
  # Print a nice green banner.
161
162
  def banner(msg, color: GREEN)
162
- msg = "#{msg} ".ljust(72, ' ')
163
- msg = "[#{Time.new.strftime('%H:%M:%S')}] #{msg}"
163
+ msg = "#{msg} ".ljust(72, " ")
164
+ msg = "[#{Time.new.strftime("%H:%M:%S")}] #{msg}"
164
165
  msg = "#{color}#{msg}#{RESET}" if $stdout.tty?
165
166
  puts msg
166
167
  end
@@ -178,7 +179,7 @@ module Sinew
178
179
  return if !options[:proxy]
179
180
 
180
181
  proxies = options[:proxy]
181
- proxies = proxies.split(',') if !proxies.is_a?(Array)
182
+ proxies = proxies.split(",") if !proxies.is_a?(Array)
182
183
  proxies.sample
183
184
  end
184
185
 
@@ -186,7 +187,7 @@ module Sinew
186
187
  def create_faraday
187
188
  faraday_options = options.slice(:headers, :params)
188
189
  if options[:insecure]
189
- faraday_options[:ssl] = { verify: false }
190
+ faraday_options[:ssl] = {verify: false}
190
191
  end
191
192
  Faraday.new(nil, faraday_options) do
192
193
  # options
@@ -233,7 +234,7 @@ module Sinew
233
234
  max: options[:retries],
234
235
  methods: %w[delete get head options patch post put trace],
235
236
  retry_statuses: (500..600).to_a,
236
- retry_if: ->(_env, _err) { true },
237
+ retry_if: ->(_env, _err) { true }
237
238
  }
238
239
  _1.request :retry, retry_options
239
240
  end
data/lib/sinew/csv.rb CHANGED
@@ -1,5 +1,5 @@
1
- require 'csv'
2
- require 'sterile'
1
+ require "csv"
2
+ require "sterile"
3
3
 
4
4
  module Sinew
5
5
  class CSV
@@ -13,11 +13,11 @@ module Sinew
13
13
 
14
14
  # start writing the csv
15
15
  def start(columns)
16
- raise 'started twice' if started?
16
+ raise "started twice" if started?
17
17
 
18
18
  @columns = columns
19
19
  @tally = columns.map { [_1, 0] }.to_h
20
- @csv = ::CSV.open(path, 'wb').tap do
20
+ @csv = ::CSV.open(path, "wb").tap do
21
21
  _1 << columns
22
22
  end
23
23
  end
@@ -50,7 +50,7 @@ module Sinew
50
50
  end
51
51
 
52
52
  ASCII_ONLY = begin
53
- chars = (33..126).map(&:chr) - ['&']
53
+ chars = (33..126).map(&:chr) - ["&"]
54
54
  /\A[#{Regexp.escape(chars.join)}\s]+\Z/
55
55
  end.freeze
56
56
 
@@ -59,14 +59,14 @@ module Sinew
59
59
  s = if s.respond_to?(:inner_html)
60
60
  s.inner_html
61
61
  elsif s.is_a?(Array)
62
- s.join('|')
62
+ s.join("|")
63
63
  else
64
64
  s.to_s
65
65
  end
66
66
  return if s.empty?
67
67
 
68
68
  # simple attempt to strip tags. Note that we replace tags with spaces
69
- s = s.gsub(/<[^>]+>/, ' ')
69
+ s = s.gsub(/<[^>]+>/, " ")
70
70
 
71
71
  if s !~ ASCII_ONLY
72
72
  # Converts MS Word 'smart punctuation' to ASCII
@@ -80,7 +80,7 @@ module Sinew
80
80
  end
81
81
 
82
82
  # squish
83
- s = s.strip.gsub(/\s+/, ' ')
83
+ s = s.strip.gsub(/\s+/, " ")
84
84
  return if s.empty?
85
85
 
86
86
  s
data/lib/sinew/main.rb CHANGED
@@ -8,7 +8,7 @@ module Sinew
8
8
  options[:output] ||= begin
9
9
  src = options[:recipe]
10
10
  dst = File.join(File.dirname(src), "#{File.basename(src, File.extname(src))}.csv")
11
- dst = dst.sub(%r{^./}, '') # nice to clean this up
11
+ dst = dst.sub(%r{^./}, "") # nice to clean this up
12
12
  dst
13
13
  end
14
14
 
@@ -21,7 +21,7 @@ module Sinew
21
21
  recipe = sinew.options[:recipe]
22
22
  dsl = DSL.new(sinew)
23
23
  begin
24
- dsl.instance_eval(File.read(recipe, mode: 'rb'), recipe)
24
+ dsl.instance_eval(File.read(recipe, mode: "rb"), recipe)
25
25
  rescue LimitError
26
26
  # ignore - this is flow control for --limit
27
27
  end
@@ -43,12 +43,12 @@ module Sinew
43
43
  count = csv.count
44
44
 
45
45
  if count == 0
46
- sinew.banner(format('Done in %ds. Nothing written.', elapsed))
46
+ sinew.banner(format("Done in %ds. Nothing written.", elapsed))
47
47
  return
48
48
  end
49
49
 
50
50
  # summary
51
- msg = format('Done in %ds. Wrote %d rows to %s. Summary:', elapsed, count, csv.path)
51
+ msg = format("Done in %ds. Wrote %d rows to %s. Summary:", elapsed, count, csv.path)
52
52
  sinew.banner(msg)
53
53
 
54
54
  # tally
@@ -3,7 +3,7 @@ module Sinew
3
3
  # Minimalist Formatter that logs proxy if present.
4
4
  class LogFormatter < Faraday::Logging::Formatter
5
5
  def request(env)
6
- info('req') do
6
+ info("req") do
7
7
  # Only log the initial request, not the redirects
8
8
  return if env[:redirect]
9
9
 
@@ -1,18 +1,18 @@
1
- require 'nokogiri'
1
+ require "nokogiri"
2
2
 
3
3
  # modify NodeSet to join with SPACE instead of empty string
4
4
  module Nokogiri
5
5
  module XML
6
6
  class NodeSet
7
- alias old_inner_html inner_html
8
- alias old_inner_text inner_text
7
+ alias_method :old_inner_html, :inner_html
8
+ alias_method :old_inner_text, :inner_text
9
9
 
10
10
  def inner_text
11
- map(&:inner_text).join(' ')
11
+ map(&:inner_text).join(" ")
12
12
  end
13
13
 
14
14
  def inner_html(*args)
15
- map { _1.inner_html(*args) }.join(' ')
15
+ map { _1.inner_html(*args) }.join(" ")
16
16
  end
17
17
  end
18
18
  end
@@ -1,7 +1,7 @@
1
- require 'delegate'
2
- require 'hashie/mash'
3
- require 'json'
4
- require 'nokogiri'
1
+ require "delegate"
2
+ require "hashie/mash"
3
+ require "json"
4
+ require "nokogiri"
5
5
 
6
6
  module Sinew
7
7
  # A wrapper around Faraday::Response, with some parsing helpers.
@@ -11,12 +11,12 @@ module Sinew
11
11
  @html ||= body.dup.tap do
12
12
  # fix invalid utf8
13
13
  if _1.encoding == Encoding::UTF_8
14
- _1.encode!('UTF-8', invalid: :replace, undef: :replace, replace: '?')
14
+ _1.encode!("UTF-8", invalid: :replace, undef: :replace, replace: "?")
15
15
  end
16
16
 
17
17
  # squish
18
18
  _1.strip!
19
- _1.gsub!(/\s+/, ' ')
19
+ _1.gsub!(/\s+/, " ")
20
20
 
21
21
  # kill whitespace around tags
22
22
  _1.gsub!(/ ?<([^>]+)> ?/, '<\\1>')
data/lib/sinew/version.rb CHANGED
@@ -1,4 +1,4 @@
1
1
  module Sinew
2
2
  # Gem version
3
- VERSION = '4.0.0'.freeze
3
+ VERSION = "4.0.1".freeze
4
4
  end
data/lib/sinew.rb CHANGED
@@ -1,14 +1,14 @@
1
1
  # sinew
2
- require 'sinew/args'
3
- require 'sinew/base'
4
- require 'sinew/csv'
5
- require 'sinew/main'
6
- require 'sinew/nokogiri_ext'
7
- require 'sinew/response'
8
- require 'sinew/version'
2
+ require "sinew/args"
3
+ require "sinew/base"
4
+ require "sinew/csv"
5
+ require "sinew/main"
6
+ require "sinew/nokogiri_ext"
7
+ require "sinew/response"
8
+ require "sinew/version"
9
9
 
10
10
  # custom faraday middleware
11
- require 'sinew/middleware/log_formatter'
11
+ require "sinew/middleware/log_formatter"
12
12
 
13
13
  module Sinew
14
14
  # flow control for --limit
data/sample.rb CHANGED
@@ -1,13 +1,13 @@
1
- require_relative 'lib/sinew'
1
+ require_relative "lib/sinew"
2
2
 
3
- sinew = Sinew.new(output: 'sample.csv', verbose: true)
3
+ sinew = Sinew.new(output: "sample.csv", verbose: true)
4
4
 
5
- response = sinew.get 'http://httpbingo.org'
6
- response.noko.css('ul li a').each do |a|
5
+ response = sinew.get "http://httpbingo.org"
6
+ response.noko.css("ul li a").each do |a|
7
7
  row = {}
8
8
  row[:url] = a[:href]
9
9
  row[:title] = a.text
10
10
  sinew.csv_emit(row)
11
11
  end
12
12
 
13
- sinew.get 'http://httpbingo.org/redirect/2'
13
+ sinew.get "http://httpbingo.org/redirect/2"
data/sinew.gemspec CHANGED
@@ -1,35 +1,36 @@
1
1
  $LOAD_PATH.unshift("#{__dir__}/lib")
2
2
 
3
- require 'sinew/version'
3
+ require "sinew/version"
4
4
 
5
5
  Gem::Specification.new do |s|
6
- s.name = 'sinew'
6
+ s.name = "sinew"
7
7
  s.version = Sinew::VERSION
8
- s.authors = ['Adam Doppelt', 'Nathan Kriege']
9
- s.email = ['amd@gurge.com']
8
+ s.authors = ["Adam Doppelt", "Nathan Kriege"]
9
+ s.email = ["amd@gurge.com"]
10
10
 
11
- s.summary = 'Sinew - structured web crawling using recipes.'
12
- s.description = 'Crawl web sites easily using ruby recipes, with caching and nokogiri.'
13
- s.homepage = 'http://github.com/gurgeous/sinew'
14
- s.license = 'MIT'
15
- s.required_ruby_version = '>= 2.7'
11
+ s.summary = "Sinew - structured web crawling using recipes."
12
+ s.description = "Crawl web sites easily using ruby recipes, with caching and nokogiri."
13
+ s.homepage = "http://github.com/gurgeous/sinew"
14
+ s.license = "MIT"
15
+ s.required_ruby_version = ">= 3.1"
16
16
 
17
17
  # what's in the gem?
18
18
  s.files = Dir.chdir(File.expand_path(__dir__)) do
19
19
  `git ls-files -z`.split("\x0").reject { _1.match(%r{^test/}) }
20
20
  end
21
- s.bindir = 'bin'
21
+ s.bindir = "bin"
22
22
  s.executables = s.files.grep(%r{^#{s.bindir}/}) { File.basename(_1) }
23
- s.require_paths = ['lib']
23
+ s.require_paths = ["lib"]
24
24
 
25
25
  # gem dependencies
26
- s.add_dependency 'amazing_print', '~> 1.3'
27
- s.add_dependency 'faraday', '~> 1.4'
28
- s.add_dependency 'faraday-encoding', '~> 0'
29
- s.add_dependency 'faraday-rate_limiter', '~> 0.0'
30
- s.add_dependency 'hashie', '~> 4.1'
31
- s.add_dependency 'httpdisk', '~> 0.5'
32
- s.add_dependency 'nokogiri', '~> 1.11'
33
- s.add_dependency 'slop', '~> 4.8'
34
- s.add_dependency 'sterile', '~> 1.0'
26
+ s.add_dependency "amazing_print", "~> 1.5"
27
+ s.add_dependency "faraday", "~> 2.7"
28
+ s.add_dependency "faraday-encoding", "~> 0.0"
29
+ s.add_dependency "faraday-rate_limiter", "~> 0.0"
30
+ s.add_dependency "faraday-retry", "~> 2.0"
31
+ s.add_dependency "hashie", "~> 5.0"
32
+ s.add_dependency "httpdisk", "~> 1.0"
33
+ s.add_dependency "nokogiri", "~> 1.15"
34
+ s.add_dependency "slop", "~> 4.10"
35
+ s.add_dependency "sterile", "~> 1.0"
35
36
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sinew
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.0.0
4
+ version: 4.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Adam Doppelt
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2021-07-09 00:00:00.000000000 Z
12
+ date: 2023-08-19 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: amazing_print
@@ -17,42 +17,42 @@ dependencies:
17
17
  requirements:
18
18
  - - "~>"
19
19
  - !ruby/object:Gem::Version
20
- version: '1.3'
20
+ version: '1.5'
21
21
  type: :runtime
22
22
  prerelease: false
23
23
  version_requirements: !ruby/object:Gem::Requirement
24
24
  requirements:
25
25
  - - "~>"
26
26
  - !ruby/object:Gem::Version
27
- version: '1.3'
27
+ version: '1.5'
28
28
  - !ruby/object:Gem::Dependency
29
29
  name: faraday
30
30
  requirement: !ruby/object:Gem::Requirement
31
31
  requirements:
32
32
  - - "~>"
33
33
  - !ruby/object:Gem::Version
34
- version: '1.4'
34
+ version: '2.7'
35
35
  type: :runtime
36
36
  prerelease: false
37
37
  version_requirements: !ruby/object:Gem::Requirement
38
38
  requirements:
39
39
  - - "~>"
40
40
  - !ruby/object:Gem::Version
41
- version: '1.4'
41
+ version: '2.7'
42
42
  - !ruby/object:Gem::Dependency
43
43
  name: faraday-encoding
44
44
  requirement: !ruby/object:Gem::Requirement
45
45
  requirements:
46
46
  - - "~>"
47
47
  - !ruby/object:Gem::Version
48
- version: '0'
48
+ version: '0.0'
49
49
  type: :runtime
50
50
  prerelease: false
51
51
  version_requirements: !ruby/object:Gem::Requirement
52
52
  requirements:
53
53
  - - "~>"
54
54
  - !ruby/object:Gem::Version
55
- version: '0'
55
+ version: '0.0'
56
56
  - !ruby/object:Gem::Dependency
57
57
  name: faraday-rate_limiter
58
58
  requirement: !ruby/object:Gem::Requirement
@@ -67,62 +67,76 @@ dependencies:
67
67
  - - "~>"
68
68
  - !ruby/object:Gem::Version
69
69
  version: '0.0'
70
+ - !ruby/object:Gem::Dependency
71
+ name: faraday-retry
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - "~>"
75
+ - !ruby/object:Gem::Version
76
+ version: '2.0'
77
+ type: :runtime
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - "~>"
82
+ - !ruby/object:Gem::Version
83
+ version: '2.0'
70
84
  - !ruby/object:Gem::Dependency
71
85
  name: hashie
72
86
  requirement: !ruby/object:Gem::Requirement
73
87
  requirements:
74
88
  - - "~>"
75
89
  - !ruby/object:Gem::Version
76
- version: '4.1'
90
+ version: '5.0'
77
91
  type: :runtime
78
92
  prerelease: false
79
93
  version_requirements: !ruby/object:Gem::Requirement
80
94
  requirements:
81
95
  - - "~>"
82
96
  - !ruby/object:Gem::Version
83
- version: '4.1'
97
+ version: '5.0'
84
98
  - !ruby/object:Gem::Dependency
85
99
  name: httpdisk
86
100
  requirement: !ruby/object:Gem::Requirement
87
101
  requirements:
88
102
  - - "~>"
89
103
  - !ruby/object:Gem::Version
90
- version: '0.5'
104
+ version: '1.0'
91
105
  type: :runtime
92
106
  prerelease: false
93
107
  version_requirements: !ruby/object:Gem::Requirement
94
108
  requirements:
95
109
  - - "~>"
96
110
  - !ruby/object:Gem::Version
97
- version: '0.5'
111
+ version: '1.0'
98
112
  - !ruby/object:Gem::Dependency
99
113
  name: nokogiri
100
114
  requirement: !ruby/object:Gem::Requirement
101
115
  requirements:
102
116
  - - "~>"
103
117
  - !ruby/object:Gem::Version
104
- version: '1.11'
118
+ version: '1.15'
105
119
  type: :runtime
106
120
  prerelease: false
107
121
  version_requirements: !ruby/object:Gem::Requirement
108
122
  requirements:
109
123
  - - "~>"
110
124
  - !ruby/object:Gem::Version
111
- version: '1.11'
125
+ version: '1.15'
112
126
  - !ruby/object:Gem::Dependency
113
127
  name: slop
114
128
  requirement: !ruby/object:Gem::Requirement
115
129
  requirements:
116
130
  - - "~>"
117
131
  - !ruby/object:Gem::Version
118
- version: '4.8'
132
+ version: '4.10'
119
133
  type: :runtime
120
134
  prerelease: false
121
135
  version_requirements: !ruby/object:Gem::Requirement
122
136
  requirements:
123
137
  - - "~>"
124
138
  - !ruby/object:Gem::Version
125
- version: '4.8'
139
+ version: '4.10'
126
140
  - !ruby/object:Gem::Dependency
127
141
  name: sterile
128
142
  requirement: !ruby/object:Gem::Requirement
@@ -154,6 +168,7 @@ files:
154
168
  - README.md
155
169
  - Rakefile
156
170
  - bin/sinew
171
+ - justfile
157
172
  - lib/sinew.rb
158
173
  - lib/sinew/args.rb
159
174
  - lib/sinew/base.rb
@@ -178,14 +193,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
178
193
  requirements:
179
194
  - - ">="
180
195
  - !ruby/object:Gem::Version
181
- version: '2.7'
196
+ version: '3.1'
182
197
  required_rubygems_version: !ruby/object:Gem::Requirement
183
198
  requirements:
184
199
  - - ">="
185
200
  - !ruby/object:Gem::Version
186
201
  version: '0'
187
202
  requirements: []
188
- rubygems_version: 3.1.4
203
+ rubygems_version: 3.3.7
189
204
  signing_key:
190
205
  specification_version: 4
191
206
  summary: Sinew - structured web crawling using recipes.