nexus-invision 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.
Files changed (66) hide show
  1. checksums.yaml +7 -0
  2. data/.rubocop.yml +2 -0
  3. data/Gemfile +21 -0
  4. data/Gemfile.lock +110 -0
  5. data/README.md +55 -0
  6. data/Rakefile +4 -0
  7. data/lib/nexus/invision/client.rb +177 -0
  8. data/lib/nexus/invision/errors/bad_request.rb +24 -0
  9. data/lib/nexus/invision/errors/client_error.rb +23 -0
  10. data/lib/nexus/invision/errors/unexpected_response.rb +13 -0
  11. data/lib/nexus/invision/requests/add_member_to_secondary_group.rb +18 -0
  12. data/lib/nexus/invision/requests/create_forum_topic.rb +22 -0
  13. data/lib/nexus/invision/requests/create_member_warning.rb +22 -0
  14. data/lib/nexus/invision/requests/remove_member_from_secondary_group.rb +18 -0
  15. data/lib/nexus/invision/resources/login_link.rb +17 -0
  16. data/lib/nexus/invision/resources/topic.rb +17 -0
  17. data/lib/nexus/invision/resources/user.rb +17 -0
  18. data/lib/nexus/invision/resources/warning.rb +17 -0
  19. data/lib/nexus/invision/value_object.rb +28 -0
  20. data/lib/nexus/invision/version.rb +9 -0
  21. data/nexus-invision.gemspec +33 -0
  22. data/sorbet/config +4 -0
  23. data/sorbet/rbi/annotations/.gitattributes +1 -0
  24. data/sorbet/rbi/annotations/faraday.rbi +17 -0
  25. data/sorbet/rbi/annotations/rainbow.rbi +269 -0
  26. data/sorbet/rbi/gems/.gitattributes +1 -0
  27. data/sorbet/rbi/gems/ast@2.4.2.rbi +584 -0
  28. data/sorbet/rbi/gems/base64@0.1.1.rbi +172 -0
  29. data/sorbet/rbi/gems/diff-lcs@1.5.0.rbi +1083 -0
  30. data/sorbet/rbi/gems/erubi@1.12.0.rbi +145 -0
  31. data/sorbet/rbi/gems/faraday-net_http@3.0.2.rbi +146 -0
  32. data/sorbet/rbi/gems/faraday@2.7.11.rbi +2903 -0
  33. data/sorbet/rbi/gems/json@2.6.3.rbi +1533 -0
  34. data/sorbet/rbi/gems/language_server-protocol@3.17.0.3.rbi +14237 -0
  35. data/sorbet/rbi/gems/netrc@0.11.0.rbi +158 -0
  36. data/sorbet/rbi/gems/parallel@1.23.0.rbi +273 -0
  37. data/sorbet/rbi/gems/parser@3.2.2.4.rbi +5451 -0
  38. data/sorbet/rbi/gems/prettier_print@1.2.1.rbi +951 -0
  39. data/sorbet/rbi/gems/prism@0.15.1.rbi +23922 -0
  40. data/sorbet/rbi/gems/racc@1.7.1.rbi +161 -0
  41. data/sorbet/rbi/gems/rainbow@3.1.1.rbi +402 -0
  42. data/sorbet/rbi/gems/rake@13.1.0.rbi +3027 -0
  43. data/sorbet/rbi/gems/rbi@0.1.2.rbi +2922 -0
  44. data/sorbet/rbi/gems/regexp_parser@2.8.2.rbi +3749 -0
  45. data/sorbet/rbi/gems/rexml@3.2.6.rbi +4781 -0
  46. data/sorbet/rbi/gems/rspec-core@3.12.2.rbi +10910 -0
  47. data/sorbet/rbi/gems/rspec-expectations@3.12.3.rbi +8100 -0
  48. data/sorbet/rbi/gems/rspec-mocks@3.12.6.rbi +5310 -0
  49. data/sorbet/rbi/gems/rspec-support@3.12.1.rbi +1609 -0
  50. data/sorbet/rbi/gems/rspec@3.12.0.rbi +82 -0
  51. data/sorbet/rbi/gems/rubocop-ast@1.30.0.rbi +7003 -0
  52. data/sorbet/rbi/gems/rubocop-shopify@2.14.0.rbi +8 -0
  53. data/sorbet/rbi/gems/rubocop@1.57.2.rbi +56813 -0
  54. data/sorbet/rbi/gems/ruby-progressbar@1.13.0.rbi +1317 -0
  55. data/sorbet/rbi/gems/ruby2_keywords@0.0.5.rbi +8 -0
  56. data/sorbet/rbi/gems/spoom@1.2.4.rbi +3777 -0
  57. data/sorbet/rbi/gems/syntax_tree@6.2.0.rbi +23136 -0
  58. data/sorbet/rbi/gems/tapioca@0.11.9.rbi +3496 -0
  59. data/sorbet/rbi/gems/thor@1.3.0.rbi +4345 -0
  60. data/sorbet/rbi/gems/unicode-display_width@2.5.0.rbi +65 -0
  61. data/sorbet/rbi/gems/yard-sorbet@0.8.1.rbi +428 -0
  62. data/sorbet/rbi/gems/yard@0.9.34.rbi +18219 -0
  63. data/sorbet/rbi/todo.rbi +5 -0
  64. data/sorbet/tapioca/config.yml +13 -0
  65. data/sorbet/tapioca/require.rb +4 -0
  66. metadata +106 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 4b0350a4552d18c63a14afb7b050ce5601d30d925d61aed4a8c1d26a75c317d2
