dagger_ruby 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.
@@ -0,0 +1,89 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "dagger_object"
4
+
5
+ module DaggerRuby
6
+ class File < DaggerObject
7
+ def self.from_id(id, client)
8
+ query = QueryBuilder.new("file")
9
+ query.load_from_id(id)
10
+ new(query, client)
11
+ end
12
+
13
+ def self.root_field_name
14
+ "file"
15
+ end
16
+
17
+ def with_name(name)
18
+ chain_operation("withName", { "name" => name })
19
+ end
20
+
21
+ def with_contents(contents)
22
+ chain_operation("withContents", { "contents" => contents })
23
+ end
24
+
25
+ def with_timestamps(timestamp)
26
+ chain_operation("withTimestamps", { "timestamp" => timestamp })
27
+ end
28
+
29
+ def with_secret(secret)
30
+ chain_operation("withSecret", { "secret" => secret })
31
+ end
32
+
33
+ def contents
34
+ get_scalar("contents")
35
+ end
36
+
37
+ def size
38
+ get_scalar("size")
39
+ end
40
+
41
+ def name
42
+ get_scalar("name")
43
+ end
44
+
45
+ def export(path, opts = {})
46
+ args = { "path" => path }
47
+ args["allowParentDirPath"] = opts[:allow_parent_dir_path] if opts.key?(:allow_parent_dir_path)
48
+
49
+ query = @query_builder.build_query_with_selection("export(#{format_arguments(args)})")
50
+ result = @client.execute(query)
51
+ extract_value_from_result(result, "export")
52
+ end
53
+
54
+ def sync
55
+ get_scalar("id")
56
+ self
57
+ end
58
+
59
+ private
60
+
61
+ def format_arguments(args)
62
+ return "" if args.empty?
63
+
64
+ args.map { |key, value| "#{key}: #{format_value(value)}" }.join(", ")
65
+ end
66
+
67
+ def format_value(value)
68
+ case value
69
+ when String
70
+ "\"#{value}\""
71
+ when Integer, Float
72
+ value.to_s
73
+ when TrueClass, FalseClass
74
+ value.to_s
75
+ when NilClass
76
+ "null"
77
+ when Array
78
+ "[#{value.map { |v| format_value(v) }.join(', ')}]"
79
+ when Hash
80
+ formatted_pairs = value.map { |k, v| "#{k}: #{format_value(v)}" }
81
+ "{ #{formatted_pairs.join(', ')} }"
82
+ when DaggerObject
83
+ value.id
84
+ else
85
+ "\"#{value}\""
86
+ end
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,88 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "dagger_object"
4
+
5
+ module DaggerRuby
6
+ class GitRepository < DaggerObject
7
+ def self.from_id(id, client)
8
+ query = QueryBuilder.new("gitRepository")
9
+ query.load_from_id(id)
10
+ new(query, client)
11
+ end
12
+
13
+ def self.root_field_name
14
+ "gitRepository"
15
+ end
16
+
17
+ def branch(name)
18
+ get_object("branch", GitRef, { "name" => name })
19
+ end
20
+
21
+ def tag(name)
22
+ get_object("tag", GitRef, { "name" => name })
23
+ end
24
+
25
+ def commit(id)
26
+ get_object("commit", GitRef, { "id" => id })
27
+ end
28
+
29
+ def head
30
+ get_object("head", GitRef)
31
+ end
32
+
33
+ def branches
34
+ get_scalar("branches")
35
+ end
36
+
37
+ def tags
38
+ get_scalar("tags")
39
+ end
40
+
41
+ def with_auth_token(token)
42
+ chain_operation("withAuthToken", { "token" => token.is_a?(DaggerObject) ? token.id : token })
43
+ end
44
+
45
+ def with_auth_header(header)
46
+ chain_operation("withAuthHeader", { "header" => header.is_a?(DaggerObject) ? header.id : header })
47
+ end
48
+
49
+ def sync
50
+ get_scalar("id")
51
+ self
52
+ end
53
+ end
54
+
55
+ class GitRef < DaggerObject
56
+ def self.from_id(id, client)
57
+ query = QueryBuilder.new("gitRef")
58
+ query.load_from_id(id)
59
+ new(query, client)
60
+ end
61
+
62
+ def self.root_field_name
63
+ "gitRef"
64
+ end
65
+
66
+ def commit
67
+ get_scalar("commit")
68
+ end
69
+
70
+ def ref
71
+ get_scalar("ref")
72
+ end
73
+
74
+ def tree(opts = {})
75
+ args = {}
76
+ args["path"] = opts[:path] if opts[:path]
77
+ args["exclude"] = opts[:exclude] if opts[:exclude]
78
+ args["include"] = opts[:include] if opts[:include]
79
+
80
+ get_object("tree", Directory, args)
81
+ end
82
+
83
+ def sync
84
+ get_scalar("id")
85
+ self
86
+ end
87
+ end
88
+ end
@@ -0,0 +1,60 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "errors"
4
+ require_relative "dagger_object"
5
+
6
+ module DaggerRuby
7
+ class Host < DaggerObject
8
+ def self.from_id(id, client)
9
+ query = QueryBuilder.new("host")
10
+ query.load_from_id(id)
11
+ new(query, client)
12
+ end
13
+
14
+ def self.root_field_name
15
+ "host"
16
+ end
17
+
18
+ def directory(path, opts = {})
19
+ args = { "path" => path }
20
+ args["exclude"] = opts[:exclude] if opts[:exclude]
21
+ args["include"] = opts[:include] if opts[:include]
22
+
23
+ get_object("directory", Directory, args)
24
+ end
25
+
26
+ def file(path)
27
+ get_object("file", File, { "path" => path })
28
+ end
29
+
30
+ def unix_socket(path)
31
+ get_object("unixSocket", Socket, { "path" => path })
32
+ end
33
+
34
+ def workdir
35
+ get_scalar("workdir")
36
+ end
37
+
38
+ def sync
39
+ get_scalar("id")
40
+ self
41
+ end
42
+ end
43
+
44
+ class Socket < DaggerObject
45
+ def self.from_id(id, client)
46
+ query = QueryBuilder.new("socket")
47
+ query.load_from_id(id)
48
+ new(query, client)
49
+ end
50
+
51
+ def self.root_field_name
52
+ "socket"
53
+ end
54
+
55
+ def sync
56
+ get_scalar("id")
57
+ self
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,124 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "errors"
4
+ require "json"
5
+
6
+ module DaggerRuby
7
+ class QueryBuilder
8
+ attr_reader :root_field, :operation_chain, :variables
9
+
10
+ def initialize(root_field = nil)
11
+ @root_field = root_field
12
+ @operation_chain = []
13
+ @variables = {}
14
+ end
15
+
16
+ def chain_operation(field, args = {})
17
+ new_query = QueryBuilder.new(@root_field)
18
+ new_query.instance_variable_set(:@operation_chain, @operation_chain + [ { field: field, args: args } ])
19
+ new_query.instance_variable_set(:@variables, @variables.dup)
20
+ new_query
21
+ end
22
+
23
+ def load_from_id(id)
24
+ chain_operation("loadFromId", { "id" => id })
25
+ end
26
+
27
+ def variable(name, type)
28
+ new_query = QueryBuilder.new(@root_field)
29
+ new_query.instance_variable_set(:@operation_chain, @operation_chain.dup)
30
+ new_query.instance_variable_set(:@variables, @variables.merge(name => type))
31
+ new_query
32
+ end
33
+
34
+ def build_query_with_selection(field)
35
+ query_parts = []
36
+
37
+ if @variables.any?
38
+ vars = @variables.map { |name, type| "$#{name}: #{type}" }.join(", ")
39
+ query_parts << "query(#{vars})"
40
+ else
41
+ query_parts << "query"
42
+ end
43
+
44
+ if @root_field
45
+ if @operation_chain.empty?
46
+ query_parts << "{ #{@root_field} { #{field} } }"
47
+ else
48
+ operations_str = build_operations_chain_with_selection(field)
49
+ query_parts << "{ #{@root_field} { #{operations_str} } }"
50
+ end
51
+ elsif @operation_chain.any?
52
+ operations_str = build_operations_chain_with_selection(field)
53
+ query_parts << "{ #{operations_str} }"
54
+ else
55
+ query_parts << "{ #{field} }"
56
+ end
57
+
58
+ query_parts.join(" ")
59
+ end
60
+
61
+ private
62
+
63
+ def build_operations_chain_with_selection(field)
64
+ current_op = @operation_chain.first
65
+ result = "#{current_op[:field]}#{format_arguments(current_op[:args])}"
66
+
67
+ if @operation_chain.length > 1
68
+ result << " { "
69
+ @operation_chain[1..-1].each do |op|
70
+ result << "#{op[:field]}#{format_arguments(op[:args])} { "
71
+ end
72
+ result << field
73
+ result << " }" * @operation_chain.length
74
+ else
75
+ result << " { #{field} }"
76
+ end
77
+
78
+ result
79
+ end
80
+
81
+ def format_arguments(args)
82
+ return "" if args.empty?
83
+
84
+ "(#{args.map { |key, value| "#{key}: #{format_value(value)}" }.join(', ')})"
85
+ end
86
+
87
+ def format_value(value)
88
+ case value
89
+ when String
90
+ if value.start_with?("$")
91
+ value
92
+ else
93
+ "\"#{escape_string(value)}\""
94
+ end
95
+ when Integer, Float, TrueClass, FalseClass
96
+ value.to_s
97
+ when NilClass
98
+ "null"
99
+ when Array
100
+ "[#{value.map { |v| format_value(v) }.join(', ')}]"
101
+ when Hash
102
+ if value[:type] && value[:value]
103
+ value[:value].to_s
104
+ else
105
+ "{#{value.map { |k, v| "#{k}: #{format_value(v)}" }.join(', ')}}"
106
+ end
107
+ else
108
+ value.to_s
109
+ end
110
+ end
111
+
112
+ def escape_string(str)
113
+ str.gsub(/["\\\n\r\t]/) do |c|
114
+ case c
115
+ when '"' then '\\"'
116
+ when "\\" then "\\\\"
117
+ when "\n" then '\\n'
118
+ when "\r" then '\\r'
119
+ when "\t" then '\\t'
120
+ end
121
+ end
122
+ end
123
+ end
124
+ end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "dagger_object"
4
+
5
+ module DaggerRuby
6
+ class Secret < DaggerObject
7
+ def self.from_id(id, client)
8
+ query = QueryBuilder.new("secret")
9
+ query.load_from_id(id)
10
+ new(query, client)
11
+ end
12
+
13
+ def self.root_field_name
14
+ "secret"
15
+ end
16
+
17
+ def with_name(name)
18
+ chain_operation("withName", { "name" => name })
19
+ end
20
+
21
+ def with_plaintext(plaintext)
22
+ chain_operation("withPlaintext", { "plaintext" => plaintext })
23
+ end
24
+
25
+ def name
26
+ get_scalar("name")
27
+ end
28
+
29
+ def plaintext
30
+ get_scalar("plaintext")
31
+ end
32
+
33
+ def sync
34
+ get_scalar("id")
35
+ self
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,113 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "dagger_object"
4
+
5
+ module DaggerRuby
6
+ class Service < DaggerObject
7
+ def self.from_id(id, client)
8
+ query = QueryBuilder.new("service")
9
+ query.load_from_id(id)
10
+ new(query, client)
11
+ end
12
+
13
+ def self.root_field_name
14
+ "service"
15
+ end
16
+
17
+ def endpoint(opts = {})
18
+ args = {}
19
+ args["port"] = opts[:port] if opts[:port]
20
+ args["scheme"] = opts[:scheme] if opts[:scheme]
21
+
22
+ if args.empty?
23
+ get_scalar("endpoint")
24
+ else
25
+ query = @query_builder.build_query_with_selection("endpoint(#{format_arguments(args)})")
26
+ result = @client.execute(query)
27
+ extract_value_from_result(result, "endpoint")
28
+ end
29
+ end
30
+
31
+ def hostname
32
+ get_scalar("hostname")
33
+ end
34
+
35
+ def ports
36
+ get_scalar("ports")
37
+ end
38
+
39
+ def start
40
+ query = @query_builder.build_query_with_selection("start")
41
+ result = @client.execute(query)
42
+ extract_value_from_result(result, "start")
43
+ end
44
+
45
+ def stop(opts = {})
46
+ args = {}
47
+ args["kill"] = opts[:kill] if opts.key?(:kill)
48
+
49
+ if args.empty?
50
+ query = @query_builder.build_query_with_selection("stop")
51
+ else
52
+ query = @query_builder.build_query_with_selection("stop(#{format_arguments(args)})")
53
+ end
54
+
55
+ result = @client.execute(query)
56
+ extract_value_from_result(result, "stop")
57
+ end
58
+
59
+ def up(opts = {})
60
+ args = {}
61
+ args["ports"] = opts[:ports] if opts[:ports]
62
+ args["random"] = opts[:random] if opts.key?(:random)
63
+
64
+ if args.empty?
65
+ query = @query_builder.build_query_with_selection("up")
66
+ else
67
+ query = @query_builder.build_query_with_selection("up(#{format_arguments(args)})")
68
+ end
69
+
70
+ result = @client.execute(query)
71
+ extract_value_from_result(result, "up")
72
+ end
73
+
74
+ def with_hostname(hostname)
75
+ chain_operation("withHostname", { "hostname" => hostname })
76
+ end
77
+
78
+ def sync
79
+ get_scalar("id")
80
+ self
81
+ end
82
+
83
+ private
84
+
85
+ def format_arguments(args)
86
+ return "" if args.empty?
87
+
88
+ args.map { |key, value| "#{key}: #{format_value(value)}" }.join(", ")
89
+ end
90
+
91
+ def format_value(value)
92
+ case value
93
+ when String
94
+ "\"#{value}\""
95
+ when Integer, Float
96
+ value.to_s
97
+ when TrueClass, FalseClass
98
+ value.to_s
99
+ when NilClass
100
+ "null"
101
+ when Array
102
+ "[#{value.map { |v| format_value(v) }.join(', ')}]"
103
+ when Hash
104
+ formatted_pairs = value.map { |k, v| "#{k}: #{format_value(v)}" }
105
+ "{ #{formatted_pairs.join(', ')} }"
106
+ when DaggerObject
107
+ value.id
108
+ else
109
+ "\"#{value}\""
110
+ end
111
+ end
112
+ end
113
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DaggerRuby
4
+ VERSION = "0.1.0"
5
+ end
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "dagger_ruby/version"
4
+ require_relative "dagger_ruby/client"
5
+ require_relative "dagger_ruby/config"
6
+ require_relative "dagger_ruby/errors"
7
+
8
+ module DaggerRuby
9
+ class << self
10
+ def connection(config = nil)
11
+ # If we're already in a dagger session, use it
12
+ if ENV["DAGGER_SESSION_PORT"] && ENV["DAGGER_SESSION_TOKEN"]
13
+ client = Client.new(config: config)
14
+ if block_given?
15
+ begin
16
+ yield client
17
+ ensure
18
+ client.close
19
+ end
20
+ else
21
+ client
22
+ end
23
+ else
24
+ # Otherwise, start a new dagger session
25
+ require "open3"
26
+
27
+ # Get the current script and its arguments
28
+ script = $0
29
+ args = ARGV
30
+
31
+ # Construct the command that dagger should run
32
+ ruby_cmd = [ "ruby", script, *args ].join(" ")
33
+
34
+ # Run dagger with our command
35
+ cmd = [ "dagger", "run", ruby_cmd ].join(" ")
36
+
37
+ # Execute the command
38
+ exec(cmd)
39
+ end
40
+ end
41
+ end
42
+ end
metadata ADDED
@@ -0,0 +1,93 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: dagger_ruby
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Gaurav Tiwari
8
+ bindir: exe
9
+ cert_chain: []
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: json
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - "~>"
17
+ - !ruby/object:Gem::Version
18
+ version: '2.6'
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - "~>"
24
+ - !ruby/object:Gem::Version
25
+ version: '2.6'
26
+ - !ruby/object:Gem::Dependency
27
+ name: base64
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - "~>"
31
+ - !ruby/object:Gem::Version
32
+ version: '0.1'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '0.1'
40
+ description: A Ruby SDK for Dagger that provides a simple interface to build and deploy
41
+ applications
42
+ email:
43
+ - gaurav@gauravtiwari.co.uk
44
+ executables: []
45
+ extensions: []
46
+ extra_rdoc_files: []
47
+ files:
48
+ - CHANGELOG.md
49
+ - LICENSE.txt
50
+ - README.md
51
+ - dagger_ruby.gemspec
52
+ - lib/dagger_ruby.rb
53
+ - lib/dagger_ruby/cache_volume.rb
54
+ - lib/dagger_ruby/client.rb
55
+ - lib/dagger_ruby/config.rb
56
+ - lib/dagger_ruby/container.rb
57
+ - lib/dagger_ruby/dagger_object.rb
58
+ - lib/dagger_ruby/directory.rb
59
+ - lib/dagger_ruby/errors.rb
60
+ - lib/dagger_ruby/file.rb
61
+ - lib/dagger_ruby/git_repository.rb
62
+ - lib/dagger_ruby/host.rb
63
+ - lib/dagger_ruby/query_builder.rb
64
+ - lib/dagger_ruby/secret.rb
65
+ - lib/dagger_ruby/service.rb
66
+ - lib/dagger_ruby/version.rb
67
+ homepage: https://github.com/boring-build/dagger-ruby
68
+ licenses:
69
+ - MIT
70
+ metadata:
71
+ allowed_push_host: https://rubygems.org
72
+ homepage_uri: https://github.com/boring-build/dagger-ruby
73
+ source_code_uri: https://github.com/boring-build/dagger-ruby
74
+ changelog_uri: https://github.com/boring-build/dagger-ruby/blob/main/CHANGELOG.md
75
+ rubygems_mfa_required: 'true'
76
+ rdoc_options: []
77
+ require_paths:
78
+ - lib
79
+ required_ruby_version: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - ">="
82
+ - !ruby/object:Gem::Version
83
+ version: 3.1.0
84
+ required_rubygems_version: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ requirements: []
90
+ rubygems_version: 3.6.9
91
+ specification_version: 4
92
+ summary: A Ruby SDK for Dagger
93
+ test_files: []