happi 0.2.0 → 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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 9dbbe19b69447b59fcdffc793300f8058b61d87e
4
- data.tar.gz: 1551a9532ba36b03ead3746239880e90eee83ccb
2
+ SHA256:
3
+ metadata.gz: 8af047b2bd93ef7975d0d19cac03998a5ffaba9e07932e68d3935d34d3d665f2
4
+ data.tar.gz: e235a40250203d1bc42d441354d59a1c648b121c41a328c1091bbbf0b03bd864
5
5
  SHA512:
6
- metadata.gz: 7812c0d9fc728a44e021a95914be86d03dce8e65136748258e3620c4e916d2916796a068e1f7eb947a49b897daac60cd2fc58cb9eb1ba68f866a31bad0c9e40e
7
- data.tar.gz: b34a4009a5fed72e54209ae705ef770ada24d74cd07c83aff7074252b45953ab37a7501a472e6cd9501470d5bdd6def8f0965918471422318e4fae2272b5d701
6
+ metadata.gz: 801e1f3019493f895448e75a509198c3e1d5ef486fff29d6666104a46ff6f981c7c74c743fd78f051e36924d871338aafca83141829fd7f71d5e99a335a092b5
7
+ data.tar.gz: eeee30b92a62a9f18effa0050b024d05bc3142467d2b8fc41c5c77e8b3e4a537d28ee860a49f3e961ee8bf8086417f674ea1bea0adfc4dd6b8f42c72930be79d
data/.gitignore CHANGED
@@ -1,5 +1,6 @@
1
1
  *.gem
2
2
  *.rbc
3
+ .DS_Store
3
4
  .bundle
4
5
  .config
