gemline 0.4.5 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e3db9a6652fac1ac236055d4788dbf67546683d8dbab7d17a7af1c1aa523097e
4
- data.tar.gz: 0613e6225bcb1016d8a0535dae98388455e4eb0b9ac415ea0e5c95c087c4f5e3
3
+ metadata.gz: a5267ceb6e55d48145e02397d570f6bcba1a2e73c29f482cbbefd5bcfec19032
4
+ data.tar.gz: 78c7cc5acc3f5bfbbe3d7bfea96bded6193e56e87591794b73a5108c80c9f4c4
5
5
  SHA512:
6
- metadata.gz: 31a155836315d9bababfb8b505c6df2893213b5f7fb08ca20f4aed963c9e0acdd169324092093e8272caf116fa6c8cea15f41e8e4bd3601060e222f3e211df67
7
- data.tar.gz: 1d21c18c40a0af36d350ad709437d94b7840eb046febea3ff8407ea8bf4d3c9e194cca535ba6caf666f2896a294e0e5ebebf3918aefe1092f9eb825bb5a1ba84
6
+ metadata.gz: 8199ca68fa9676c2da383c217918b951b16d33be0ff144b6f995fb545d2ffe8e9fe1b71e761e103ea18d831ce8e538fa62aa97d22f469b7c0184ee57e09a9e62
7
+ data.tar.gz: d473981898b5b6685bd664f8d5d23e3c45622da4b02f3d93ade2ec99741a53b0ac0c6463d26288c8737efefee9f0d15b60b3bfbed6a7b7a7b0758a6767363170
@@ -18,7 +18,7 @@ jobs:
18
18
 
19
19
  strategy:
20
20
  matrix:
21
- ruby: [3.0.2, 2.7.4, 2.6.8]
21
+ ruby: [3.4.1, 3.3.6, 3.2.6, 2.7.8]
22
22
 
23
23
  steps:
24
24
  - name: Checkout
data/Rakefile CHANGED
@@ -6,10 +6,10 @@ require 'rspec/core/rake_task'
6
6
  Bundler::GemHelper.install_tasks
7
7
 
8
8
  desc 'Default: Run specs'
9
- task :default => :spec
9
+ task default: :spec
10
10
 
11
11
  desc 'Run specs'
12
12
  RSpec::Core::RakeTask.new(:spec)
13
13
 
14
14
  desc 'Run specs (alias for Gem Testers)'
15
- task :test => :spec
15
+ task test: :spec
data/bin/gemline CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
3
  require "gemline"
4
- require 'optparse'
4
+ require "optparse"
5
5
 
6
6
  ## TODO: Real command line parsing to support some switches
7
7
  ## for things like:
@@ -33,7 +33,7 @@ OptionParser.new do |opts|
33
33
  end
34
34
 
35
35
  opts.on("-v", "--version") do
36
- puts "gemline #{Gem::Specification::load("gemline.gemspec").version}"
36
+ puts "gemline #{Gem::Specification.load("gemline.gemspec").version}"
37
37
  exit
38
38
  end
39
39
 
data/gemline.gemspec CHANGED
@@ -3,18 +3,18 @@
3
3
  Gem::Specification.new do |gem|
4
4
  gem.authors = ["Joe Alba"]
5
5
  gem.email = ["joe@joealba.com"]
6
- gem.description = %q{Grab the latest Gemfile 'gem' line for a specific Ruby gem}
7
- gem.summary = %q{}
6
+ gem.description = "Grab the latest Gemfile dependency designation for a specific Ruby gem"
7
+ gem.summary = ""
8
8
  gem.homepage = "https://github.com/joealba/gemline"
9
9
 
10
- gem.executables = ['gemline']
10
+ gem.executables = ["gemline"]
11
11
  gem.files = `git ls-files`.split("\n")
12
12
  gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
13
13
  gem.name = "gemline"
14
14
  gem.require_paths = ["lib"]
15
15
 
16
- gem.version = '0.4.5'
17
- gem.license = 'MIT'
16
+ gem.version = "0.5.0"
17
+ gem.license = "MIT"
18
18
 
19
19
  gem.add_dependency "clipboard", ">= 1.3.5"
20
20
 
@@ -24,7 +24,7 @@ Gem::Specification.new do |gem|
24
24
  gem.add_dependency "ffi"
25
25
  # end
26
26
 
27
- gem.add_development_dependency "rake"
27
+ gem.add_development_dependency "rake"
28
28
  gem.add_development_dependency "rspec", ">= 3.0"
29
29
  gem.add_development_dependency "simplecov"
30
30
  end
