erhu 0.1.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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 47f833209095e82b9c3b8a8a4301afd797a371e4aa4749b4607727e8b80eee93
4
+ data.tar.gz: ca702e35af44e8db93120921990200382b7ff5fba82d01277b0399d743f88ab8
5
+ SHA512:
6
+ metadata.gz: fbe906cd9eb69f2a6ab4d4107875e99c63f55bdb6970b7c886b4d80181069ae19d84c54341d94f97f8d92d6301140951b91b1afe6dabc71610b6f4c366ea07a4
7
+ data.tar.gz: bc5b8af3cfb4a7519c2799e093b1e1b829fab9d5a3bbdff48460f3d56682a15612eb72f03f340130ae34ff6e850e410c506c87a890cf386ba8212b96d1f5d092
data/Gemfile ADDED
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ source "https://rubygems.org"
4
+
5
+ # Specify your gem's dependencies in erhu.gemspec
6
+ gemspec
7
+
8
+ gem "rake", "~> 13.0"
9
+ gem 'tty-platform'
10
+ gem "tty-command"
11
+ gem "tty-progressbar"
12
+ gem "tty-spinner"
13
+
14
+ gem "pastel"
15
+ gem "rugged"
16
+
17
+ gem 'faraday'
18
+ gem 'faraday-follow_redirects'
19
+ gem 'rubyzip'
data/README.md ADDED
@@ -0,0 +1,3 @@
1
+ # Erhu
2
+
3
+ 一个创新新的包管理,可以用来管理C语音的包,或者管理算法的包
data/Rakefile ADDED
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bundler/gem_tasks"
4
+ task default: %i[]
data/exe/erhu ADDED
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require "bundler/setup"
5
+ require "erhu"
6
+
7
+ Erhu::App.new.run
data/lib/erhu/app.rb ADDED
@@ -0,0 +1,130 @@
1
+ module Erhu
2
+ class App
3
+ attr_accessor :erhufile
4
+ def initialize(erhufile_path=nil)
5
+ @erhufile = erhufile_path || File.join(Dir.pwd, "erhuFile")
6
+
7
+ @erhu_path = File.join(Dir.pwd, ".erhu")
8
+ unless Dir.exist?(@erhu_path)
9
+ FileUtils.mkdir_p(@erhu_path)
10
+ puts "Created #{@erhu_path}"
11
+ end
12
+ @database_path = File.join(@erhu_path, "database.yml")
13
+ end
14
+
15
+ def database
16
+ if File.exist?(@database_path)
17
+ @database ||= YAML.load_file(@database_path) || {}
18
+ else
19
+ @database ||= {}
20
+ end
21
+ end
22
+
23
+ def target(path)
24
+ @target = path
25
+ unless Dir.exist?(@target)
26
+ FileUtils.mkdir_p(@target)
27
+ puts "Created #{@target}"
28
+ end
29
+ end
30
+
31
+ def git(repository_url, branch: nil, name: nil, tag: nil, &block)
32
+ name = name || File.basename(URI.parse(repository_url).path, '.git')
33
+
34
+ info = self.database.fetch(name, {})
35
+ info.delete(:commit)
36
+ if info == {repository_url: repository_url, branch: branch, name: name, tag: tag}
37
+ puts "ignore #{repository_url}"
38
+ return
39
+ else
40
+ FileUtils.rm_rf("#{@target}/#{name}")
41
+ end
42
+
43
+ bar = TTY::ProgressBar.new("clone #{name} [:bar] :percent", total: 50)
44
+ transfer_progress = lambda do |total_objects, indexed_objects, received_objects, local_objects, total_deltas, indexed_deltas, received_bytes|
45
+ bar.ratio = indexed_objects / total_objects.to_f
46
+ end
47
+
48
+ repo = Rugged::Repository.clone_at(repository_url,
49
+ "#{@target}/#{name}",
50
+ depth: 1,
51
+ checkout_branch: branch,
52
+ transfer_progress: transfer_progress
53
+ )
54
+ if ! tag.blank? && ! repo.tags[tag].blank?
55
+ tag_repo = repo.tags[tag]
56
+ target = tag_repo.target
57
+ repo.checkout(target.oid, strategy: :safe)
58
+ end
59
+ block.call(repo, self) unless block.blank?
60
+
61
+ self.database[name] = {repository_url: repository_url,
62
+ branch: branch, name: name, tag: tag, commit: repo.head.target.oid
63
+ }
64
+ rescue => e
65
+ error! e
66
+ end
67
+
68
+ def package(package_url, name: nil, &block)
69
+ raise "package url is required" if package_url.blank?
70
+ raise "name: 'package name' is required" if name.blank?
71
+
72
+ package_name = name
73
+ package_hex = name.unpack('H*').first
74
+ package_file_path = "#{@erhu_path}/#{package_name}-#{package_hex}.zip"
75
+
76
+ if File.exist?(package_file_path)
77
+ puts "ignored #{package_url}"
78
+ return
79
+ end
80
+
81
+ conn = Faraday.new do |faraday|
82
+ faraday.use Faraday::FollowRedirects::Middleware
83
+ faraday.adapter Faraday.default_adapter
84
+ end
85
+
86
+ bar = TTY::ProgressBar.new("Downloading #{package_name} [:bar] :percent", total: 50, interval: 0.1)
87
+
88
+ streamed = []
89
+ response = conn.get(package_url) do |req|
90
+ req.options.on_data = Proc.new do |chunk, overall_received_bytes, env|
91
+ content_length = env.response_headers["content-length"]&.to_f
92
+ bar.ratio = overall_received_bytes / content_length if !content_length.blank? && content_length > 0
93
+ streamed << chunk
94
+ end
95
+ end
96
+
97
+ File.open(package_file_path, 'w') do |f|
98
+ f.write(streamed.join)
99
+ end
100
+
101
+ unless block.blank?
102
+ block.call(package_file_path, self)
103
+ return
104
+ end
105
+
106
+ self.zip(package_file_path, package_name)
107
+ end
108
+
109
+ def zip(package_file_path, package_name)
110
+ spinner = TTY::Spinner.new("[:spinner] extracted :title ...", format: :pulse_2)
111
+
112
+ Zip::File.open(package_file_path) do |zip_file|
113
+ zip_file.each do |entry|
114
+ dest_path = File.join(@target, package_name, entry.name.split('/')[1..-1].join('/'))
115
+ entry.extract(dest_path)
116
+ spinner.update title: entry.name
117
+ end
118
+ end
119
+ spinner.update title: "ALL"
120
+ spinner.stop("Done!")
121
+ end
122
+
123
+ def run
124
+ instance_eval File.read(@erhufile), @erhufile, 1
125
+ File.open(@database_path, 'w') do |file|
126
+ file.write self.database.to_yaml
127
+ end
128
+ end
129
+ end
130
+ end
data/lib/erhu/init.rb ADDED
@@ -0,0 +1,54 @@
1
+ require "tty-command"
2
+ require "tty-platform"
3
+ require "tty-progressbar"
4
+ require "tty-spinner"
5
+ require 'git'
6
+ require "pastel"
7
+ require 'fileutils'
8
+ require 'rugged'
9
+ require "uri"
10
+ require 'yaml'
11
+ require 'faraday'
12
+ require 'faraday/follow_redirects'
13
+ require 'tempfile'
14
+ require 'zip'
15
+
16
+ class Object
17
+ def blank?
18
+ respond_to?(:empty?) ? empty? : !self
19
+ end
20
+ end
21
+
22
+ def platform
23
+ $platform ||= TTY::Platform.new
24
+ end
25
+
26
+ def pastel
27
+ $pastel ||= Pastel.new
28
+ end
29
+
30
+ def error!(*args)
31
+ error = pastel.red.bold.detach
32
+ puts "error: #{error.(*args)}"
33
+ end
34
+
35
+ class Cmd
36
+ def initialize(pty: true, uuid: false, color: true)
37
+ @cmd = TTY::Command.new(pty: pty, uuid: uuid, color: color)
38
+ end
39
+
40
+ def chdir(path)
41
+ @chdir = path
42
+ self
43
+ end
44
+
45
+ def run(*args, &block)
46
+ options = args.last.is_a?(Hash) ? args.pop : {}
47
+ options[:chdir] = options.fetch(:chdir, @chdir)
48
+ args << options
49
+ @cmd.run(*args, &block)
50
+ self
51
+ rescue => e
52
+ error! e
53
+ end
54
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Erhu
4
+ VERSION = "0.1.0"
5
+ end
data/lib/erhu.rb ADDED
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+ require_relative "erhu/init"
3
+ require_relative "erhu/version"
4
+ require_relative "erhu/app"
5
+
6
+ module Erhu
7
+ class Error < StandardError; end
8
+ # Your code goes here...
9
+ end
data/sig/erhu.rbs ADDED
@@ -0,0 +1,4 @@
1
+ module Erhu
2
+ VERSION: String
3
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
4
+ end
metadata ADDED
@@ -0,0 +1,55 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: erhu
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - MJ
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2023-03-24 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: Erhu 是一个动态可编程的包管理系统
14
+ email:
15
+ - tywf91@gmail.com
16
+ executables:
17
+ - erhu
18
+ extensions: []
19
+ extra_rdoc_files: []
20
+ files:
21
+ - Gemfile
22
+ - README.md
23
+ - Rakefile
24
+ - exe/erhu
25
+ - lib/erhu.rb
26
+ - lib/erhu/app.rb
27
+ - lib/erhu/init.rb
28
+ - lib/erhu/version.rb
29
+ - sig/erhu.rbs
30
+ homepage: https://github.com/mjason/erhu.git
31
+ licenses: []
32
+ metadata:
33
+ homepage_uri: https://github.com/mjason/erhu.git
34
+ source_code_uri: https://github.com/mjason/erhu.git
35
+ changelog_uri: https://github.com/mjason/erhu.git
36
+ post_install_message:
37
+ rdoc_options: []
38
+ require_paths:
39
+ - lib
40
+ required_ruby_version: !ruby/object:Gem::Requirement
41
+ requirements:
42
+ - - ">="
43
+ - !ruby/object:Gem::Version
44
+ version: 2.6.0
45
+ required_rubygems_version: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - ">="
48
+ - !ruby/object:Gem::Version
49
+ version: '0'
50
+ requirements: []
51
+ rubygems_version: 3.4.6
52
+ signing_key:
53
+ specification_version: 4
54
+ summary: Erhu 一个包管理
55
+ test_files: []