5
6
  .yardoc
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 3.4.8
data/CHANGELOG.md ADDED
@@ -0,0 +1,90 @@
1
+ # Changelog
2
+ All notable changes to this project will be documented in this file.
3
+
4
+ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
5
+ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
6
+
7
+ ## [Unreleased]
8
+
9
+ ## [1.0.0] - 2026-08-12
10
+ Supersedes the `1.0.0-rc` and `1.0.0-rc2` pre-releases; everything below is relative
11
+ to 0.6.0.
12
+
13
+ ### Changed
14
+ - **BREAKING**: OAuth2 tokens are sent only as an `Authorization` header. `FaradayMiddleware::OAuth2`
15
+ defaulted to its `'param'` token type, which appended the token as an `access_token` query string
16
+ parameter *and* set an `Authorization: Token token="…"` header; that applied whenever `token_type`
17
+ was unset or explicitly `'param'`. Servers reading the token from the query string will no longer
18
+ receive it. The scheme now defaults to `Bearer` and is overridden by `token_type`; no header is set
19
+ when `oauth_token` is blank.
20
+ - **BREAKING**: `token_type` has changed meaning. It was a mode selector for
21
+ `FaradayMiddleware::OAuth2` accepting `'param'` or `'bearer'`; it is now interpolated verbatim as
22
+ the `Authorization` scheme. Two consequences for 0.6.0 consumers:
23
+ - `token_type: 'param'` produces the malformed header `Authorization: param <token>` and no query
24
+ parameter. There is no replacement for the query-string mode in 1.0.0 — remove the setting and
25
+ have the server read the token from the `Authorization` header. Tokens in query strings end up
26
+ in access logs, proxy caches and `Referer` headers, which is why the mode is gone.
27
+ - `token_type: 'bearer'` now emits `bearer <token>` where 0.6.0 normalised it to `Bearer <token>`.
28
+ Scheme names are case-insensitive per RFC 7235 §2.1, so conforming servers are unaffected.
29
+ - **BREAKING**: Removed the `oauth2`, `multi_json`, `faraday-follow_redirects` and `faraday-http`
30
+ dependencies. Applications using these directly must add them to their own Gemfile.
31
+ - **BREAKING**: Minimum Ruby is now 3.2.0.
32
+ - Replaced `activemodel` with `activesupport` - only ActiveSupport features were used.
33
+ - Widened `faraday` to `>= 1.10.0` and `mime-types` to `>= 2.4.0`. Faraday 1.10 is the earliest
34
+ release that registers the `:json` request/response middleware this gem relies on.
35
+ - Packaged gem now contains only runtime files. Specs (and their 2MB fixture), research notes and
36
+ CI/editor config are no longer shipped, taking the gem from ~2.1MB to ~14KB. The deprecated
37
+ `spec.test_files` directive was removed along with them.
38
+
39
+ ### Removed
40
+ - **BREAKING**: `Happi::Client#connection_options`. It built an options hash for
41
+ `FaradayMiddleware::OAuth2` and has had no callers since that middleware was dropped —
42
+ `#connection` never consulted it. Subclasses that overrode it were already having no effect.
43
+ - All `FaradayMiddleware` usage. The gem was never compatible with Faraday 2.x and was not a
44
+ declared dependency of Happi.
45
+ - Travis and Buildkite CI configuration, superseded by the GitHub Actions workflow (Buildkite
46
+ still provisioned Ruby 2.1.5).
47
+
48
+ ### Fixed
49
+ - Requests no longer fail with `NoMethodError: undefined method 'new' for JSON:Module`. The
50
+ connection passed the `::JSON` module itself to `f.use` as response middleware; it now uses
51
+ Faraday's built-in `:json` response middleware.
52
+ - `Happi::Client` requires `logger` itself rather than relying on Faraday to load it, which
53
+ raised `NameError: uninitialized constant Logger` under Faraday 1.x.
54
+ - JSON responses are parsed regardless of `use_json`, restoring 0.6.0 behaviour where
55
+ `ParseJson` was registered unconditionally. `use_json` selects the request encoding only -
56
+ JSON body versus multipart/url-encoded. In `1.0.0-rc2` response parsing was moved inside the
57
+ `use_json` branch, so clients on the default `use_json: false` received an unparsed `String`
58
+ body and raised `NoMethodError` on `with_indifferent_access`.
59
+
60
+ ### Added
61
+ - GitHub Actions workflow running the suite against Ruby 3.2, 3.3, 3.4 and 4.0.
62
+ - Dev container definition for local development.
63
+ - Substantially expanded specs covering the error hierarchy, file handling, configuration
64
+ isolation between base and derived clients, and round trips that exercise the real Faraday
65
+ middleware stack rather than a stubbed connection.
66
+ - Contributor documentation (`CLAUDE.md`, Copilot instructions) and Faraday 2.x migration notes
67
+ under `context/`.
68
+
69
+ ## [0.6.0] - 2024-11-13
70
+ ### Added
71
+ - Adds support for Ruby 3.2
72
+
73
+
74
+ ## [0.4.0] - 2019-03-05
75
+ ### Added
76
+ - Set original file names for multipart Happi files
77
+
78
+ [Unreleased]: https://github.com/rdytech/happi/compare/v1.0.0...HEAD
79
+ [1.0.0]: https://github.com/rdytech/happi/compare/v0.6.0...v1.0.0
80
+ [0.6.0]: https://github.com/rdytech/happi/compare/v0.4.0...v0.6.0
81
+ [0.4.0]: https://github.com/rdytech/happi/compare/v0.3.0...v0.4.0
82
+
83
+
84
+ ## [0.3.0] - 2018-02-23
85
+ ### Added
86
+ - Ability to set `token_type` in configuration and pass this into `FaradayMiddleware::OAuth2` to avoid `faraday_middleware` 0.11.0 warning about using the default token type. Set `token_type: 'bearer'` to only pass the oauth token as an Authorization header instead of both a header and query string parameter.
87
+ - This CHANGELOG.
88
+
89
+ [Unreleased]: https://github.com/rdytech/happi/compare/v0.3.0...HEAD
90
+ [0.3.0]: https://github.com/rdytech/happi/compare/v0.2.0...v0.3.0
data/CLAUDE.md ADDED
@@ -0,0 +1,108 @@
1
+ # CLAUDE.md
2
+
3
+ This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
4
+
5
+ ## What this is
6
+
7
+ `happi` is a small Ruby gem (~200 LOC in `lib/`) wrapping Faraday for RESTful APIs whose
8
+ URLs look like `https://host/api/v1/resource`. It is a library, not an app — there is
9
+ nothing to run, only specs.
10
+
11
+ ## Commands
12
+
13
+ ```bash
14
+ bundle install
15
+ bundle exec rspec # full suite
16
+ bundle exec rake spec # what CI runs
17
+ bundle exec rspec spec/client_spec.rb # single file
18
+ bundle exec rspec spec/client_spec.rb:105 # single example by line
19
+ gem build happi.gemspec # build the .gem
20
+ ```
21
+
22
+ Ruby 3.4.8 (`.ruby-version`); gemspec requires >= 3.2.0; GitHub Actions matrix covers
23
+ 3.2 / 3.3 / 3.4 / 4.0. Note the system `ruby` on macOS is 2.6 and will fail — use a
24
+ version manager or the devcontainer (`mcr.microsoft.com/devcontainers/ruby:1-3.4-bullseye`).
25
+
26
+ No linter is wired up. `cane` is a dev dependency but has no rake task and no config.
27
+ SimpleCov runs automatically from `spec/spec_helper.rb` and writes to `coverage/` (gitignored).
28
+
29
+ `.buildkite/pipeline.yml` is dead — its script pins rbenv 2.1.5. CI of record is
30
+ `.github/workflows/ruby.yml`.
31
+
32
+ ## Architecture
33
+
34
+ Five files, loaded in order by `lib/happi.rb`: `version`, `error`, `configuration`,
35
+ `client`, `file`.
36
+
37
+ ### Config resolution is class-ivar based, and does NOT inherit
38
+
39
+ `Happi::Client.config` memoizes into `@global_config`, a **class-level instance variable**.
40
+ Subclasses get their own `@global_config`, initialized from `Happi::Configuration.defaults`
41
+ — they do *not* copy the parent's configured values. `Happi::Client#config` is
42
+ `self.class.config.dup` (shallow), so per-instance overrides via
43
+ `MyClient.new(host: ..., oauth_token: ...)` never leak back to the class.
44
+
45
+ Consequence, and the reason README leads with it: configuring `Happi::Client` itself is
46
+ global state shared by every consumer that hasn't subclassed. Always subclass. The
47
+ isolation matrix in `spec/client_spec.rb` (base vs derived × class vs instance) exists to
48
+ pin this down — preserve it when touching `config`.
49
+
50
+ ### Request path
51
+
52
+ `get/post/patch/delete` → `param_check(params)` → `call` → `connection.send(method, ...)`
53
+ → raise on mapped status → `.body.with_indifferent_access`.
54
+
55
+ - `url(resource)` hardcodes the `/api/#{config.version}/` prefix. Callers pass only the
56
+ resource path.
57
+ - `param_check` recurses hashes and swaps any value responding to `#multipart` for
58
+ `value.multipart` — this is the sole hook that turns a `Happi::File` into a
59
+ `Faraday::UploadIO`. Duck-typed on purpose; don't narrow it to `is_a?(Happi::File)`.
60
+ - `connection` is memoized per instance. Mutating `client.config` after the first request
61
+ has no effect.
62
+
63
+ ### Faraday 2 migration (recent, load-bearing)
64
+
65
+ `FaradayMiddleware` is gone as of 1.0.0-rc2 — it was never compatible with Faraday 2.x and
66
+ was never actually a declared dependency. The OAuth2 Authorization header is now set by
67
+ hand in `connection`, only when `config.oauth_token.present?`, as
68
+ `"#{config.token_type.presence || 'Bearer'} #{config.oauth_token}"`. JSON uses Faraday's
69
+ built-in `:json` request/response middleware. `oauth2`, `multi_json`,
70
+ `faraday-follow_redirects`, and `faraday-http` were dropped; `activemodel` became
71
+ `activesupport`. Do not reintroduce `faraday_middleware`.
72
+
73
+ `token_type` is now interpolated verbatim as the auth scheme. In 0.6.0 it was a *mode*
74
+ selector for `FaradayMiddleware::OAuth2`, where `'param'` meant "send the token as an
75
+ `access_token` query parameter plus a `Token token="…"` header". That mode is gone —
76
+ `token_type: 'param'` now just emits the malformed header `Authorization: param <token>`.
77
+ Restoring it was considered for 1.0.0 and deliberately rejected; the breaking change is
78
+ documented in `CHANGELOG.md` for consumers to absorb. `context/TOKEN_TYPE_PARAM.md` is the
79
+ research behind that decision, not a work order.
80
+
81
+ `context/` holds the research notes from that migration (`faraday_2.x.md`,
82
+ `oauth2.md`, `FARADAY_2_COMPATIBILITY_REPORT.md`). Background reading, not specs.
83
+
84
+ ## Known traps
85
+
86
+ - **`config.port` and `config.timeout` are inert.** `connection` calls
87
+ `Faraday.new(config.host)` with no options hash. Port must be embedded in `host`.
88
+ - **Response parsing is gated on an exact `application/json` content type.** `connection`
89
+ registers `f.response :json, content_type: 'application/json'` unconditionally — that
90
+ part is not affected by `use_json`, which selects the *request* encoding only. But the
91
+ match is string equality against the bare type, so a server answering
92
+ `application/vnd.api+json`, `text/json`, or no `Content-Type` leaves the body a `String`,
93
+ and `String` has no `with_indifferent_access` — every `get`/`post`/`patch`/`delete` then
94
+ raises `NoMethodError`. Widen the `content_type:` option rather than reaching for
95
+ `use_json`.
96
+ - **Error messages are static.** `Happi::Error` subclasses override `#message` with fixed
97
+ strings, discarding the API body passed to `new`. The real payload is only reachable via
98
+ `error.response`. Also `TooManyRequests` (429) is nested under `ServerError`, not
99
+ `ClientError`.
100
+ - **`Happi::Error::ServiceableErrors` is unreachable code.** `included` references
101
+ `::NestedError` (top-level) while the class is defined at
102
+ `ServiceableErrors::NestedError`, and its `initialize` defaults `original` to `$1`.
103
+ Nothing includes it; leave it alone unless deliberately fixing it.
104
+ - **`.github/copilot-instructions.md` is stale.** It still documents `oauth2`,
105
+ `activemodel`, and `FaradayMiddleware::OAuth2` as current. Prefer this file and the
106
+ gemspec.
107
+ - `Gemfile.lock` is gitignored (library gem) though present locally. `Gemfile.rails32` /
108
+ `Gemfile.rails41` are historical and unusable on the supported Ruby versions.
data/happi.gemspec CHANGED
@@ -10,22 +10,25 @@ Gem::Specification.new do |spec|
10
10
  spec.email = ["john.dagostino@gmail.com"]