@@ -0,0 +1,12 @@
1
+ class Gemline
2
+ class Rubygems
3
+ def self.get_rubygem_json(gem_name)
4
+ uri = URI.parse("https://rubygems.org/api/v1/gems/#{gem_name}.json")
5
+ http = Net::HTTP.new(uri.host, uri.port)
6
+ http.use_ssl = true
7
+ request = Net::HTTP::Get.new(uri.request_uri)
8
+ response = http.request(request)
9
+ response.body
10
+ end
11
+ end
12
+ end
data/lib/gemline.rb CHANGED
@@ -1,6 +1,8 @@
1
- require 'net/https'
2
- require 'clipboard'
3
- require 'json'
1
+ require "net/https"
2
+ require "clipboard"
3
+ require "json"
4
+
5
+ require_relative "./gemline/rubygems"
4
6
 
5
7
  class Gemline
6
8
  attr_accessor :gem, :gemline, :json, :response
@@ -19,69 +21,66 @@ class Gemline
19
21
 
20
22
  def initialize(gem_name, options = {})
21
23
  @gem = sanitize_gem_name(gem_name)
22
- @json = Gemline.get_rubygem_json(@gem)
24
+ @json = Gemline::Rubygems.get_rubygem_json(@gem)
23
25
  unless gem_not_found?
24
26
  @response = JSON.parse(@json)
25
- @gemline = Gemline.create_gemline(@gem, response['version'], options)
27
+ @gemline = Gemline.create_gemline(@gem, response["version"], options)
26
28
  end
27
29
  end
28
30
 
29
31
  def sanitize_gem_name(gem_name)
30
- gem_name.to_s.gsub(/[^\w\-]+/,'') # Yeah, a little over-defensive.
32
+ gem_name.to_s.gsub(/[^\w-]+/, "") # Yeah, a little over-defensive.
31
33
  end
32
34
 
33
35
  def gem_not_found?
34
36
  !!@json.match(/(could not be found|does not exist)/)
35
37
  end
36
38
 
37
- private
39
+ def self.options_to_string(options = {})
40
+ if options[:group]
41
+ options[:group] = [options[:group]].flatten.map(&:to_sym)
42
+ options[:group] = options[:group].first if options[:group].length == 1
43
+ end
44
+
45
+ options.map { |k, v| "#{k}: #{value_to_string(v)}" }.join(", ")
46
+ end
38
47
 
39
- def self.get_rubygem_json(gem_name)
40
- uri = URI.parse("https://rubygems.org/api/v1/gems/#{gem_name}.json")
41
- http = Net::HTTP.new(uri.host, uri.port)
42
- http.use_ssl = true
43
- request = Net::HTTP::Get.new(uri.request_uri)
44
- response = http.request(request)
45
- response.body
48
+ def self.value_to_string(val)
49
+ case val
50
+ when Array
51
+ val.to_s
52
+ when Symbol
53
+ ":#{val}"
54
+ when String
55
+ "\"#{val}\""
56
+ end
46
57
  end
47
58
 
48
59
  def self.create_gemline(gem_name, version, options)
49
60
  if options[:gemspec]
50
- return gemspec_gemline(gem_name, version, options)
61
+ gemspec_gemline(gem_name, version, options)
51
62
  else
52
- return gemfile_gemline(gem_name, version, options.delete_if {|k,v| k == :gemspec})
63
+ gemfile_gemline(gem_name, version, options.delete_if { |k, _| k == :gemspec })
53
64
  end
54
65
  end
55
66
 
56
67
  def self.gemfile_gemline(gem_name, version, options)
