osso 0.0.3.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (106) hide show
  1. checksums.yaml +7 -0
  2. data/.buildkite/hooks/environment +9 -0
  3. data/.buildkite/hooks/pre-command +7 -0
  4. data/.buildkite/pipeline.yml +6 -0
  5. data/.buildkite/template.yml +5 -0
  6. data/.gitignore +10 -0
  7. data/.rspec +1 -0
  8. data/.rubocop.yml +81 -0
  9. data/CODE_OF_CONDUCT.md +130 -0
  10. data/Gemfile +18 -0
  11. data/Gemfile.lock +176 -0
  12. data/LICENSE +111 -0
  13. data/README.md +2 -0
  14. data/Rakefile +14 -0
  15. data/bin/console +8 -0
  16. data/bin/setup +8 -0
  17. data/config/database.yml +14 -0
  18. data/db/schema.rb +133 -0
  19. data/lib/osso.rb +11 -0
  20. data/lib/osso/Rakefile +13 -0
  21. data/lib/osso/db/migrate/20190909230109_enable_uuid.rb +7 -0
  22. data/lib/osso/db/migrate/20200328135750_create_users.rb +12 -0
  23. data/lib/osso/db/migrate/20200328143303_create_oauth_tables.rb +57 -0
  24. data/lib/osso/db/migrate/20200328143305_create_identity_providers.rb +12 -0
  25. data/lib/osso/db/migrate/20200411184535_add_provider_id_to_users.rb +7 -0
  26. data/lib/osso/db/migrate/20200411192645_create_enterprise_accounts.rb +15 -0
  27. data/lib/osso/db/migrate/20200413132407_add_oauth_clients.rb +13 -0
  28. data/lib/osso/db/migrate/20200413142511_create_authorization_codes.rb +15 -0
  29. data/lib/osso/db/migrate/20200413163451_create_access_tokens.rb +13 -0
  30. data/lib/osso/db/migrate/20200502120616_create_redirect_uris_and_drop_from_oauth_clients.rb +13 -0
  31. data/lib/osso/db/migrate/20200502135008_add_oauth_client_id_to_enterprise_accounts_and_identity_providers.rb +6 -0
  32. data/lib/osso/db/migrate/20200714223226_add_identity_provider_service_enum.rb +17 -0
  33. data/lib/osso/db/migrate/20200715154211_rename_idp_fields_on_identity_provider_to_sso.rb +6 -0
  34. data/lib/osso/db/migrate/20200715205801_add_name_to_enterprise_account.rb +5 -0
  35. data/lib/osso/graphql/mutation.rb +16 -0
  36. data/lib/osso/graphql/mutations.rb +12 -0
  37. data/lib/osso/graphql/mutations/base_mutation.rb +41 -0
  38. data/lib/osso/graphql/mutations/configure_identity_provider.rb +36 -0
  39. data/lib/osso/graphql/mutations/create_enterprise_account.rb +25 -0
  40. data/lib/osso/graphql/mutations/create_identity_provider.rb +30 -0
  41. data/lib/osso/graphql/mutations/set_identity_provider.rb +27 -0
  42. data/lib/osso/graphql/query.rb +25 -0
  43. data/lib/osso/graphql/resolvers.rb +12 -0
  44. data/lib/osso/graphql/resolvers/enterprise_account.rb +25 -0
  45. data/lib/osso/graphql/resolvers/enterprise_accounts.rb +17 -0
  46. data/lib/osso/graphql/resolvers/oauth_clients.rb +15 -0
  47. data/lib/osso/graphql/schema.rb +46 -0
  48. data/lib/osso/graphql/types.rb +15 -0
  49. data/lib/osso/graphql/types/base_enum.rb +10 -0
  50. data/lib/osso/graphql/types/base_input_object.rb +10 -0
  51. data/lib/osso/graphql/types/base_object.rb +12 -0
  52. data/lib/osso/graphql/types/enterprise_account.rb +33 -0
  53. data/lib/osso/graphql/types/identity_provider.rb +37 -0
  54. data/lib/osso/graphql/types/identity_provider_service.rb +12 -0
  55. data/lib/osso/graphql/types/oauth_client.rb +20 -0
  56. data/lib/osso/graphql/types/user.rb +17 -0
  57. data/lib/osso/helpers/auth.rb +71 -0
  58. data/lib/osso/helpers/helpers.rb +8 -0
  59. data/lib/osso/lib/app_config.rb +20 -0
  60. data/lib/osso/lib/oauth2_token.rb +38 -0
  61. data/lib/osso/lib/route_map.rb +28 -0
  62. data/lib/osso/models/access_token.rb +29 -0
  63. data/lib/osso/models/authorization_code.rb +14 -0
  64. data/lib/osso/models/enterprise_account.rb +28 -0
  65. data/lib/osso/models/identity_provider.rb +48 -0
  66. data/lib/osso/models/models.rb +16 -0
  67. data/lib/osso/models/oauth_client.rb +32 -0
  68. data/lib/osso/models/redirect_uri.rb +20 -0
  69. data/lib/osso/models/saml_provider.rb +49 -0
  70. data/lib/osso/models/saml_providers/azure_saml_provider.rb +22 -0
  71. data/lib/osso/models/saml_providers/okta_saml_provider.rb +23 -0
  72. data/lib/osso/models/user.rb +24 -0
  73. data/lib/osso/rake.rb +4 -0
  74. data/lib/osso/routes/admin.rb +41 -0
  75. data/lib/osso/routes/auth.rb +67 -0
  76. data/lib/osso/routes/oauth.rb +63 -0
  77. data/lib/osso/routes/routes.rb +10 -0
  78. data/lib/osso/routes/views/error.erb +1 -0
  79. data/lib/osso/routes/views/multiple_providers.erb +1 -0
  80. data/lib/osso/version.rb +5 -0
  81. data/lib/tasks/bootstrap.rake +16 -0
  82. data/osso-rb.gemspec +40 -0
  83. data/spec/factories/authorization_code.rb +10 -0
  84. data/spec/factories/enterprise_account.rb +46 -0
  85. data/spec/factories/identity_providers.rb +49 -0
  86. data/spec/factories/oauth_client.rb +12 -0
  87. data/spec/factories/redirect_uri.rb +14 -0
  88. data/spec/factories/user.rb +18 -0
  89. data/spec/graphql/mutations/configure_identity_provider_spec.rb +75 -0
  90. data/spec/graphql/mutations/create_enterprise_account_spec.rb +68 -0
  91. data/spec/graphql/mutations/create_identity_provider_spec.rb +104 -0
  92. data/spec/graphql/query/enterprise_account_spec.rb +68 -0
  93. data/spec/graphql/query/enterprise_accounts_spec.rb +44 -0
  94. data/spec/graphql/query/identity_provider_spec.rb +65 -0
  95. data/spec/graphql/query/oauth_clients_account_spec.rb +48 -0
  96. data/spec/models/azure_saml_provider_spec.rb +19 -0
  97. data/spec/models/identity_provider_spec.rb +17 -0
  98. data/spec/models/okta_saml_provider_spec.rb +20 -0
  99. data/spec/routes/admin_spec.rb +60 -0
  100. data/spec/routes/app_spec.rb +6 -0
  101. data/spec/routes/auth_spec.rb +112 -0
  102. data/spec/routes/oauth_spec.rb +134 -0
  103. data/spec/spec_helper.rb +68 -0
  104. data/spec/support/spec_app.rb +9 -0
  105. data/spec/support/views/admin.erb +5 -0
  106. metadata +348 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 5e43fcdb190c819ff0da0cb9ac9358152f42804f7fa116771d9dd458bf141c30