11
11
  spec.description = %q{Simple faraday client preconfigured}
12
12
  spec.summary = %q{Simple faraday client wrapper preconfigured for specific usecase}
13
- spec.homepage = "http://github.com/jobready/happi"
13
+ spec.homepage = "https://github.com/rdytech/happi"
14
14
  spec.license = "MIT"
15
+ spec.required_ruby_version = '>= 3.2.0'
15
16
 
16
- spec.files = `git ls-files`.split($/)
17
+ # Ship only what a consumer needs at runtime. Specs (and their 2MB fixture),
18
+ # research notes and CI/editor config stay in the repo but out of the gem.
19
+ excluded_prefixes = %w[spec/ context/ .github/ .devcontainer/]
20
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
21
+ f.start_with?(*excluded_prefixes) || f.end_with?('.gem')
22
+ end
17
23
  spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
- spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
24
  spec.require_paths = ["lib"]
20
25
 
21
- spec.add_dependency 'faraday', '~> 0.9'
22
- spec.add_dependency 'faraday_middleware', '~> 0.9'
23
- spec.add_dependency 'activemodel', '>= 3.2'
24
- spec.add_dependency 'oauth2', '~> 1.0'
25
- spec.add_dependency 'mime-types', '>= 1.1.6'
26
- spec.add_dependency 'multi_json', '~> 1.3'
26
+ spec.add_dependency 'faraday', '>= 1.10.0'
27
+ spec.add_dependency 'faraday-multipart', '~> 1.1'
28
+ spec.add_dependency 'activesupport', '>= 6.0'
29
+ spec.add_dependency 'mime-types', '>= 2.4.0'
27
30
 