4
+ data.tar.gz: 8aa1f17d9fc4a5d0207fc2931b5de617c2f63b8dada69b262f1394a801d8af22
5
+ SHA512:
6
+ metadata.gz: 19446aee23a1c59eae6535d691cac9c094ea33b101b4e97556882815bbff707a8cb221e01bedd307b171911e4be287a4c723f8de7b1f16118974f1e3bb8c3875
7
+ data.tar.gz: 3477c056719ce9264016b6b09f3647c1d98f4b917056cfa86078ca8a4dfb6258030851a0ef6153e3301ea80dc2ee71b91a4769d8b3e3b54d94be06aba87e6820
data/.rubocop.yml ADDED
@@ -0,0 +1,2 @@
1
+ inherit_gem:
2
+ rubocop-shopify: rubocop.yml
data/Gemfile ADDED
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ source "https://rubygems.org"
4
+
5
+ # Specify your gem's dependencies in nexus-invision.gemspec
6
+ gemspec
7
+
8
+ gem "faraday", "~> 2.7"
9
+ gem "rake", "~> 13.0"
10
+ gem "sorbet-runtime"
11
+
12
+ group :development do
13
+ gem "rubocop", "~> 1.57"
14
+ gem "rubocop-shopify", "~> 2.14"
15
+ gem "sorbet"
16
+ gem "tapioca", require: false
17
+ end
18
+
19
+ group :test do
20
+ gem "rspec", "~> 3.12"
21
+ end
data/Gemfile.lock ADDED
@@ -0,0 +1,110 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ nexus-invision (0.0.0)
5
+
6
+ GEM
7
+ remote: https://rubygems.org/
8
+ specs:
9
+ ast (2.4.2)
10
+ base64 (0.1.1)
11
+ diff-lcs (1.5.0)
12
+ erubi (1.12.0)
13
+ faraday (2.7.11)
14
+ base64
15
+ faraday-net_http (>= 2.0, < 3.1)
16
+ ruby2_keywords (>= 0.0.4)
17
+ faraday-net_http (3.0.2)
18
+ json (2.6.3)
19
+ language_server-protocol (3.17.0.3)
20
+ netrc (0.11.0)
21
+ parallel (1.23.0)
22
+ parser (3.2.2.4)
23
+ ast (~> 2.4.1)
24
+ racc
25
+ prettier_print (1.2.1)
26
+ prism (0.15.1)
27
+ racc (1.7.1)
28
+ rainbow (3.1.1)
29
+ rake (13.1.0)
30
+ rbi (0.1.2)
31
+ prism (>= 0.15.1)
32
+ sorbet-runtime (>= 0.5.9204)
33
+ regexp_parser (2.8.2)
34
+ rexml (3.2.6)
35
+ rspec (3.12.0)
36
+ rspec-core (~> 3.12.0)
37
+ rspec-expectations (~> 3.12.0)
38
+ rspec-mocks (~> 3.12.0)
39
+ rspec-core (3.12.2)
40
+ rspec-support (~> 3.12.0)
41
+ rspec-expectations (3.12.3)
42
+ diff-lcs (>= 1.2.0, < 2.0)
43
+ rspec-support (~> 3.12.0)
44
+ rspec-mocks (3.12.6)
45
+ diff-lcs (>= 1.2.0, < 2.0)
46
+ rspec-support (~> 3.12.0)
47
+ rspec-support (3.12.1)
48
+ rubocop (1.57.2)
49
+ json (~> 2.3)
50
+ language_server-protocol (>= 3.17.0)
51
+ parallel (~> 1.10)
52
+ parser (>= 3.2.2.4)
53
+ rainbow (>= 2.2.2, < 4.0)
54
+ regexp_parser (>= 1.8, < 3.0)
55
+ rexml (>= 3.2.5, < 4.0)
56
+ rubocop-ast (>= 1.28.1, < 2.0)
57
+ ruby-progressbar (~> 1.7)
58
+ unicode-display_width (>= 2.4.0, < 3.0)
59
+ rubocop-ast (1.30.0)
60
+ parser (>= 3.2.1.0)
61
+ rubocop-shopify (2.14.0)
62
+ rubocop (~> 1.51)
63
+ ruby-progressbar (1.13.0)
64
+ ruby2_keywords (0.0.5)
65
+ sorbet (0.5.11108)
66
+ sorbet-static (= 0.5.11108)
67
+ sorbet-runtime (0.5.11108)
68
+ sorbet-static (0.5.11108-x86_64-linux)
69
+ sorbet-static-and-runtime (0.5.11108)
70
+ sorbet (= 0.5.11108)
71
+ sorbet-runtime (= 0.5.11108)
72
+ spoom (1.2.4)
73
+ erubi (>= 1.10.0)
74
+ sorbet-static-and-runtime (>= 0.5.10187)
75
+ syntax_tree (>= 6.1.1)
76
+ thor (>= 0.19.2)
77
+ syntax_tree (6.2.0)
78
+ prettier_print (>= 1.2.0)
79
+ tapioca (0.11.9)
80
+ bundler (>= 2.2.25)
81
+ netrc (>= 0.11.0)
82
+ parallel (>= 1.21.0)
83
+ rbi (~> 0.1.0, >= 0.1.0)
84
+ sorbet-static-and-runtime (>= 0.5.10187)
85
+ spoom (~> 1.2.0, >= 1.2.0)
86
+ thor (>= 1.2.0)
87
+ yard-sorbet
88
+ thor (1.3.0)
89
+ unicode-display_width (2.5.0)
90
+ yard (0.9.34)
91
+ yard-sorbet (0.8.1)
92
+ sorbet-runtime (>= 0.5)
93
+ yard (>= 0.9)
94
+
95
+ PLATFORMS
96
+ x86_64-linux
97
+
98
+ DEPENDENCIES
99
+ faraday (~> 2.7)
100
+ nexus-invision!
101
+ rake (~> 13.0)
102
+ rspec (~> 3.12)
103
+ rubocop (~> 1.57)
104
+ rubocop-shopify (~> 2.14)
105
+ sorbet
106
+ sorbet-runtime
107
+ tapioca
108
+
109
+ BUNDLED WITH
110
+ 2.4.13
data/README.md ADDED
@@ -0,0 +1,55 @@
1
+ # Invision API
2
+
3
+ A client library for the Invision Community API.
4
+
5
+ ## Release to rubygems
6
+
7
+ You must tag the commit to perform a release.
8
+
9
+ ## Installation
10
+
11
+ Install the gem and add to the application's Gemfile by executing:
12
+
13
+ $ bundle add nexus-invision
14
+
15
+ If bundler is not being used to manage dependencies, install the gem by executing:
16
+
17
+ $ gem install nexus-invision
18
+
19
+ ## Usage
20
+
21
+ ```ruby
22
+ require "nexus/invision/client"
23
+
24
+ client = Nexus::Invision::Client.build(base_url: "https://example.com/api", api_key: "secret")
25
+
26
+ request = Nexus::Invision::Requests::CreateForumTopic.new(
27
+ forum_id: 1,
28
+ title: "Hello World",
29
+ post: "This is my first post!"
30
+ )
31
+
32
+ begin
33
+ topic = client.create_forum_topic(request)
34
+
35
+ puts topic.id # 1337
36
+ rescue Nexus::Invision::Errors::BadRequest => e
37
+ # ...
38
+ rescue Nexus::Invision::Errors::UnexpectedResponse => e
39
+ # ...
40
+ end
41
+ ```
42
+
43
+ ## Development
44
+
45
+ After checking out the repo, run `bin/setup` to install dependencies. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
46
+
47
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and the created tag, and push the `.gem` file to [rubygems.org](https://rubygems.org).
48
+
49
+ Run the test suite:
50
+
51
+ $ bundle exec rspec
52
+
53
+ ## Contributing
54
+
55
+ Bug reports and pull requests are welcome on GitLab at https://gitlab.nexdev.uk/nexus-mods/public/nexus-invision
data/Rakefile ADDED
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bundler/gem_tasks"
4
+ task default: []
@@ -0,0 +1,177 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ require "faraday"
5
+ require "nexus/invision/errors/bad_request"
6
+ require "nexus/invision/errors/unexpected_response"
7
+ require "nexus/invision/requests/add_member_to_secondary_group"
8
+ require "nexus/invision/requests/create_forum_topic"
9
+ require "nexus/invision/requests/create_member_warning"
10
+ require "nexus/invision/requests/remove_member_from_secondary_group"
11
+ require "nexus/invision/resources/login_link"
12
+ require "nexus/invision/resources/topic"
13
+ require "nexus/invision/resources/user"
14
+ require "nexus/invision/resources/warning"
15
+ require "sorbet-runtime"
16
+ require "uri"
17
+
18
+ module Nexus
19
+ module Invision
20
+ class HTTPMethod < T::Enum
21
+ enums do
22
+ GET = new
23
+ POST = new
24
+ DELETE = new
25
+ end
26
+ end
27
+
28
+ class Client
29
+ extend T::Sig
30
+
31
+ sig { params(connection: Faraday::Connection).void }
32
+ def initialize(connection)
33
+ @connection = connection
34
+ end
35
+
36
+ class << self
37
+ extend T::Sig
38
+
39
+ sig do
40
+ params(
41
+ base_url: URI::HTTP,
42
+ api_key: String,
43
+ block: T.nilable(T.proc.params(arg0: Faraday::Connection).void),
44
+ ).returns(Client)
45
+ end
46
+ def build(base_url:, api_key:, &block)
47
+ new(
48
+ Faraday.new(url: base_url.to_s, headers: { "Accept" => "application/json" }) do |builder|
49
+ builder.request(:authorization, :basic, api_key, "")
50
+ builder.request(:url_encoded)
51
+ builder.response(:json)
52
+ block&.call(builder)
53
+ end,
54
+ )
55
+ end
56
+ end
57
+
58
+ sig { params(request: Requests::CreateForumTopic).returns(Resources::Topic) }
59
+ def create_forum_topic(request)
60
+ response = request(
61
+ http_method: HTTPMethod::POST,
62
+ endpoint: URI("forums/topics"),
63
+ params: request.serialize,
64
+ )
65
+
66
+ Resources::Topic.from_hash(response.body)
67
+ end
68
+
69
+ sig { params(nexusmods_member_id: Integer).returns(Resources::LoginLink) }
70
+ def login_link(nexusmods_member_id)
71
+ response = request(
72
+ http_method: HTTPMethod::GET,
73
+ endpoint: URI("core/loginlinks/#{nexusmods_member_id}"),
74
+ )
75
+
76
+ Resources::LoginLink.from_hash(response.body)
77
+ end
78
+
79
+ sig { params(request: Requests::AddMemberToSecondaryGroup).returns(Resources::User) }
80
+ def add_member_to_secondary_group(request)
81
+ response = request(
82
+ http_method: HTTPMethod::POST,
83
+ endpoint: URI("core/members/#{request.member_id}/secgroups/#{request.group_id}"),
84
+ )
85
+
86
+ Resources::User.from_hash(response.body)
87
+ end
88
+
89
+ sig { params(request: Requests::RemoveMemberFromSecondaryGroup).returns(Resources::User) }
90
+ def remove_member_from_secondary_group(request)
91
+ response = request(
92
+ http_method: HTTPMethod::DELETE,
93
+ endpoint: URI("core/members/#{request.member_id}/secgroups/#{request.group_id}"),
94
+ )
95
+
96
+ Resources::User.from_hash(response.body)
97
+ end
98
+
99
+ sig { params(request: Requests::CreateMemberWarning).returns(Resources::Warning) }
100
+ def create_member_warning(request)
101
+ response = request(
102
+ http_method: HTTPMethod::POST,
103
+ endpoint: URI("core/members/#{request.member_id}/warnings"),
104
+ params: request.serialize.except("member_id"),
105
+ )
106
+
107
+ Resources::Warning.from_hash(response.body)
108
+ end
109
+
110
+ sig { params(member_id: Integer).returns(Resources::User) }
111
+ def ban_member(member_id)
112
+ response = request(
113
+ http_method: HTTPMethod::POST,
114
+ endpoint: URI("core/bans/#{member_id}"),
115
+ )
116
+
117
+ Resources::User.from_hash(response.body)
118
+ end
119
+
120
+ sig { params(member_id: Integer).returns(Resources::User) }
121
+ def unban_member(member_id)
122
+ response = request(
123
+ http_method: HTTPMethod::DELETE,
124
+ endpoint: URI("core/bans/#{member_id}"),
125
+ )
126
+
127
+ Resources::User.from_hash(response.body)
128
+ end
129
+
130
+ private
131
+
132
+ sig do
133
+ params(
134
+ http_method: HTTPMethod,
135
+ endpoint: URI,
136
+ params: T::Hash[String, T.untyped],
137
+ ).returns(Faraday::Response)
138
+ end
139
+ def request(http_method:, endpoint:, params: {})
140
+ response =
141
+ case http_method
142
+ when HTTPMethod::GET
143
+ @connection.get(endpoint, params)
144
+ when HTTPMethod::POST
145
+ @connection.post(endpoint, params)
146
+ when HTTPMethod::DELETE
147
+ @connection.delete(endpoint, params)
148
+ else
149
+ T.absurd(http_method)
150
+ end
151
+
152
+ handle_error(response) unless response.success?
153
+
154
+ response
155
+ end
156
+
157
+ ERROR_CODE_KEY = "errorCode"
158
+ ERROR_MESSAGE_KEY = "errorMessage"
159
+
160
+ sig { params(response: Faraday::Response).void }
161
+ def handle_error(response)
162
+ body = response.body
163
+
164
+ if bad_request_error?(body)
165
+ raise Errors::BadRequest.new(body[ERROR_MESSAGE_KEY], body[ERROR_CODE_KEY], response.env)
166
+ end
167
+
168
+ raise Errors::UnexpectedResponse.new("Unexpected response", response.env)
169
+ end
170
+
171
+ sig { params(body: Object).returns(T::Boolean) }
172
+ def bad_request_error?(body)
173
+ body.is_a?(Hash) && body.key?(ERROR_MESSAGE_KEY) && body.key?(ERROR_CODE_KEY)
174
+ end
175
+ end
176
+ end
177
+ end
@@ -0,0 +1,24 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ require "nexus/invision/errors/client_error"
5
+ require "sorbet-runtime"
6
+
7
+ module Nexus
8
+ module Invision
9
+ module Errors
10
+ class BadRequest < ClientError
11
+ extend T::Sig
12
+
13
+ sig { returns(String) }
14
+ attr_reader :code
15
+
16
+ sig { params(message: String, code: String, env: Faraday::Env).void }
17
+ def initialize(message, code, env)
18
+ super(message, env)
19
+ @code = code
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,23 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ require "sorbet-runtime"
5
+
6
+ module Nexus
7
+ module Invision
8
+ module Errors
9
+ class ClientError < StandardError
10
+ extend T::Sig
11
+
12
+ sig { returns(Faraday::Env) }
13
+ attr_reader :env
14
+
15
+ sig { params(message: String, env: Faraday::Env).void }
16
+ def initialize(message, env)
17
+ super(message)
18
+ @env = env
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,13 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ require "nexus/invision/errors/client_error"
5
+ require "sorbet-runtime"
6
+
7
+ module Nexus
8
+ module Invision
9
+ module Errors
10
+ class UnexpectedResponse < ClientError; end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,18 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ require "nexus/invision/value_object"
5
+ require "sorbet-runtime"
6
+
7
+ module Nexus
8
+ module Invision
9
+ module Requests
10
+ class AddMemberToSecondaryGroup < T::Struct
11
+ include ValueObject
12
+
13
+ const :member_id, Integer
14
+ const :group_id, Integer
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,22 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ require "nexus/invision/value_object"
5
+ require "sorbet-runtime"
6
+
7
+ module Nexus
8
+ module Invision
9
+ module Requests
10
+ class CreateForumTopic < T::Struct
11
+ include ValueObject
12
+
13
+ const :forum_id, Integer
14
+ const :title, String
15
+ const :post, String
16
+ const :author, T.nilable(Integer)
17
+ const :close_time, T.nilable(Time)
18
+ const :prefix, T.nilable(String)
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,22 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ require "nexus/invision/value_object"
5
+ require "sorbet-runtime"
6
+
7
+ module Nexus
8
+ module Invision
9
+ module Requests
10
+ class CreateMemberWarning < T::Struct
11
+ include ValueObject
12
+
13
+ const :member_id, Integer
14
+ const :moderator, T.nilable(Integer)
15
+ const :reason, T.nilable(Integer)
16
+ const :acknowledged, T.nilable(T::Boolean)
17
+ const :suspend, T.nilable(T.any(Time, Integer))
18
+ const :member_note, T.nilable(String), name: "memberNote"
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,18 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ require "nexus/invision/value_object"
5
+ require "sorbet-runtime"
6
+
7
+ module Nexus
8
+ module Invision
9
+ module Requests
10
+ class RemoveMemberFromSecondaryGroup < T::Struct
11
+ include ValueObject
12
+
13
+ const :member_id, Integer
14
+ const :group_id, Integer
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,17 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ require "nexus/invision/value_object"
5
+ require "sorbet-runtime"
6
+
7
+ module Nexus
8
+ module Invision
9
+ module Resources
10
+ class LoginLink < T::Struct
11
+ include ValueObject
12
+
13
+ const :id, Integer
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ require "nexus/invision/value_object"
5
+ require "sorbet-runtime"
6
+
7
+ module Nexus
8
+ module Invision
9
+ module Resources
10
+ class Topic < T::Struct
11
+ include ValueObject
12
+
13
+ const :id, Integer
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ require "nexus/invision/value_object"
5
+ require "sorbet-runtime"
6
+
7
+ module Nexus
8
+ module Invision
9
+ module Resources
10
+ class User < T::Struct
11
+ include ValueObject
12
+
13
+ const :id, Integer
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ require "nexus/invision/value_object"
5
+ require "sorbet-runtime"
6
+
7
+ module Nexus
8
+ module Invision
9
+ module Resources
10
+ class Warning < T::Struct
11
+ include ValueObject
12
+
13
+ const :id, Integer
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,28 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ require "sorbet-runtime"
5
+
6
+ module Nexus
7
+ module Invision
8
+ module ValueObject
9
+ extend T::Sig
10
+ extend T::Helpers
11
+
12
+ abstract!
13
+
14
+ sig { abstract.returns(T::Class[ValueObject]) }
15
+ def class; end
16
+
17
+ sig { abstract.returns(T::Hash[String, T.untyped]) }
18
+ def serialize; end
19
+
20
+ sig { params(other: ValueObject).returns(T::Boolean) }
21
+ def eql?(other)
22
+ self.class == other.class && serialize == other.serialize
23
+ end
24
+
25
+ alias_method :==, :eql?
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,9 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ module Nexus
5
+ module Invision
6
+ # Leave this as 1.0.0 in order for CI process to replace with the tagged version.
7
+ VERSION = "1.0.0"
8
+ end
9
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "lib/nexus/invision/version"
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = "nexus-invision"
7
+ spec.version = Nexus::Invision::VERSION
8
+ spec.authors = ["Jack Robertson"]
9
+ spec.email = ["jack.robertson@nexusmods.com"]
10
+
11
+ spec.summary = "A client for the Invision Community REST API."
12
+ spec.homepage = "https://gitlab.nexdev.uk/nexus-mods/public/nexus-invision"
13
+ spec.required_ruby_version = ">= 2.6.0"
14
+
15
+ # Specify which files should be added to the gem when it is released.
16
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
17
+ spec.files = Dir.chdir(__dir__) do
18
+ %x(git ls-files -z).split("\x0").reject do |f|
19
+ (File.expand_path(f) == __FILE__) || f.start_with?(
20
+ "bin/",
21
+ "test/",
22
+ "spec/",
23
+ "features/",
24
+ ".git",
25
+ ".circleci",
26
+ "appveyor",
27
+ )
28
+ end
29
+ end
30
+ spec.bindir = "exe"
31
+ spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
32
+ spec.require_paths = ["lib"]
33
+ end
data/sorbet/config ADDED
@@ -0,0 +1,4 @@
1
+ --dir
2
+ .
3
+ --ignore=tmp/
4
+ --ignore=vendor/
@@ -0,0 +1 @@
1
+ **/*.rbi linguist-vendored=true