4
+ data.tar.gz: 65f6005798ec50a1ad4dd297c695aa08c80fb2ba8cc059eaa38cfb5f15a13dcc
5
+ SHA512:
6
+ metadata.gz: 617a3e1e5a5b476c4758476f7708e12a752d8d448a46866e37352ee319dcd5c08f2d0726d81c4ec1054e5129073840d6d76aad24ef938a1ccaf475bd72cc6d7b
7
+ data.tar.gz: 77f11455be71add868a54d61683be3dc9a09231a92fdbf1abbb05c685732c6469eaeb9acbbd765ff0ff894960224bdcb736525687b234c002a46a1e4d0b2dba6
@@ -0,0 +1,9 @@
1
+ #!/bin/bash
2
+
3
+ set -eu
4
+
5
+ echo '--- RBENV'
6
+
7
+ export PATH="$HOME/.rbenv/bin:$PATH"
8
+
9
+ eval "$(rbenv init -)"
@@ -0,0 +1,7 @@
1
+ #!/bin/bash
2
+
3
+ set -eu
4
+
5
+ export PATH="$HOME/.rbenv/bin:$PATH"
6
+
7
+ eval "$(rbenv init -)"
@@ -0,0 +1,6 @@
1
+ steps:
2
+ - name: ":rspec:"
3
+ commands:
4
+ - "bundle install"
5
+ - "bundle exec rake db:test:prepare"
6
+ - "bundle exec rspec"
@@ -0,0 +1,5 @@
1
+ # Used by the 'Add to Buildkite' button in the readme
2
+ name: "Ruby rbenv Example"
3
+ steps:
4
+ - label: ":pipeline:"
5
+ command: "buildkite-agent pipeline upload"
@@ -0,0 +1,10 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /_yardoc/
4
+ /coverage/
5
+ /doc/
6
+ /pkg/
7
+ /spec/reports/
8
+ /tmp/
9
+ *.gem
10
+ .DS_Store
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --require spec_helper
@@ -0,0 +1,81 @@
1
+ AllCops:
2
+ Exclude:
3
+ - db/**/*
4
+ - lib/osso/db/**/*
5
+
6
+ # New rules must be explicitly opted into / out of
7
+ Lint/RaiseException:
8
+ Enabled: true
9
+ Lint/StructNewOverride:
10
+ Enabled: true
11
+ Style/HashEachMethods:
12
+ Enabled: true
13
+ Style/HashTransformKeys:
14
+ Enabled: true
15
+ Style/HashTransformValues:
16
+ Enabled: true
17
+ Layout/SpaceAroundMethodCallOperator:
18
+ Enabled: true
19
+ Style/ExponentialNotation:
20
+ Enabled: true
21
+
22
+ Style/TrailingCommaInArguments:
23
+ Description: "Checks for trailing comma in argument lists."
24
+ StyleGuide: "https://github.com/bbatsov/ruby-style-guide#no-trailing-array-commas"
25
+ EnforcedStyleForMultiline: comma
26
+ SupportedStylesForMultiline:
27
+ - comma
28
+ - consistent_comma
29
+ - no_comma
30
+ Enabled: true
31
+
32
+ Style/TrailingCommaInArrayLiteral:
33
+ Description: "Checks for trailing comma in array literals."
34
+ StyleGuide: "https://github.com/bbatsov/ruby-style-guide#no-trailing-array-commas"
35
+ EnforcedStyleForMultiline: comma
36
+ SupportedStylesForMultiline:
37
+ - comma
38
+ - consistent_comma
39
+ - no_comma
40
+ Enabled: true
41
+
42
+ Style/TrailingCommaInHashLiteral:
43
+ Description: "Checks for trailing comma in hash literals."
44
+ StyleGuide: "https://github.com/bbatsov/ruby-style-guide#no-trailing-array-commas"
45
+ EnforcedStyleForMultiline: comma
46
+ SupportedStylesForMultiline:
47
+ - comma
48
+ - consistent_comma
49
+ - no_comma
50
+ Enabled: true
51
+
52
+ Layout/MultilineMethodCallIndentation:
53
+ EnforcedStyle: indented
54
+
55
+ Layout/MultilineOperationIndentation:
56
+ EnforcedStyle: indented
57
+
58
+ Layout/ArgumentAlignment:
59
+ EnforcedStyle: with_fixed_indentation
60
+
61
+ Layout/DotPosition:
62
+ Description: "Checks the position of the dot in multi-line method calls."
63
+ StyleGuide: "https://github.com/bbatsov/ruby-style-guide#consistent-multi-line-chains"
64
+ EnforcedStyle: trailing
65
+
66
+ Layout/LineLength:
67
+ Exclude:
68
+ - 'spec/**/**.*'
69
+
70
+ Metrics/BlockLength:
71
+ Exclude:
72
+ - 'spec/**/*'
73
+
74
+ Metrics/AbcSize:
75
+ Max: 20
76
+
77
+ Style/Documentation:
78
+ Enabled: false
79
+ Exclude:
80
+ - 'spec/**/*'
81
+ - 'db/**.*'
@@ -0,0 +1,130 @@
1
+
2
+ # Contributor Covenant Code of Conduct
3
+
4
+ ## Our Pledge
5
+
6
+ We as members, contributors, and leaders pledge to make participation in our
7
+ community a harassment-free experience for everyone, regardless of age, body
8
+ size, visible or invisible disability, ethnicity, sex characteristics, gender
9
+ identity and expression, level of experience, education, socio-economic status,
10
+ nationality, personal appearance, race, religion, or sexual identity
11
+ and orientation.
12
+
13
+ We pledge to act and interact in ways that contribute to an open, welcoming,
14
+ diverse, inclusive, and healthy community.
15
+
16
+ ## Our Standards
17
+
18
+ Examples of behavior that contributes to a positive environment for our
19
+ community include:
20
+
21
+ * Demonstrating empathy and kindness toward other people
22
+ * Being respectful of differing opinions, viewpoints, and experiences
23
+ * Giving and gracefully accepting constructive feedback
24
+ * Accepting responsibility and apologizing to those affected by our mistakes,
25
+ and learning from the experience
26
+ * Focusing on what is best not just for us as individuals, but for the
27
+ overall community
28
+
29
+ Examples of unacceptable behavior include:
30
+
31
+ * The use of sexualized language or imagery, and sexual attention or
32
+ advances of any kind
33
+ * Trolling, insulting or derogatory comments, and personal or political attacks
34
+ * Public or private harassment
35
+ * Publishing others' private information, such as a physical or email
36
+ address, without their explicit permission
37
+ * Other conduct which could reasonably be considered inappropriate in a
38
+ professional setting
39
+
40
+ ## Enforcement Responsibilities
41
+
42
+ Community leaders are responsible for clarifying and enforcing our standards of
43
+ acceptable behavior and will take appropriate and fair corrective action in
44
+ response to any behavior that they deem inappropriate, threatening, offensive,
45
+ or harmful.
46
+
47
+ Community leaders have the right and responsibility to remove, edit, or reject
48
+ comments, commits, code, wiki edits, issues, and other contributions that are
49
+ not aligned to this Code of Conduct, and will communicate reasons for moderation
50
+ decisions when appropriate.
51
+
52
+ ## Scope
53
+
54
+ This Code of Conduct applies within all community spaces, and also applies when
55
+ an individual is officially representing the community in public spaces.
56
+ Examples of representing our community include using an official e-mail address,
57
+ posting via an official social media account, or acting as an appointed
58
+ representative at an online or offline event.
59
+
60
+ ## Enforcement
61
+
62
+ Instances of abusive, harassing, or otherwise unacceptable behavior may be
63
+ reported to the community leaders responsible for enforcement at
64
+ sbauch@gmail.com.
65
+ All complaints will be reviewed and investigated promptly and fairly.
66
+
67
+ All community leaders are obligated to respect the privacy and security of the
68
+ reporter of any incident.
69
+
70
+ ## Enforcement Guidelines
71
+
72
+ Community leaders will follow these Community Impact Guidelines in determining
73
+ the consequences for any action they deem in violation of this Code of Conduct:
74
+
75
+ ### 1. Correction
76
+
77
+ **Community Impact**: Use of inappropriate language or other behavior deemed
78
+ unprofessional or unwelcome in the community.
79
+
80
+ **Consequence**: A private, written warning from community leaders, providing
81
+ clarity around the nature of the violation and an explanation of why the
82
+ behavior was inappropriate. A public apology may be requested.
83
+
84
+ ### 2. Warning
85
+
86
+ **Community Impact**: A violation through a single incident or series
87
+ of actions.
88
+
89
+ **Consequence**: A warning with consequences for continued behavior. No
90
+ interaction with the people involved, including unsolicited interaction with
91
+ those enforcing the Code of Conduct, for a specified period of time. This
92
+ includes avoiding interactions in community spaces as well as external channels
93
+ like social media. Violating these terms may lead to a temporary or
94
+ permanent ban.
95
+
96
+ ### 3. Temporary Ban
97
+
98
+ **Community Impact**: A serious violation of community standards, including
99
+ sustained inappropriate behavior.
100
+
101
+ **Consequence**: A temporary ban from any sort of interaction or public
102
+ communication with the community for a specified period of time. No public or
103
+ private interaction with the people involved, including unsolicited interaction
104
+ with those enforcing the Code of Conduct, is allowed during this period.
105
+ Violating these terms may lead to a permanent ban.
106
+
107
+ ### 4. Permanent Ban
108
+
109
+ **Community Impact**: Demonstrating a pattern of violation of community
110
+ standards, including sustained inappropriate behavior, harassment of an
111
+ individual, or aggression toward or disparagement of classes of individuals.
112
+
113
+ **Consequence**: A permanent ban from any sort of public interaction within
114
+ the community.
115
+
116
+ ## Attribution
117
+
118
+ This Code of Conduct is adapted from the [Contributor Covenant][homepage],
119
+ version 2.0, available at
120
+ https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.
121
+
122
+ Community Impact Guidelines were inspired by [Mozilla's code of conduct
123
+ enforcement ladder](https://github.com/mozilla/diversity).
124
+
125
+ [homepage]: https://www.contributor-covenant.org
126
+
127
+ For answers to common questions about this code of conduct, see the FAQ at
128
+ https://www.contributor-covenant.org/faq. Translations are available at
129
+ https://www.contributor-covenant.org/translations.
130
+
data/Gemfile ADDED
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ source 'https://rubygems.org'
4
+
5
+ git_source(:github) { |repo_name| "https://github.com/#{repo_name}" }
6
+
7
+ group :test do
8
+ gem 'database_cleaner-active_record'
9
+ gem 'factory_bot'
10
+ gem 'faker'
11
+ gem 'pg'
12
+ gem 'rack-test'
13
+ gem 'rspec', '~> 3.2'
14
+ gem 'rubocop'
15
+ gem 'webmock', '~> 3.0'
16
+ end
17
+
18
+ gemspec
@@ -0,0 +1,176 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ osso (0.0.3.7)
5
+ activesupport (>= 6.0.3.2)
6
+ graphql
7
+ jwt
8
+ omniauth-multi-provider
9
+ omniauth-saml
10
+ rack (>= 2.1.4)
11
+ rack-contrib
12
+ rack-oauth2
13
+ rake
14
+ sinatra
15
+ sinatra-activerecord
16
+ sinatra-contrib
17
+
18
+ GEM
19
+ remote: https://rubygems.org/
20
+ specs:
21
+ activemodel (6.0.3.2)
22
+ activesupport (= 6.0.3.2)
23
+ activerecord (6.0.3.2)
24
+ activemodel (= 6.0.3.2)
25
+ activesupport (= 6.0.3.2)
26
+ activesupport (6.0.3.2)
27
+ concurrent-ruby (~> 1.0, >= 1.0.2)
28
+ i18n (>= 0.7, < 2)
29
+ minitest (~> 5.1)
30
+ tzinfo (~> 1.1)
31
+ zeitwerk (~> 2.2, >= 2.2.2)
32
+ addressable (2.7.0)
33
+ public_suffix (>= 2.0.2, < 5.0)
34
+ aes_key_wrap (1.0.1)
35
+ ast (2.4.1)
36
+ attr_required (1.0.1)
37
+ backports (3.18.1)
38
+ bindata (2.4.7)
39
+ coderay (1.1.3)
40
+ concurrent-ruby (1.1.6)
41
+ crack (0.4.3)
42
+ safe_yaml (~> 1.0.0)
43
+ database_cleaner (1.8.5)
44
+ database_cleaner-active_record (1.8.0)
45
+ activerecord
46
+ database_cleaner (~> 1.8.0)
47
+ diff-lcs (1.4.4)
48
+ factory_bot (6.0.2)
49
+ activesupport (>= 5.0.0)
50
+ faker (2.13.0)
51
+ i18n (>= 1.6, < 2)
52
+ graphql (1.11.1)
53
+ hashdiff (1.0.1)
54
+ hashie (4.1.0)
55
+ httpclient (2.8.3)
56
+ i18n (1.8.3)
57
+ concurrent-ruby (~> 1.0)
58
+ json-jwt (1.13.0)
59
+ activesupport (>= 4.2)
60
+ aes_key_wrap
61
+ bindata
62
+ jwt (2.2.1)
63
+ method_source (1.0.0)
64
+ mini_portile2 (2.4.0)
65
+ minitest (5.14.1)
66
+ multi_json (1.14.1)
67
+ mustermann (1.1.1)
68
+ ruby2_keywords (~> 0.0.1)
69
+ nokogiri (1.10.9)
70
+ mini_portile2 (~> 2.4.0)
71
+ omniauth (1.9.1)
72
+ hashie (>= 3.4.6)
73
+ rack (>= 1.6.2, < 3)
74
+ omniauth-multi-provider (0.2.1)
75
+ omniauth
76
+ omniauth-saml (1.10.1)
77
+ omniauth (~> 1.3, >= 1.3.2)
78
+ ruby-saml (~> 1.7)
79
+ parallel (1.19.2)
80
+ parser (2.7.1.4)
81
+ ast (~> 2.4.1)
82
+ pg (1.2.3)
83
+ pry (0.13.1)
84
+ coderay (~> 1.1)
85
+ method_source (~> 1.0)
86
+ public_suffix (4.0.5)
87
+ rack (2.2.3)
88
+ rack-contrib (2.2.0)
89
+ rack (~> 2.0)
90
+ rack-oauth2 (1.14.0)
91
+ activesupport
92
+ attr_required
93
+ httpclient
94
+ json-jwt (>= 1.11.0)
95
+ rack (>= 2.1.0)
96
+ rack-protection (2.0.8.1)
97
+ rack
98
+ rack-test (1.1.0)
99
+ rack (>= 1.0, < 3)
100
+ rainbow (3.0.0)
101
+ rake (13.0.1)
102
+ regexp_parser (1.7.1)
103
+ rexml (3.2.4)
104
+ rspec (3.9.0)
105
+ rspec-core (~> 3.9.0)
106
+ rspec-expectations (~> 3.9.0)
107
+ rspec-mocks (~> 3.9.0)
108
+ rspec-core (3.9.2)
109
+ rspec-support (~> 3.9.3)
110
+ rspec-expectations (3.9.2)
111
+ diff-lcs (>= 1.2.0, < 2.0)
112
+ rspec-support (~> 3.9.0)
113
+ rspec-mocks (3.9.1)
114
+ diff-lcs (>= 1.2.0, < 2.0)
115
+ rspec-support (~> 3.9.0)
116
+ rspec-support (3.9.3)
117
+ rubocop (0.86.0)
118
+ parallel (~> 1.10)
119
+ parser (>= 2.7.0.1)
120
+ rainbow (>= 2.2.2, < 4.0)
121
+ regexp_parser (>= 1.7)
122
+ rexml
123
+ rubocop-ast (>= 0.0.3, < 1.0)
124
+ ruby-progressbar (~> 1.7)
125
+ unicode-display_width (>= 1.4.0, < 2.0)
126
+ rubocop-ast (0.1.0)
127
+ parser (>= 2.7.0.1)
128
+ ruby-progressbar (1.10.1)
129
+ ruby-saml (1.11.0)
130
+ nokogiri (>= 1.5.10)
131
+ ruby2_keywords (0.0.2)
132
+ safe_yaml (1.0.5)
133
+ sinatra (2.0.8.1)
134
+ mustermann (~> 1.0)
135
+ rack (~> 2.0)
136
+ rack-protection (= 2.0.8.1)
137
+ tilt (~> 2.0)
138
+ sinatra-activerecord (2.0.18)
139
+ activerecord (>= 4.1)
140
+ sinatra (>= 1.0)
141
+ sinatra-contrib (2.0.8.1)
142
+ backports (>= 2.8.2)
143
+ multi_json
144
+ mustermann (~> 1.0)
145
+ rack-protection (= 2.0.8.1)
146
+ sinatra (= 2.0.8.1)
147
+ tilt (~> 2.0)
148
+ thread_safe (0.3.6)
149
+ tilt (2.0.10)
150
+ tzinfo (1.2.7)
151
+ thread_safe (~> 0.1)
152
+ unicode-display_width (1.7.0)
153
+ webmock (3.8.3)
154
+ addressable (>= 2.3.6)
155
+ crack (>= 0.3.2)
156
+ hashdiff (>= 0.4.0, < 2.0.0)
157
+ zeitwerk (2.3.1)
158
+
159
+ PLATFORMS
160
+ ruby
161
+
162
+ DEPENDENCIES
163
+ bundler (~> 2.1)
164
+ database_cleaner-active_record
165
+ factory_bot
166
+ faker
167
+ osso!
168
+ pg
169
+ pry
170
+ rack-test
171
+ rspec (~> 3.2)
172
+ rubocop
173
+ webmock (~> 3.0)
174
+
175
+ BUNDLED WITH
176
+ 2.1.4