28
- spec.add_development_dependency 'bundler', '~> 1.3'
31
+ spec.add_development_dependency 'bundler', '>= 2.0'
29
32
  spec.add_development_dependency 'simplecov'
30
33
  spec.add_development_dependency 'cane'
31
34
  spec.add_development_dependency 'rake'
data/lib/happi/client.rb CHANGED
@@ -1,5 +1,6 @@
1
+ require 'logger'
1
2
  require 'faraday'
2
- require 'faraday_middleware'
3
+ require 'faraday/multipart'
3
4
  require 'active_support/core_ext/string/inflections'
4
5
  require 'active_support/core_ext/hash'
5
6
 
@@ -94,13 +95,19 @@ class Happi::Client
94
95
 
95
96
  def connection
96
97
  @connection ||= Faraday.new(config.host) do |f|
97
- f.use FaradayMiddleware::OAuth2, config.oauth_token
98
- f.use FaradayMiddleware::ParseJson, content_type: 'application/json'
98
+ # Set OAuth2 Authorization header
99
+ if config.oauth_token.present?
100
+ token_type = config.token_type.presence || 'Bearer'
101
+ f.headers['Authorization'] = "#{token_type} #{config.oauth_token}"
102
+ end
103
+
104
+ # Responses are parsed regardless of use_json, matching the unconditional
105
+ # FaradayMiddleware::ParseJson of 0.6.0. use_json only selects the request
106
+ # encoding - JSON body vs multipart/url-encoded.
107
+ f.response :json, content_type: 'application/json'
99
108
 
