setdevenv 0.1.0 → 0.2.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 97bfc0c8d73609c60cfe013561fc11f2fceaa3c0d95fd3d37320e396b1390cd9
4
- data.tar.gz: 0f2677401800a85696ec05ea9eb029d524e8efdfa2d19365b8ff1a224404447c
3
+ metadata.gz: 036d7166efb316e1d0c3da0386416487354eb70e37d7594685695a1f40c86d07
4
+ data.tar.gz: 8adecb3566409a5da7a7fec22b1d3ab35422c67c0f30a536340a88aa6f06db21
5
5
  SHA512:
6
- metadata.gz: c54302279eb6b4484a320e3e007ae0e79b1c92f9197bba47f50be10e222f68b445cb935000d725503ac84712f9fbbcbb7cf6a980f008fc85be3b41e3b853c5bc
7
- data.tar.gz: 9ee80bb4304eef46ce4580d01c1ec20d71354ceeb54866fc3950cacde063b1514472e16811bdf62e58aea5e2ff6295a1ce7c5eb6af25e6111a6ddd12cc2c9a9e
6
+ metadata.gz: ac90cc46fa5723f631af66b633998bb11fc7b0b15292411a5fe19f4fea2b42ff82264f6805561bab2f709800635d21654536cc92f27fb3a8057982d699b49806
7
+ data.tar.gz: 90ac5d92b13af5f9c34a90d26da6b2c09b85eaef020ef810b9404fd2cd1da51debdc5c8f4ab88519f7711f256ffdae3b11126ac28a0641d2671fbd7ecdffbb13
data/.rubocop.yml ADDED
@@ -0,0 +1,6 @@
1
+ Metrics/MethodLength:
2
+ Enabled: false
3
+ Style/ClassAndModuleChildren:
4
+ Enabled: false
5
+ Style/Documentation:
6
+ Enabled: false
data/README.md CHANGED
@@ -20,7 +20,7 @@ This command will generate 3 files (***more to comming eventually***) within a f
20
20
 
21
21
  ## TODO
22
22
 
23
- - Retrieve ruby/alpine latests version from somewhere (and cache it)
24
- - Accept those versions as arguments from cli
25
- - Accept an argument in cli to use rails when setuping the new environment
26
- - Accept an argument `--service` to create a custom service within docker-compose
23
+ - [ ] Retrieve ruby/alpine latests version from somewhere (and cache it)
24
+ - [ ] Accept those versions as arguments from cli
25
+ - [ ] Accept an argument in cli to use rails when setuping the new environment
26
+ - [ ] Accept an argument `--service` to create a custom service within docker-compose
@@ -7,9 +7,7 @@ module SetDevEnv
7
7
  class Base < Thor::Group
8
8
  include Thor::Actions
9
9
 
10
- def self.source_root
11
- "#{File.dirname(__FILE__)}/templates"
12
- end
10
+ def self.source_root = "#{File.dirname(__FILE__, 4)}/templates"
13
11
  end
14
12
  end
15
13
  end
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative '../version_fetcher'
4
+
3
5
  module SetDevEnv
4
6
  module Setup::Generator
5
7
  class Dockerfile < Base
@@ -9,8 +11,8 @@ module SetDevEnv
9
11
 
10
12
  def copy_dockerfile
11
13
  # TODO: retrieve those values from somewhere to take latest ruby/alpine versions
12
- self.alpine_version ||= '3.21'
13
- self.ruby_version ||= '3.4.1'
14
+ self.alpine_version ||= VersionFetcher.call(resource: :alpine)
15
+ self.ruby_version ||= VersionFetcher.call(resource: :ruby)
14
16
 
15
17
  template('Dockerfile.tt', "#{name}/Dockerfile.dev")
16
18
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module SetDevEnv
4
- VERSION = '0.1.0'
4
+ VERSION = '0.2.0'
5
5
  end
