webfunction 1.0.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,67 @@
1
+ # frozen_string_literal: true
2
+
3
+ module WebFunction
4
+ # Internal utility methods.
5
+ #
6
+ # @api private
7
+ #
8
+ module Utils
9
+ module_function
10
+
11
+ # Normalizes a collection. Yields each item to the block if a block is given, otherwise returns the item.
12
+ # Any `nil` items are removed.
13
+ #
14
+ # @param collection [Array] The collection to normalize
15
+ #
16
+ # @return [Array] The normalized array
17
+ #
18
+ def normalize_array(collection)
19
+ unless collection.is_a?(Array)
20
+ return []
21
+ end
22
+
23
+ items = collection.map do |item|
24
+ if block_given?
25
+ yield item
26
+ else
27
+ item
28
+ end
29
+ end
30
+
31
+ items.compact
32
+ end
33
+
34
+ # Normalizes an array of strings. Uses #normalize_array under the hood.
35
+ #
36
+ # @param collection [Array] The collection to normalize
37
+ #
38
+ # @return [Array] The normalized array
39
+ #
40
+ def normalize_array_of_strings(collection)
41
+ normalize_array(collection) { |item| item.to_s }
42
+ end
43
+
44
+ def get_body_from_url(url, extra_query_params: {})
45
+ url = add_query_params(url, extra_query_params)
46
+ response = ::Excon.get(url, headers: {
47
+ "User-Agent": "webfunction/#{::WebFunction::VERSION}",
48
+ "Accept-Encoding": "gzip",
49
+ })
50
+
51
+ response.body
52
+ end
53
+
54
+ def add_query_params(url, params = {})
55
+ uri = ::URI.parse(url)
56
+ existing_params = ::URI.decode_www_form(uri.query || "").to_h
57
+ new_params = params.reject { |_, value| value.nil? }.transform_keys(&:to_s)
58
+ merged_params = existing_params.merge(new_params)
59
+
60
+ unless merged_params.empty?
61
+ uri.query = ::URI.encode_www_form(merged_params)
62
+ end
63
+
64
+ uri.to_s
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module WebFunction
4
+ VERSION = "1.0.0"
5
+ end
@@ -0,0 +1,52 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "excon"
4
+ require "json"
5
+ require "uri"
6
+
7
+ require_relative "webfunction/version"
8
+ require_relative "webfunction/request"
9
+ require_relative "webfunction/page"
10
+ require_relative "webfunction/client"
11
+ require_relative "webfunction/flaggable"
12
+ require_relative "webfunction/package"
13
+ require_relative "webfunction/endpoint"
14
+ require_relative "webfunction/argument"
15
+ require_relative "webfunction/attribute"
16
+ require_relative "webfunction/object_schema"
17
+ require_relative "webfunction/documented_error"
18
+ require_relative "webfunction/pipeline"
19
+ require_relative "webfunction/promise"
20
+ require_relative "webfunction/type"
21
+ require_relative "webfunction/utils"
22
+
23
+ module WebFunction
24
+ # A base error class for WebFunction. All errors inherit from this class.
25
+ #
26
+ # @api private
27
+ #
28
+ class Error < StandardError
29
+ attr_reader :code, :details
30
+
31
+ def initialize(message = nil, code: self.class.error_code, details: nil)
32
+ super(message)
33
+ @code = code
34
+ @details = details
35
+ end
36
+
37
+ # Returns the error code for the error. Used as default error code if no code is provided.
38
+ #
39
+ # @return [String] The error code
40
+ #
41
+ def self.error_code
42
+ name.sub(/^WebFunction::/, "WFN_")
43
+ .gsub(/([a-z\d])([A-Z])/, '\1_\2')
44
+ .upcase
45
+ end
46
+ end
47
+
48
+ UnresolvedPromiseError = Class.new(Error)
49
+ UnexpectedStatusCodeError = Class.new(Error)
50
+ JsonParseError = Class.new(Error)
51
+ BadRequestError = Class.new(Error)
52
+ end
@@ -0,0 +1,4 @@
1
+ module WebFunction
2
+ VERSION: String
3
+ # See the writing guide of rbs: https://github.com/ruby/rbs#guides
4
+ end
metadata ADDED
@@ -0,0 +1,131 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: webfunction
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Robin Clart
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: irb
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - ">="
17
+ - !ruby/object:Gem::Version
18
+ version: '0'
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - ">="
24
+ - !ruby/object:Gem::Version
25
+ version: '0'
26
+ - !ruby/object:Gem::Dependency
27
+ name: logger
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: '0'
40
+ - !ruby/object:Gem::Dependency
41
+ name: excon
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '1.2'
47
+ type: :runtime
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '1.2'
54
+ - !ruby/object:Gem::Dependency
55
+ name: json
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '2.10'
61
+ type: :runtime
62
+ prerelease: false
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '2.10'
68
+ description: 'A lightweight Web Function client for Ruby. Web Function is a radical
69
+ rethinking of API design: no verbs, no nested URLs, no bloat. Just function calls
70
+ over HTTP. This gem lets you invoke endpoints defined in a package, with full support
71
+ for argument validations, error triples, and bearer auth.'
72
+ email:
73
+ - robin@clart.be
74
+ executables: []
75
+ extensions: []
76
+ extra_rdoc_files: []
77
+ files:
78
+ - ".rubocop.yml"
79
+ - CHANGELOG.md
80
+ - LICENSE.txt
81
+ - README.md
82
+ - Rakefile
83
+ - lib/web_function.rb
84
+ - lib/webfunction.rb
85
+ - lib/webfunction/argument.rb
86
+ - lib/webfunction/attribute.rb
87
+ - lib/webfunction/client.rb
88
+ - lib/webfunction/documented_error.rb
89
+ - lib/webfunction/endpoint.rb
90
+ - lib/webfunction/flaggable.rb
91
+ - lib/webfunction/object_schema.rb
92
+ - lib/webfunction/package.rb
93
+ - lib/webfunction/page.rb
94
+ - lib/webfunction/pipeline.rb
95
+ - lib/webfunction/promise.rb
96
+ - lib/webfunction/request.rb
97
+ - lib/webfunction/type.rb
98
+ - lib/webfunction/type/any.rb
99
+ - lib/webfunction/type/array_of.rb
100
+ - lib/webfunction/type/base.rb
101
+ - lib/webfunction/type/union.rb
102
+ - lib/webfunction/utils.rb
103
+ - lib/webfunction/version.rb
104
+ - sig/webfunction.rbs
105
+ homepage: https://github.com/webfunction-protocol/webfunction-ruby
106
+ licenses:
107
+ - MIT
108
+ metadata:
109
+ allowed_push_host: https://rubygems.org
110
+ homepage_uri: https://github.com/webfunction-protocol/webfunction-ruby
111
+ source_code_uri: https://github.com/webfunction-protocol/webfunction-ruby
112
+ changelog_uri: https://github.com/webfunction-protocol/webfunction-ruby/blob/main/CHANGELOG.md
113
+ rubygems_mfa_required: 'true'
114
+ rdoc_options: []
115
+ require_paths:
116
+ - lib
117
+ required_ruby_version: !ruby/object:Gem::Requirement
118
+ requirements:
119
+ - - ">="
120
+ - !ruby/object:Gem::Version
121
+ version: 3.1.0
122
+ required_rubygems_version: !ruby/object:Gem::Requirement
123
+ requirements:
124
+ - - ">="
125
+ - !ruby/object:Gem::Version
126
+ version: '0'
127
+ requirements: []
128
+ rubygems_version: 3.6.9
129
+ specification_version: 4
130
+ summary: A Web Function Client for Ruby
131
+ test_files: []