100
109
  if self.config.use_json
101
- f.use FaradayMiddleware::EncodeJson
102
110
  f.request :json
103
- f.response :json
104
111
  else
105
112
  f.request :multipart
106
113
  f.request :url_encoded
@@ -1,16 +1,23 @@
1
1
  class Happi::Configuration
2
2
  def self.defaults
3
- {
4
- host: 'http://localhost:8080',
5
- port: 443,
6
- timeout: 60,
7
- version: 'v1',
8
- use_json: false,
9
- log_level: :info
3
+ {
4
+ host: 'http://localhost:8080',
5
+ port: 443,
6
+ timeout: 60,
7
+ version: 'v1',
8
+ use_json: false,
9
+ log_level: :info
10
10
  }
11
11
  end
12
12
 
13
- attr_accessor :oauth_token, :host, :port, :timeout, :version, :use_json, :log_level
13
+ attr_accessor :oauth_token,
14
+ :host,
15
+ :port,
16
+ :timeout,
17
+ :version,
18
+ :use_json,
19
+ :log_level,
20
+ :token_type
14
21
 
15
22
  def initialize(options = {})
16
23
  self.class.defaults.merge(options).each do |key, value|
data/lib/happi/file.rb CHANGED
@@ -1,8 +1,11 @@
1
1
  require 'mime/types'
2
+ require 'base64'
3
+ require 'faraday/multipart'
2
4
 
3
5
  class Happi::File
4
6
  attr_accessor :file_name
5
7
  attr_accessor :mime_type
8
+ attr_accessor :original_filename
6
9
 
7
10
  def initialize(file)
8
11
  if file.is_a?(String)
@@ -11,15 +14,16 @@ class Happi::File
11
14
  else
12
15
  @mime_type = file.content_type
13
16
  @file_name = file.path
17
+ @original_filename = file.original_filename
14
18
  end
15
19
  end
16
20
 
17
21
  def exists?
18
- File.exists?(file_name)
22
+ File.exist?(file_name)
19
23
  end
20
24
 
21
25
  def multipart
22
- Faraday::UploadIO.new(file_name, mime_type) if exists?
26
+ Faraday::UploadIO.new(file_name, mime_type, original_filename) if exists?
23
27
  end
24
28
 
25
29
  def encode_file
data/lib/happi/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Happi
2
- VERSION = '0.2.0'
2
+ VERSION = '1.0.0'
3
3
  end
metadata CHANGED
@@ -1,113 +1,84 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: happi
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - John D'Agostino
8
- autorequire:
9
8
  bindir: bin
10
9
  cert_chain: []
11
- date: 2015-07-13 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
13
  name: faraday
15
14
  requirement: !ruby/object:Gem::Requirement
16
15
  requirements:
17
- - - "~>"
16
+ - - ">="
18
17
  - !ruby/object:Gem::Version
19
- version: '0.9'
18
+ version: 1.10.0
20
19
  type: :runtime
21
20
  prerelease: false
22
21
  version_requirements: !ruby/object:Gem::Requirement
23
22
  requirements:
24
- - - "~>"
23
+ - - ">="
25
24
  - !ruby/object:Gem::Version
26
- version: '0.9'
25
+ version: 1.10.0
27
26
  - !ruby/object:Gem::Dependency
28
- name: faraday_middleware
27
+ name: faraday-multipart
29
28
  requirement: !ruby/object:Gem::Requirement
30
29
  requirements:
31
30
  - - "~>"
32
31
  - !ruby/object:Gem::Version
33
- version: '0.9'
32
+ version: '1.1'
34
33
  type: :runtime
35
34
  prerelease: false
36
35
  version_requirements: !ruby/object:Gem::Requirement
37
36
  requirements:
38
37
  - - "~>"
39
38
  - !ruby/object:Gem::Version
40
- version: '0.9'
39
+ version: '1.1'
41
40
  - !ruby/object:Gem::Dependency
42
- name: activemodel
41
+ name: activesupport
43
42
  requirement: !ruby/object:Gem::Requirement
44
43
  requirements:
45
44
  - - ">="
46
45
  - !ruby/object:Gem::Version
47
- version: '3.2'
46
+ version: '6.0'
48
47
  type: :runtime
49
48
  prerelease: false
50
49
  version_requirements: !ruby/object:Gem::Requirement
51
50
  requirements:
52
51
  - - ">="
53
52
  - !ruby/object:Gem::Version
54
- version: '3.2'
55
- - !ruby/object:Gem::Dependency
56
- name: oauth2
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - "~>"
60
- - !ruby/object:Gem::Version
61
- version: '1.0'
62
- type: :runtime
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - "~>"
67
- - !ruby/object:Gem::Version
68
- version: '1.0'
53
+ version: '6.0'
69
54
  - !ruby/object:Gem::Dependency
70
55
  name: mime-types
71
56
  requirement: !ruby/object:Gem::Requirement
72
57
  requirements:
73
58
  - - ">="
74
59
  - !ruby/object:Gem::Version
75
- version: 1.1.6
60
+ version: 2.4.0
76
61
  type: :runtime
77
62
  prerelease: false
78
63
  version_requirements: !ruby/object:Gem::Requirement
79
64
  requirements:
80
65
  - - ">="
81
66
  - !ruby/object:Gem::Version
82
- version: 1.1.6
83
- - !ruby/object:Gem::Dependency
84
- name: multi_json
85
- requirement: !ruby/object:Gem::Requirement
86
- requirements:
87
- - - "~>"
88
- - !ruby/object:Gem::Version
89
- version: '1.3'
90
- type: :runtime
91
- prerelease: false
92
- version_requirements: !ruby/object:Gem::Requirement
93
- requirements:
94
- - - "~>"
95
- - !ruby/object:Gem::Version
96
- version: '1.3'
67
+ version: 2.4.0
97
68
  - !ruby/object:Gem::Dependency
98
69
  name: bundler
99
70
  requirement: !ruby/object:Gem::Requirement
100
71
  requirements:
101
- - - "~>"
72
+ - - ">="
102
73
  - !ruby/object:Gem::Version
103
- version: '1.3'
74
+ version: '2.0'
104
75
  type: :development
105
76
  prerelease: false
106
77
  version_requirements: !ruby/object:Gem::Requirement
107
78
  requirements:
108
- - - "~>"
79
+ - - ">="
109
80
  - !ruby/object:Gem::Version
110
- version: '1.3'
81
+ version: '2.0'
111
82
  - !ruby/object:Gem::Dependency
112
83
  name: simplecov
113
84
  requirement: !ruby/object:Gem::Requirement
@@ -186,7 +157,9 @@ extensions: []
186
157
  extra_rdoc_files: []
187
158
  files:
188
159
  - ".gitignore"
189
- - ".travis.yml"
160
+ - ".ruby-version"
161
+ - CHANGELOG.md
162
+ - CLAUDE.md
190
163
  - Gemfile
191
164
  - Gemfile.rails32
192
165
  - Gemfile.rails41
@@ -200,18 +173,10 @@ files:
200
173
  - lib/happi/error.rb
201
174
  - lib/happi/file.rb
202
175
  - lib/happi/version.rb
203
- - script/buildkite.sh
204
- - spec/client_spec.rb
205
- - spec/configuration_spec.rb
206
- - spec/error_spec.rb
207
- - spec/file_spec.rb
208
- - spec/fixtures/award.docx
209
- - spec/spec_helper.rb
210
- homepage: http://github.com/jobready/happi
176
+ homepage: https://github.com/rdytech/happi
211
177
  licenses:
212
178
  - MIT
213
179
  metadata: {}
214
- post_install_message:
215
180
  rdoc_options: []
216
181
  require_paths:
217
182
  - lib
@@ -219,23 +184,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
219
184
  requirements:
220
185
  - - ">="
221
186
  - !ruby/object:Gem::Version
222
- version: '0'
187
+ version: 3.2.0
223
188
  required_rubygems_version: !ruby/object:Gem::Requirement
224
189
  requirements:
225
190
  - - ">="
226
191
  - !ruby/object:Gem::Version
227
192
  version: '0'
228
193
  requirements: []
229
- rubyforge_project:
230
- rubygems_version: 2.4.7
231
- signing_key:
194
+ rubygems_version: 4.0.6
232
195
  specification_version: 4
233
196
  summary: Simple faraday client wrapper preconfigured for specific usecase
234
- test_files:
235
- - spec/client_spec.rb
236
- - spec/configuration_spec.rb
237
- - spec/error_spec.rb
238
- - spec/file_spec.rb
239
- - spec/fixtures/award.docx
240
- - spec/spec_helper.rb
241
- has_rdoc:
197
+ test_files: []
data/.travis.yml DELETED
@@ -1,12 +0,0 @@
1
- language: ruby
2
- rvm:
3
- - 2.1.1
4
- - 2.0.0
5
- gemfile:
6
- - Gemfile.rails41
7
- - Gemfile.rails32
8
- - Gemfile
9
- branches:
10
- only:
11
- - develop
12
- - master
data/script/buildkite.sh DELETED
@@ -1,19 +0,0 @@
1
- #!/bin/bash
2
- set -e
3
-
4
- REVISION=https://github.com/$BUILDBOX_PROJECT_SLUG/commit/$BUILDBOX_COMMIT
5
-
6
- echo '--- setting ruby version'
7
- rbenv local 2.1.5
8
-
9
- echo '--- bundling'
10
- bundle install -j $(nproc) --without development production --quiet
11
-
12
- echo '--- running specs'
13
- if bundle exec rspec; then
14
- echo "[Successful] $BUILDBOX_PROJECT_SLUG - Build - $BUILDBOX_BUILD_URL - Commit - $REVISION" | hipchat_room_message -t $HIPCHAT_TOKEN -r $HIPCHAT_ROOM -f "Buildbox" -c "green"
15
- else
16
- echo "[Failed] Build $BUILDBOX_PROJECT_SLUG - Build - $BUILDBOX_BUILD_URL - Commit - $REVISION" | hipchat_room_message -t $HIPCHAT_TOKEN -r $HIPCHAT_ROOM -f "Buildbox" -c "red"
17
- exit 1;
18
- fi
19
-
data/spec/client_spec.rb DELETED
@@ -1,82 +0,0 @@
1
- require 'spec_helper'
2
-
3
- class DerivedClient < Happi::Client; end
4
-
5
- describe Happi::Client do
6
- describe '.new' do
7
- let(:default_port) { Happi::Configuration.defaults[:port] }
8
- let(:class_level_port) { 80 }
9
- let(:instance_level_port) { 8080 }
10
- let(:derived_class_level_port) { 8081 }
11
- let(:config_port) { described_class.new.config.port }
12
- let(:derived_config_port) { DerivedClient.new.config.port }
13
-
14
- context 'with no supplied config' do
15
- it 'uses the default config for the base class' do
16
- expect(config_port).to eq(default_port)
17
- end
18
-
19
- it 'uses the default config for the derived class' do
20
- expect(derived_config_port).to eq(default_port)
21
- end
22
- end
23
-
24
- context 'with class level config for the base class' do
25
- before do
26
- described_class.configure { |config| config.port = class_level_port }
27
- end
28
-
29
- it 'overrides the default config for the base class' do
30
- expect(config_port).to eq(class_level_port)
31
- end
32
-
33
- it 'does not override the default config for the derived class' do
34
- expect(derived_config_port).to_not eq(class_level_port)
35
- end
36
- end
37
-
38
- context 'with class level config for the derived class' do
39
- before do
40
- DerivedClient.configure { |config| config.port = derived_class_level_port }
41
- end
42
-
43
- it 'does not affect the config for the base class' do
44
- expect(config_port).to_not eq(derived_class_level_port)
45
- end
46
-
47
- it 'overrides the default config for the derived class' do
48
- expect(derived_config_port).to eq(derived_class_level_port)
49
- end
50
- end
51
-
52
- context 'with instance level config for the base class' do
53
- before do
54
- described_class.configure { |config| config.port = class_level_port }
55
- end
56
-
57
- it 'overrides the class config for only that base class instance' do
58
- expect(Happi::Client.new(port: instance_level_port).config.port).to eq(instance_level_port)
59
- expect(config_port).to_not eq(instance_level_port)
60
- end
61
-
62
- it 'does not affect the config for an instance of the derived class' do
63
- expect(derived_config_port).to_not eq(instance_level_port)
64
- end
65
- end
66
-
67
- context 'with instance level config for the derived class' do
68
- before do
69
- described_class.configure { |config| config.port = class_level_port }
70
- end
71
-
72
- it 'does not affect the config for an instance of the base class' do
73
- expect(config_port).to_not eq(instance_level_port)
74
- end
75
-
76
- it 'overrides the class config for only that derived class instance' do
77
- expect(DerivedClient.new(port: instance_level_port).config.port).to eq(instance_level_port)
78
- expect(derived_config_port).to_not eq(instance_level_port)
79
- end
80
- end
81
- end
82
- end
@@ -1,13 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Happi::Configuration do
4
- describe 'options' do
5
- specify { expect(Happi::Configuration.new(host: 'http://www.google.com').host).to eql('http://www.google.com') }
6
- specify { expect(Happi::Configuration.new(port: 80).port).to eql(80) }
7
-
8
- specify do
9
- Happi::Client.configure { |config| config.host = 'http://localhost:3000' }
10
- expect(Happi::Client.config.host).to eq 'http://localhost:3000'
11
- end
12
- end
13
- end
data/spec/error_spec.rb DELETED
@@ -1,17 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Happi::Error do
4
- describe '.new' do
5
- context 'with 1 argument' do
6
- let(:error) { Happi::Error.new('message') }
7
- specify { expect(error.message).to eq('message') }
8
- specify { expect(error.response).to be nil }
9
- end
10
-
11
- context 'with 2 arguments' do
12
- let(:error) { Happi::Error.new('message', 'response') }
13
- specify { expect(error.message).to eq('message') }
14
- specify { expect(error.response).to eq('response') }
15
- end
16
- end
17
- end
data/spec/file_spec.rb DELETED
@@ -1,46 +0,0 @@
1
- require 'spec_helper'
2
- require 'rack/test'
3
-
4
- describe Happi::File do
5
- context "with a file name" do
6
- subject { Happi::File.new(__FILE__) }
7
-
8
- describe '#encode_file' do
9
- encoded = Base64.encode64(File.read(__FILE__))
10
- specify { expect(subject.encode_file).to eql(encoded) }
11
- end
12
-
13
- describe '#mime_type' do
14
- specify { expect(subject.mime_type).to eql('application/x-ruby') }
15
- end
16
-
17
- describe '#multipart' do
18
- # specify { expect(subject.multipart).to }
19
- end
20
-
21
- describe '#exists?' do
22
- specify { expect(subject.exists?).to eq(true) }
23
- end
24
- end
25
-
26
- context "with an ActionDispatch::Http::UploadedFile" do
27
- subject { Happi::File.new(Rack::Test::UploadedFile.new(__FILE__, 'application/x-ruby')) }
28
-
29
- describe '#encode_file' do
30
- encoded = Base64.encode64(File.read(__FILE__))
31
- specify { expect(subject.encode_file).to eql(encoded) }
32
- end
33
-
34
- describe '#mime_type' do
35
- specify { expect(subject.mime_type).to eql('application/x-ruby') }
36
- end
37
-
38
- describe '#multipart' do
39
- # specify { expect(subject.multipart).to }
40
- end
41
-
42
- describe '#exists?' do
43
- specify { expect(subject.exists?).to eq(true) }
44
- end
45
- end
46
- end
Binary file
data/spec/spec_helper.rb DELETED
@@ -1,12 +0,0 @@
1
- require 'simplecov'
2
- SimpleCov.start
3
-
4
- $LOAD_PATH.unshift File.join(File.dirname(__FILE__), *%w[.. lib])
5
-
6
- require 'rspec'
7
- require 'happi'
8
-
9
- Dir[File.expand_path('../../spec/support/**/*.rb', __FILE__)].map(&method(:require))
10
-
11
- RSpec.configure do |config|
12
- end