57
- line = %Q{gem "#{gem_name}", "~> #{version}"}
58
- line << ", " + options_to_string(options) if !options.empty?
59
- line
68
+ %Q{gem "#{gem_name}", "~> #{version}"#{gemfile_gemline_options_suffix(options)}}
60
69
  end
61
70
 
62
- def self.options_to_string(options = {})
63
- if options[:group]
64
- options[:group] = [options[:group]].flatten.map { |x| x.to_sym }
65
- options[:group] = options[:group].first if options[:group].length == 1
66
- end
67
-
68
- options.inspect.delete('{}').gsub(/(?!\s)=>(?!\s)/, ' => ')
71
+ def self.gemfile_gemline_options_suffix(options)
72
+ !options.empty? ? ", " + options_to_string(options) : ""
69
73
  end
70
74
 
71
75
  def self.gemspec_gemline(gem_name, version, options)
72
- if options[:group] && options[:group].include?('development')
73
- %Q{gem.add_development_dependency "#{gem_name}", "~> #{version}"}
74
- else
75
- %Q{gem.add_dependency "#{gem_name}", "~> #{version}"}
76
- end
76
+ dependency_signifier = options[:group]&.include?('development') ? "add_development_dependency" : "add_dependency"
77
+ %Q{gem.#{dependency_signifier} "#{gem_name}", "~> #{version}"}
77
78
  end
78
79
 
79
80
  def self.copy_to_clipboard(gemline)
80
- begin
81
- Clipboard.copy gemline
82
- $stderr.puts " Gem line copied to your clipboard. Ready to paste into your Gemfile"
83
- rescue
84
- ## Yeah, I hate this too. But it does what I want -- silently fail if Clipboard fails.
85
- end
81
+ Clipboard.copy gemline
82
+ $stderr.puts " Gem line copied to your clipboard. Ready to paste into your Gemfile"
83
+ rescue
84
+ ## Yeah, I hate this too. But it does what I want -- silently fail if Clipboard fails.
86
85
  end
87
86
  end
@@ -1,21 +1,19 @@
1
- require 'spec_helper'
2
- require 'stringio'
1
+ require "spec_helper"
2
+ require "stringio"
3
3
 
4
4
  describe "gemline output" do
5
-
6
5
  before do
7
6
  stub_rubygems_json_output
8
7
  end
9
8
 
10
9
  it "should output one line to STDOUT so the output can be appended to a Gemfile" do
11
- grab_io { Gemline.query('rails') }
10
+ grab_io { Gemline.query("rails") }
12
11
  expect(@stdout.readlines.count).to eq(1)
13
12
  end
14
13
 
15
14
  it "should output nothing to STDOUT on error" do
16
15
  allow(Kernel).to receive(:exit).and_return(true)
17
- grab_io { Gemline.query('doesnotexist') }
16
+ grab_io { Gemline.query("doesnotexist") }
18
17
  expect(@stdout.readlines.count).to eq(0)
19
18
  end
20
-
21
19
  end
data/spec/gemline_spec.rb CHANGED
@@ -1,82 +1,79 @@
1
- require 'spec_helper'
1
+ require "spec_helper"
2
2
 
3
3
  describe Gemline do
4
-
5
4
  describe "querying rubygems" do
6
-
7
5
  before do
8
6
  stub_rubygems_json_output
9
7
  end
10
8
 
11
9
  it "should be able to parse the version out of a good json string" do
12
- g = Gemline.new('rails')
10
+ g = Gemline.new("rails")
13
11
  expect(g.gemline).to eq(%Q{gem "rails", "~> 3.1.1"})
14
12
  end
15
13
 
16
14
  it "should whine when the gem you are querying does not exist" do
17
- g = Gemline.new('doesnotexist')
15
+ g = Gemline.new("doesnotexist")
18
16
  expect(g.gem_not_found?).to eq true
19
17
  expect(g.gemline).to eq nil
20
18
  end
21
19
 
22
20
  it "should properly detect a blocked gem name" do
23
- g = Gemline.new('yaml')
21
+ g = Gemline.new("yaml")
24
22
  expect(g.gem_not_found?).to eq true
25
23
  expect(g.gemline).to eq nil
26
24
  end
27
25
 
28
26
  it "should properly handle funny characters in the returned JSON" do
29
- g = Gemline.new('nokogiri')
27
+ g = Gemline.new("nokogiri")
30
28
  expect(g.gemline).to eq(%Q{gem "nokogiri", "~> 1.5.5"})
31
29
  end
32
30
 
33
31
  it "should be able to generate a gemspec-style gemline" do
34
- g = Gemline.new('rails', :gemspec => true)
32
+ g = Gemline.new("rails", gemspec: true)
35
33
  expect(g.gemline).to eq(%Q!gem.add_dependency "rails", "~> 3.1.1"!)
36
34
  end
37
35
 
38
36
  describe "generates a development gemspec-style gemline" do
39
37
  it "works when just passed the development group" do
40
- g = Gemline.new('nokogiri', {:gemspec => true, :group => 'development'})
38
+ g = Gemline.new("nokogiri", { gemspec: true, group: "development" })
41
39
  expect(g.gemline).to eq(%Q!gem.add_development_dependency "nokogiri", "~> 1.5.5"!)
42
40
  end
43
41
  it "works when passed other groups also" do
44
- g = Gemline.new('nokogiri', {:gemspec => true, :group => 'development,test'})
42
+ g = Gemline.new("nokogiri", { gemspec: true, group: "development,test" })
45
43
  expect(g.gemline).to eq(%Q!gem.add_development_dependency "nokogiri", "~> 1.5.5"!)
46
44
  end
47
45
  end
48
46
 
49
47
  it "should be able to add options to a gemfile-style gemline" do
50
- g = Gemline.new('nokogiri', {:git => "some git repo", :group => [:development, :test]})
48
+ g = Gemline.new("nokogiri", { git: "some git repo", group: %i[development test] })
51
49
  line = g.gemline
52
50
  expect(line).to start_with(%Q{gem "nokogiri", "~> 1.5.5", })
53
- expect(line).to include(%Q{:git => "some git repo"})
54
- expect(line).to include(%Q{:group => [:development, :test]})
51
+ expect(line).to include(%Q{git: "some git repo"})
52
+ expect(line).to include(%Q{group: [:development, :test]})
55
53
  end
56
-
57
54
  end
58
55
 
59
- describe 'helper methods' do
60
- describe '#options_to_string' do
56
+ describe "helper methods" do
57
+ describe "#options_to_string" do
61
58
  it "returns nothing when no options provided" do
62
- expect(Gemline.options_to_string).to eq ''
59
+ expect(Gemline.options_to_string).to eq ""
63
60
  end
64
61
 
65
62
  describe "gem groups" do
66
- it "handles a single group as a symbol" do
67
- expect(Gemline.options_to_string :group => :development).to eq ':group => :development'
63
+ it "handles a single group passed as a symbol" do
64
+ expect(Gemline.options_to_string(group: :development)).to eq "group: :development"
68
65
  end
69
66
 
70
- it "handles a single group as a string" do
71
- expect(Gemline.options_to_string :group => 'development').to eq ':group => :development'
67
+ it "handles a single group passed as a string" do
68
+ expect(Gemline.options_to_string(group: "development")).to eq "group: :development"
72
69
  end
73
70
 
74
- it "handles a list of groups as symbols" do
75
- expect(Gemline.options_to_string :group => [:development, :test]).to eq ':group => [:development, :test]'
71
+ it "handles a list of groups passed as symbols" do
72
+ expect(Gemline.options_to_string(group: %i[development test])).to eq "group: [:development, :test]"
76
73
  end
77
74
 
78
- it "handles a list of groups as strings" do
79
- expect(Gemline.options_to_string :group => ['development','test']).to eq ':group => [:development, :test]'
75
+ it "handles a list of groups passed as strings" do
76
+ expect(Gemline.options_to_string(group: %w[development test])).to eq "group: [:development, :test]"
80
77
  end
81
78
  end
82
79
  end
data/spec/spec_helper.rb CHANGED
@@ -1,21 +1,21 @@
1
- require 'simplecov'
1
+ require "simplecov"
2
2
  SimpleCov.start do
3
3
  add_filter "/spec/"
4
4
  end
5
5
 
6
6
  $LOAD_PATH.unshift(File.dirname(__FILE__))
7
- $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
7
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib"))
8
8
 
9
- require 'gemline'
9
+ require "gemline"
10
10
 
11
11
  RSpec.configure do |c|
12
12
  # c.mock_with :rr
13
13
  end
14
14
 
15
15
  def stub_rubygems_json_output
16
- Dir.glob(File.join(File.dirname(__FILE__),'samples', '*.json')).each do |f|
16
+ Dir.glob(File.join(File.dirname(__FILE__), "samples", "*.json")).each do |f|
17
17
  gem_name = $1 if f =~ /\/([\w\-]+).json$/
18
- allow(Gemline).to receive(:get_rubygem_json).with(gem_name).and_return(IO.read(f))
18
+ allow(Gemline::Rubygems).to receive(:get_rubygem_json).with(gem_name).and_return(IO.read(f))
19
19
  end
20
20
  end
21
21
 
metadata CHANGED
@@ -1,14 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gemline
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.5
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joe Alba
8
- autorequire:
9
8
  bindir: bin
10
9
  cert_chain: []
11
- date: 2021-07-10 00:00:00.000000000 Z
10
+ date: 2025-01-13 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
13
  name: clipboard
@@ -80,7 +79,7 @@ dependencies:
80
79
  - - ">="
81
80
  - !ruby/object:Gem::Version
82
81
  version: '0'
83
- description: Grab the latest Gemfile 'gem' line for a specific Ruby gem
82
+ description: Grab the latest Gemfile dependency designation for a specific Ruby gem
84
83
  email:
85
84
  - joe@joealba.com
86
85
  executables:
@@ -97,6 +96,7 @@ files:
97
96
  - bin/gemline
98
97
  - gemline.gemspec
99
98
  - lib/gemline.rb
99
+ - lib/gemline/rubygems.rb
100
100
  - spec/acceptance_spec.rb
101
101
  - spec/gemline_spec.rb
102
102
  - spec/samples/doesnotexist.json
@@ -108,7 +108,6 @@ homepage: https://github.com/joealba/gemline
108
108
  licenses:
109
109
  - MIT
110
110
  metadata: {}
111
- post_install_message:
112
111
  rdoc_options: []
113
112
  require_paths:
114
113
  - lib
@@ -123,8 +122,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
123
122
  - !ruby/object:Gem::Version
124
123
  version: '0'
125
124
  requirements: []
126
- rubygems_version: 3.1.4
127
- signing_key:
125
+ rubygems_version: 3.6.2
128
126
  specification_version: 4
129
127
  summary: ''
130
128
  test_files: