hiddengems 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 0f68060eb1130cc3f42b1db1801de72527a1bdc51980557883b12493dd72bbde
4
+ data.tar.gz: 2092ac85a1696099c7cfab6802b30f2b741c3354f4abc6ad2b01b3d0de49f58e
5
+ SHA512:
6
+ metadata.gz: ff84e6f76960871827d4e7cc3d254ab6170628b651092c8833db041b6700b309feb0ab36be91288a9126d3f0d3c970681939ac65bf7afd45e76151a6678a8c97
7
+ data.tar.gz: 29c84023222bb564c2b27e53c4b5d5f4783861d62d9c73d178ca9f2d7288c6569edb0cd5c7b70c8f70b7d04ed9fcfddcc30980b3ae4ba81a10ef1482054e0b50
data/.gitignore ADDED
@@ -0,0 +1,9 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /_yardoc/
4
+ /coverage/
5
+ /doc/
6
+ /pkg/
7
+ /spec/reports/
8
+ /tmp/
9
+ Gemfile.lock
data/Gemfile ADDED
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ source "https://rubygems.org"
4
+
5
+ # Specify your gem's dependencies in hiddengems.gemspec
6
+ gemspec
7
+
8
+ gem "rake", "~> 13.0"
data/README.md ADDED
@@ -0,0 +1,75 @@
1
+ # Hiddengems
2
+
3
+ This gem provides an executable - hiddengems.rb - that submits a search term to rubygems.org
4
+ and sorts the search results by a number of ranking parameters:
5
+
6
+ - number of downloads
7
+ - number of versions
8
+ - date of latest version
9
+ - average date of all released versions
10
+
11
+ Using the above, it produces a table of found gems sorted by "vitality", which
12
+ works like this:
13
+
14
+ The gem's ranking order for each of the above ranking parameters is summed together.
15
+ The ranking sum that is loweest produces the highest "vitality" ranking.
16
+
17
+ Example:
18
+
19
+ ```
20
+ $ hiddengems.rb 'zabbix sender'
21
+ Search term zabbix sender returned 6 hits
22
+ Simple Rankings
23
+ +---------------------------+------------------------+---------------------------+---------------------------+
24
+ |by_downloads |by_versions |by_latest_version_date |by_avg_version_date |
25
+ +---------------------------+------------------------+---------------------------+---------------------------+
26
+ |zabbix-ruby-client (51296) |zabbix-ruby-client (24) |zabbix_sender_api (2022) |zabbix_sender_api (2021) |
27
+ |zabbix_sender (34951) |zabbix_sender_api (11) |zabbix_sender (2020) |zabbix_sender (2017) |
28
+ |zabbix_send (13447) |zabbix_sender (5) |zabbix_sender_legacy (2016)|zabbix_sender_legacy (2016)|
29
+ |zabbix_receiver (10271) |zabbix_sender_legacy (5)|zabbix-ruby-client (2016) |zabbix_receiver (2015) |
30
+ |zabbix_sender_api (10031) |zabbix_receiver (5) |zabbix_receiver (2015) |zabbix-ruby-client (2014) |
31
+ |zabbix_sender_legacy (9939)|zabbix_send (3) |zabbix_send (2013) |zabbix_send (2013) |
32
+ +---------------------------+------------------------+---------------------------+---------------------------+
33
+
34
+ Vitality Ranking:
35
+ +-----------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------+
36
+ |name |info |
37
+ +-----------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------+
38
+ |zabbix_sender |Zabbix Sender gem |
39
+ |zabbix_sender_api |This gem implements an api that abstracts the zabbix sender/trapper mechanism. It saves tons of time when you… |
40
+ |zabbix_sender_legacy |Improved zabbix_sender gem just for legacy ruby < 2.0 like in Debian Wheezy |
41
+ |zabbix-ruby-client |A zabbix alternative to zabbix-agent using zabbix-sender. |
42
+ |zabbix_send |Send data to Zabbix trappers from Ruby |
43
+ |zabbix_receiver |Server to receive sender data from zabbix-agent. |
44
+ +-----------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------+
45
+ ```
46
+
47
+ ## Installation
48
+
49
+ Add this line to your application's Gemfile:
50
+
51
+ ```ruby
52
+ gem 'hiddengems'
53
+ ```
54
+
55
+ And then execute:
56
+
57
+ $ bundle install
58
+
59
+ Or install it yourself as:
60
+
61
+ $ gem install hiddengems
62
+
63
+ ## Usage
64
+
65
+ $ hiddengems.rb 'search term'
66
+
67
+ ## Development
68
+
69
+ After checking out the repo, run `bin/setup` to install dependencies. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
70
+
71
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and the created tag, and push the `.gem` file to [rubygems.org](https://rubygems.org).
72
+
73
+ ## Contributing
74
+
75
+ Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/hiddengems.
data/Rakefile ADDED
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bundler/gem_tasks"
4
+ task default: %i[]
data/bin/console ADDED
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require "bundler/setup"
5
+ require "hiddengems"
6
+
7
+ # You can add fixtures and/or initialization code here to make experimenting
8
+ # with your gem easier. You can also use a different console, if you like.
9
+
10
+ # (If you use this, don't forget to add pry to your Gemfile!)
11
+ # require "pry"
12
+ # Pry.start
13
+
14
+ require "irb"
15
+ IRB.start(__FILE__)
data/bin/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
data/exe/hiddengems.rb ADDED
@@ -0,0 +1,116 @@
1
+ #!/usr/bin/env ruby
2
+ require 'json'
3
+ require 'time'
4
+ require 'faraday'
5
+ require 'ostruct'
6
+ require 'tty-table'
7
+ require 'pry-rescue'
8
+
9
+ searchTerm = ARGV[0]
10
+
11
+ module GemEntry
12
+ def catalogEntry
13
+ "#{name}: #{info}"
14
+ end
15
+
16
+ def totalVersions
17
+ versions.size
18
+ end
19
+
20
+ def latestVersionDate
21
+ sortedVersions.first.publishedDate
22
+ end
23
+
24
+ def avgDateOfAllVersions
25
+ sum = versions.inject(0) { |memo,version|
26
+ memo += version.publishedDate.to_time.to_i
27
+ }
28
+ Time.at(sum / totalVersions)
29
+ end
30
+
31
+ def sortedVersions
32
+ versions.sort {|a,b| a.publishDate <=> b.publishDate}
33
+ end
34
+ def versionDownloadHistory
35
+ res = Array.new
36
+ nextRelease = Date.today
37
+ sortedVersions.each {|version|
38
+ version[:downloadsPerDay] = version.downloadsPerDayFrom(nextRelease)
39
+ res.push(version.to_h)
40
+ nextRelease = version.publishedDate
41
+ }
42
+ res
43
+ end
44
+ end
45
+
46
+ module GemVersion
47
+ def publishedDate
48
+ Date.iso8601(built_at)
49
+ end
50
+ def downloadsPerDayFrom(aDate)
51
+ begin
52
+ downloads_count / (aDate - publishedDate).to_i
53
+ rescue ZeroDivisionError
54
+ downloads_count
55
+ end
56
+ end
57
+ end
58
+
59
+
60
+ curpage = 1
61
+ gems = Array.new
62
+ gemdict = Hash.new
63
+ until curpage == 0
64
+ gemPage = JSON.parse(Faraday.get("https://rubygems.org/api/v1/search.json?page=#{curpage}&query=#{searchTerm}").body).collect { |each| OpenStruct.new(each)}.collect {|gem|
65
+ gem.extend(GemEntry)
66
+ gem[:versions] = JSON.parse(
67
+ Faraday.get(
68
+ "https://rubygems.org/api/v1/versions/#{gem.name}.json"
69
+ ).body
70
+ ).collect { |version|
71
+ version = OpenStruct.new(version).extend(GemVersion)
72
+ }
73
+ gem[:rank] = 0
74
+ gemdict[gem.name] = gem
75
+ gem
76
+ }
77
+ gems += gemPage
78
+ curpage = ((gemPage.size < 30) ? 0 : curpage.next)
79
+ end
80
+
81
+
82
+ puts "Search term #{searchTerm} returned #{gems.size} hits"
83
+
84
+ # Things we wanna see sorted:
85
+ # + number of versions
86
+ # + date of last version
87
+ # + avg date of all versions
88
+ # + number of downloads
89
+ # - downloads per day per version
90
+ # - average downloads per day
91
+ # - last downloads per day
92
+ # - velocity of downloads per day per version
93
+
94
+
95
+ data = Hash.new
96
+ data[:by_downloads] = gems.sort {|a,b| b.downloads <=> a.downloads}.collect {|each| "#{each.name} (#{each.downloads})"}
97
+ data[:by_versions] = gems.sort {|a,b| b.totalVersions <=> a.totalVersions}.collect {|each| "#{each.name} (#{each.totalVersions})"}
98
+ data[:by_latest_version_date] = gems.sort {|a,b| b.latestVersionDate <=> a.latestVersionDate}.collect {|each| "#{each.name} (#{each.latestVersionDate.year})"}
99
+ data[:by_avg_version_date] = gems.sort {|a,b| b.avgDateOfAllVersions<=> a.avgDateOfAllVersions}.collect {|each| "#{each.name} (#{each.avgDateOfAllVersions.year})"}
100
+ report = Array.new
101
+ gems.each_index {|index|
102
+ record = Hash.new
103
+ [:by_downloads,:by_versions,:by_latest_version_date,:by_avg_version_date].each {|column|
104
+ record[column] = data[column][index]
105
+ gemdict[data[column][index].split(' (').first][:rank] += index
106
+ }
107
+ report.push(record)
108
+ }
109
+
110
+ puts "Simple Rankings"
111
+ puts TTY::Table.new(header: data.keys, rows: report).render(:ascii)
112
+
113
+ puts "\nVitality Ranking:"
114
+ puts TTY::Table.new(header: [:name,:info], rows: gems.sort {|a,b| a.ranking<=>b.ranking}.collect {|each| [each.name,each.info]}).render(:ascii, column_widths: [15,20],resize: true)
115
+
116
+ puts
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "lib/hiddengems/version"
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = "hiddengems"
7
+ spec.version = Hiddengems::VERSION
8
+ spec.authors = ["Dave Parker"]
9
+ spec.email = ["dparker@svdasein.org"]
10
+
11
+ spec.summary = "Search for ruby gems with a search term (like bestgems.org) with better ranking"
12
+ spec.description = "Provides a cli that lets you search rubygems for a search term. Displays multiple ranking criteria with emphasis on project vitality"
13
+ spec.homepage = "https://gitlab.com/svdasein/hiddengems"
14
+ spec.required_ruby_version = ">= 2.4.0"
15
+
16
+ spec.metadata["allowed_push_host"] = "https://rubygems.org"
17
+
18
+ spec.metadata["homepage_uri"] = spec.homepage
19
+ spec.metadata["source_code_uri"] = "https://gitlab.com/svdasein/hiddengems"
20
+ spec.metadata["changelog_uri"] = "https://gitlab.com/svdasein/hiddengems/CHANGELOG"
21
+
22
+ # Specify which files should be added to the gem when it is released.
23
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
24
+ spec.files = Dir.chdir(File.expand_path(__dir__)) do
25
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{\A(?:test|spec|features)/}) }
26
+ end
27
+ spec.bindir = "exe"
28
+ spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
29
+ spec.require_paths = ["lib"]
30
+
31
+ # Uncomment to register a new dependency of your gem
32
+ # spec.add_dependency "example-gem", "~> 1.0"
33
+ spec.add_dependency 'json'
34
+ spec.add_dependency 'time'
35
+ spec.add_dependency 'faraday'
36
+ spec.add_dependency 'ostruct'
37
+ spec.add_dependency 'tty-table'
38
+ spec.add_dependency 'pry-rescue'
39
+
40
+ # For more information and examples about making a new gem, checkout our
41
+ # guide at: https://bundler.io/guides/creating_gem.html
42
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Hiddengems
4
+ VERSION = "0.1.0"
5
+ end
data/lib/hiddengems.rb ADDED
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "hiddengems/version"
4
+
5
+ module Hiddengems
6
+ class Error < StandardError; end
7
+ # Your code goes here...
8
+ end
metadata ADDED
@@ -0,0 +1,142 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: hiddengems
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Dave Parker
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2022-08-29 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: json
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: time
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: faraday
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: ostruct
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: tty-table
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: pry-rescue
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ description: Provides a cli that lets you search rubygems for a search term. Displays
98
+ multiple ranking criteria with emphasis on project vitality
99
+ email:
100
+ - dparker@svdasein.org
101
+ executables:
102
+ - hiddengems.rb
103
+ extensions: []
104
+ extra_rdoc_files: []
105
+ files:
106
+ - ".gitignore"
107
+ - Gemfile
108
+ - README.md
109
+ - Rakefile
110
+ - bin/console
111
+ - bin/setup
112
+ - exe/hiddengems.rb
113
+ - hiddengems.gemspec
114
+ - lib/hiddengems.rb
115
+ - lib/hiddengems/version.rb
116
+ homepage: https://gitlab.com/svdasein/hiddengems
117
+ licenses: []
118
+ metadata:
119
+ allowed_push_host: https://rubygems.org
120
+ homepage_uri: https://gitlab.com/svdasein/hiddengems
121
+ source_code_uri: https://gitlab.com/svdasein/hiddengems
122
+ changelog_uri: https://gitlab.com/svdasein/hiddengems/CHANGELOG
123
+ post_install_message:
124
+ rdoc_options: []
125
+ require_paths:
126
+ - lib
127
+ required_ruby_version: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: 2.4.0
132
+ required_rubygems_version: !ruby/object:Gem::Requirement
133
+ requirements:
134
+ - - ">="
135
+ - !ruby/object:Gem::Version
136
+ version: '0'
137
+ requirements: []
138
+ rubygems_version: 3.1.6
139
+ signing_key:
140
+ specification_version: 4
141
+ summary: Search for ruby gems with a search term (like bestgems.org) with better ranking
142
+ test_files: []