@@ -0,0 +1,76 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'json'
4
+ require 'net/http'
5
+ require 'nokogiri'
6
+ require 'uri'
7
+
8
+ module SetDevEnv
9
+ module VersionFetcher
10
+ CACHE_FOLDER_PATH = "#{File.dirname(__FILE__, 3)}/.cache".freeze
11
+ RUBY_LATEST_VERSION = '3.4.2'
12
+ RUBY_RELEASES_ENDPOINT = 'https://www.ruby-lang.org/en/downloads/releases/'
13
+
14
+ class << self
15
+ def call(resource:)
16
+ case resource
17
+ in :alpine then alpine
18
+ in :ruby then ruby(resource:)
19
+ end
20
+ end
21
+
22
+ private
23
+
24
+ def alpine = '3.21'
25
+
26
+ def ruby(resource:)
27
+ retrieve_version_from_cache(resource) || retrieve_version_from_web
28
+ end
29
+
30
+ def retrieve_version_from_cache(resource)
31
+ cache_file_path = "#{CACHE_FOLDER_PATH}/cache.json"
32
+
33
+ return unless File.readable?(cache_file_path)
34
+
35
+ cache = JSON.parse(File.read(cache_file_path), symbolize_names: true)
36
+
37
+ cache[resource]&.fetch(:latest_version)
38
+ end
39
+
40
+ def retrieve_version_from_web
41
+ response = Net::HTTP.get_response(URI(RUBY_RELEASES_ENDPOINT))
42
+
43
+ return RUBY_LATEST_VERSION unless response.instance_of?(Net::HTTPOK)
44
+
45
+ document = Nokogiri::HTML5(response.body)
46
+
47
+ versions = document.css('table.release-list tr td:first-child').map do |td|
48
+ td.text.gsub(/\D/, '')[0..2].chars * '.'
49
+ end.uniq
50
+
51
+ higher_version = find_higher_version(versions)
52
+ cache(higher_version)
53
+
54
+ higher_version
55
+ rescue StandardError => _e
56
+ RUBY_LATEST_VERSION
57
+ end
58
+
59
+ def find_higher_version(versions)
60
+ versions.map { Gem::Version.new(it) }.max.to_s
61
+ end
62
+
63
+ def cache(version)
64
+ FileUtils.mkdir_p(CACHE_FOLDER_PATH)
65
+
66
+ # TODO: prevent overwrite file if file exists (in case im caching alpine/ruby versions
67
+ File.write(
68
+ '../../.cache/cache.json',
69
+ JSON.pretty_generate({ ruby: { latest_version: version } })
70
+ )
71
+ end
72
+ end
73
+
74
+ private_constant :CACHE_FOLDER_PATH, :RUBY_LATEST_VERSION, :RUBY_RELEASES_ENDPOINT
75
+ end
76
+ end
metadata CHANGED
@@ -1,14 +1,28 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: setdevenv
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Júnior
8
8
  bindir: exe
9
9
  cert_chain: []
10
- date: 2025-03-03 00:00:00.000000000 Z
10
+ date: 2025-03-05 00:00:00.000000000 Z
11
11
  dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: nokogiri
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - "~>"
17
+ - !ruby/object:Gem::Version
18
+ version: '1.18'
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - "~>"
24
+ - !ruby/object:Gem::Version
25
+ version: '1.18'
12
26
  - !ruby/object:Gem::Dependency
13
27
  name: thor
14
28
  requirement: !ruby/object:Gem::Requirement
@@ -86,6 +100,7 @@ executables:
86
100
  extensions: []
87
101
  extra_rdoc_files: []
88
102
  files:
103
+ - ".rubocop.yml"
89
104
  - CHANGELOG.md
90
105
  - CODE_OF_CONDUCT.md
91
106
  - LICENSE.txt
@@ -100,12 +115,13 @@ files:
100
115
  - lib/set_dev_env/generator/folder.rb
101
116
  - lib/set_dev_env/generator/generator.rb
102
117
  - lib/set_dev_env/generator/makefile.rb
103
- - lib/set_dev_env/generator/templates/Dockerfile.tt
104
- - lib/set_dev_env/generator/templates/Makefile.tt
105
- - lib/set_dev_env/generator/templates/docker-compose.tt
106
118
  - lib/set_dev_env/setup.rb
107
119
  - lib/set_dev_env/version.rb
120
+ - lib/set_dev_env/version_fetcher.rb
108
121
  - sig/set_dev_env.rbs
122
+ - templates/Dockerfile.tt
123
+ - templates/Makefile.tt
124
+ - templates/docker-compose.tt
109
125
  homepage: https://github.com/b-sep/setdevenv
110
126
  licenses:
111
127
  - MIT