gemstar 1.1.1 → 1.3

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.
@@ -0,0 +1,114 @@
1
+ module Gemstar
2
+ class UvLockFile
3
+ attr_reader :specs
4
+ attr_reader :spec_sources
5
+
6
+ def initialize(path: nil, content: nil)
7
+ parsed = parse_content(content || File.read(path))
8
+ @specs = parsed[:specs]
9
+ @spec_sources = parsed[:spec_sources]
10
+ end
11
+
12
+ def source_for(name)
13
+ spec_sources[name]
14
+ end
15
+
16
+ private
17
+
18
+ def parse_content(content)
19
+ specs = {}
20
+ spec_sources = {}
21
+
22
+ package_blocks(content).each do |block|
23
+ name = scalar_value(block, "name")
24
+ version = scalar_value(block, "version")
25
+ source = source_for_block(block, name, version)
26
+ next if name.to_s.empty? || version.to_s.empty?
27
+ next if source[:type] == :virtual
28
+
29
+ specs[name] = version
30
+ spec_sources[name] = source
31
+ end
32
+
33
+ {
34
+ specs: specs,
35
+ spec_sources: spec_sources
36
+ }
37
+ end
38
+
39
+ def package_blocks(content)
40
+ content.to_s.split(/^\[\[package\]\]\s*$/).drop(1)
41
+ end
42
+
43
+ def scalar_value(block, key)
44
+ block[/^#{Regexp.escape(key)}\s*=\s*"([^"]*)"/, 1]
45
+ end
46
+
47
+ def source_for_block(block, name, version)
48
+ source = inline_table(block[/^source\s*=\s*\{([^}]*)\}/, 1])
49
+ package_url = "https://pypi.org/project/#{name}/"
50
+ registry_url = source["registry"]
51
+
52
+ if source.key?("virtual")
53
+ return {
54
+ type: :virtual,
55
+ path: source["virtual"]
56
+ }.compact
57
+ end
58
+
59
+ if source.key?("git")
60
+ return {
61
+ type: :git,
62
+ remote: source["git"],
63
+ revision: source["rev"] || source["commit"],
64
+ branch: source["branch"],
65
+ tag: source["tag"],
66
+ package_name: name,
67
+ package_version: version,
68
+ registry_url: package_url
69
+ }.compact
70
+ end
71
+
72
+ if source.key?("path") || source.key?("editable") || source.key?("directory")
73
+ return {
74
+ type: :path,
75
+ path: source["path"] || source["editable"] || source["directory"],
76
+ package_name: name,
77
+ package_version: version,
78
+ registry_url: package_url
79
+ }.compact
80
+ end
81
+
82
+ {
83
+ type: :pypi,
84
+ remote: registry_url,
85
+ distribution_url: distribution_url(block),
86
+ package_name: name,
87
+ package_version: version,
88
+ registry_url: package_url
89
+ }.compact
90
+ end
91
+
92
+ def distribution_url(block)
93
+ sdist = inline_table(block[/^sdist\s*=\s*\{([^}]*)\}/, 1])
94
+ return sdist["url"] unless sdist["url"].to_s.empty?
95
+
96
+ wheel = inline_table(block[/^\s*\{\s*url\s*=\s*"([^"]+)"/, 0])
97
+ wheel["url"]
98
+ end
99
+
100
+ def inline_table(content)
101
+ content.to_s.scan(/([\w-]+)\s*=\s*("[^"]*"|true|false|[^,\s}]+)/).each_with_object({}) do |(key, raw_value), values|
102
+ values[key] = parse_inline_value(raw_value)
103
+ end
104
+ end
105
+
106
+ def parse_inline_value(raw_value)
107
+ value = raw_value.to_s.strip
108
+ return true if value == "true"
109
+ return false if value == "false"
110
+
111
+ value.sub(/\A"/, "").sub(/"\z/, "")
112
+ end
113
+ end
114
+ end
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Gemstar # :nodoc:
4
- VERSION = "1.1.1"
4
+ VERSION = "1.3"
5
5
  def self.debug?
6
6
  return @debug if defined?(@debug)
7
7
  @debug = ENV["GEMSTAR_DEBUG"] == "true"