panda-core 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 5df66d64cfcc8abacb8597eae42e3a53c4ecb74dddb809597b0c94f003dedb78
4
+ data.tar.gz: 499c541f80789df7ac35002871bbfbd9d306ed2299943d670227afab984b2ce1
5
+ SHA512:
6
+ metadata.gz: 3dfc2054028be1b0893b59a53dca55f41390f36c2f6b7632a59d2e7eb9310ad423ac87a00822353686cab25538d4130cc75ec7a33506048b9d5f74121ca54a5b
7
+ data.tar.gz: ff646003114bd1afdba6b98750a56d53256e3cc223ad736530949c8b70fc770bcd54738dac65b1b6972128163a9ddea965686f0a74858bfe18c064d914072934
data/LICENSE ADDED
@@ -0,0 +1,28 @@
1
+ BSD 3-Clause License
2
+
3
+ Copyright © 2024, Panda Software Limited, James Inman
4
+
5
+ Redistribution and use in source and binary forms, with or without
6
+ modification, are permitted provided that the following conditions are met:
7
+
8
+ 1. Redistributions of source code must retain the above copyright notice, this
9
+ list of conditions and the following disclaimer.
10
+
11
+ 2. Redistributions in binary form must reproduce the above copyright notice,
12
+ this list of conditions and the following disclaimer in the documentation
13
+ and/or other materials provided with the distribution.
14
+
15
+ 3. Neither the name of the copyright holder nor the names of its
16
+ contributors may be used to endorse or promote products derived from
17
+ this software without specific prior written permission.
18
+
19
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
23
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
25
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
26
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
27
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
data/README.md ADDED
@@ -0,0 +1,122 @@
1
+ # Panda Core
2
+
3
+ Core functionality shared between Panda Software gems:
4
+
5
+ - Panda CMS (https://github.com/tastybamboo/panda_cms)
6
+
7
+ ## Installation
8
+
9
+ Add this line to your application's Gemfile:
10
+
11
+ ```
12
+ gem 'panda_core'
13
+ ```
14
+
15
+ And then execute:
16
+
17
+ ```
18
+ bundle install
19
+ ```
20
+
21
+ ## Setup
22
+
23
+ ### 1. Run the Install Generator
24
+
25
+ This will:
26
+
27
+ - Add required gem dependencies
28
+ - Create an initializer
29
+ - Mount the engine in your routes
30
+
31
+ ```
32
+ rails generate panda:core:install
33
+ ```
34
+
35
+ ### 2. Install Configuration Templates
36
+
37
+ Panda Core provides standard configuration files that can be used across all Panda gems to ensure consistency.
38
+
39
+ ```
40
+ rails generate panda:core:templates
41
+ ```
42
+
43
+ This will copy the following configuration files to your project:
44
+
45
+ - `.github/workflows/ci.yml` - GitHub Actions CI workflow
46
+ - `.github/dependabot.yml` - Dependabot configuration
47
+ - `.erb_lint.yml` - ERB linting rules
48
+ - `.eslintrc.js` - ESLint configuration
49
+ - `.gitattributes` - Git file handling rules
50
+ - `.gitignore` - Standard git ignore rules
51
+ - `.lefthook.yml` - Git hooks configuration
52
+ - `.rspec` - RSpec configuration
53
+ - `.standard.yml` - Ruby Standard configuration
54
+
55
+ ### 3. Configure Dependencies
56
+
57
+ The following gems will be added to your Gemfile:
58
+
59
+ - `panda_core`
60
+
61
+ Make sure to follow the setup instructions for each of these gems.
62
+
63
+ ## Development
64
+
65
+ After checking out the repo:
66
+
67
+ 1. Run setup:
68
+
69
+ ```
70
+ bin/setup
71
+ ```
72
+
73
+ 2. Run the test suite:
74
+
75
+ ```
76
+ bundle exec rspec
77
+ ```
78
+
79
+ 3. Run the linter:
80
+
81
+ ```
82
+ bundle exec standardrb
83
+ ```
84
+
85
+ ## Testing
86
+
87
+ The gem includes several types of tests:
88
+
89
+ - Generator tests for installation and template copying
90
+ - System tests using Capybara
91
+ - Unit tests for core functionality
92
+
93
+ To run specific test types:
94
+
95
+ ```
96
+ # Run all tests
97
+ bundle exec rspec
98
+ ```
99
+
100
+ ```
101
+ # Run only generator tests
102
+ bundle exec rspec spec/generators
103
+ ```
104
+
105
+ ```
106
+ # Run only system tests
107
+ bundle exec rspec spec/system
108
+ ```
109
+
110
+ ## Contributing
111
+
112
+ 1. Fork it
113
+ 2. Create your feature branch (`git checkout -b feature/my-new-feature`)
114
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
115
+ 4. Push to the branch (`git push origin feature/my-new-feature`)
116
+ 5. Create new Pull Request
117
+
118
+ Bug reports and pull requests are welcome on GitHub at https://github.com/tastybamboo/panda_core.
119
+
120
+ ## License
121
+
122
+ The gem is available as open source under the terms of the [BSD 3-Clause License](https://opensource.org/licenses/BSD-3-Clause).
data/Rakefile ADDED
@@ -0,0 +1,2 @@
1
+ require "bundler/setup"
2
+ require "bundler/gem_tasks"
@@ -0,0 +1,145 @@
1
+ require "rails/generators"
2
+
3
+ module Panda
4
+ module Core
5
+ module Generators
6
+ class InstallGenerator < Rails::Generators::Base
7
+ source_root File.expand_path("templates", __dir__)
8
+
9
+ desc "Installs Panda::Core and its dependencies"
10
+
11
+ def install_dependencies
12
+ manage_gem_dependencies
13
+ end
14
+
15
+ def install_initializer
16
+ initializer_path = File.join(destination_root, "config/initializers/panda/core.rb")
17
+
18
+ if File.exist?(initializer_path)
19
+ append_missing_configurations(initializer_path)
20
+ else
21
+ begin
22
+ FileUtils.mkdir_p(File.dirname(initializer_path))
23
+ rescue Errno::EEXIST
24
+ # Directory already exists, that's fine
25
+ end
26
+ template "initializer.rb", initializer_path
27
+ end
28
+ end
29
+
30
+ # def mount_engine
31
+ # inject_into_file File.join(destination_root, "config/routes.rb"),
32
+ # " mount Panda::Core::Engine => '/'\n",
33
+ # before: /^end/
34
+ # end
35
+
36
+ private
37
+
38
+ def gems_to_add
39
+ {
40
+ "panda_core" => {}
41
+ # "gem_name" => {version: "1.0.0"},
42
+ # "another_gem" => {git: "https://github.com/example/another_gem"}
43
+ # Add other gems as needed
44
+ }
45
+ end
46
+
47
+ def manage_gem_dependencies
48
+ if File.exist?(File.join(destination_root, "Gemfile"))
49
+ manage_gemfile_dependencies
50
+ elsif Dir.glob(File.join(destination_root, "*.gemspec")).any?
51
+ manage_gemspec_dependencies
52
+ else
53
+ create_file File.join(destination_root, "Gemfile") do
54
+ content = "source 'https://rubygems.org'\n\n"
55
+ gems_to_add.each do |gem_name, options|
56
+ content << if options[:git]
57
+ "gem '#{gem_name}', git: '#{options[:git]}'\n"
58
+ elsif options[:version]
59
+ "gem '#{gem_name}', '#{options[:version]}'\n"
60
+ else
61
+ "gem '#{gem_name}'\n"
62
+ end
63
+ end
64
+ content
65
+ end
66
+ end
67
+ end
68
+
69
+ def manage_gemfile_dependencies
70
+ gemfile_content = File.read(File.join(destination_root, "Gemfile"))
71
+
72
+ gems_to_add.each do |gem_name, options|
73
+ next if should_skip_gem?(gemfile_content, gem_name, options)
74
+
75
+ if options[:git]
76
+ append_to_file File.join(destination_root, "Gemfile"), "\ngem '#{gem_name}', git: '#{options[:git]}'"
77
+ elsif options[:version]
78
+ append_to_file File.join(destination_root, "Gemfile"), "\ngem '#{gem_name}', '#{options[:version]}'"
79
+ else
80
+ append_to_file File.join(destination_root, "Gemfile"), "\ngem '#{gem_name}'"
81
+ end
82
+ end
83
+ end
84
+
85
+ def manage_gemspec_dependencies
86
+ gemspec_file = Dir.glob(File.join(destination_root, "*.gemspec")).first
87
+
88
+ if File.exist?(gemspec_file)
89
+ content = File.read(gemspec_file)
90
+
91
+ gems_to_add.each do |gem_name, options|
92
+ next if content.include?("spec.add_dependency \"#{gem_name}\"")
93
+
94
+ dependency_line = if options[:version]
95
+ " spec.add_dependency \"#{gem_name}\", \"#{options[:version]}\"\n"
96
+ else
97
+ " spec.add_dependency \"#{gem_name}\"\n"
98
+ end
99
+
100
+ # Insert before the last 'end'
101
+ gsub_file gemspec_file, /end\s*\z/ do |match|
102
+ "#{dependency_line}#{match}"
103
+ end
104
+ end
105
+ end
106
+ end
107
+
108
+ def should_skip_gem?(gemfile_content, gem_name, new_options)
109
+ gemfile_content.match?(/gem ['"]#{gem_name}['"]/)
110
+ end
111
+
112
+ def append_missing_configurations(path)
113
+ content = File.read(path)
114
+ missing_configs = []
115
+
116
+ unless content.include?("config.user_class")
117
+ missing_configs << " # Set the user class for authentication (e.g., 'User')"
118
+ missing_configs << " # config.user_class = nil"
119
+ end
120
+
121
+ unless content.include?("config.authentication_providers")
122
+ missing_configs << " # Configure authentication providers (e.g., [:devise, :jwt])"
123
+ missing_configs << " # config.authentication_providers = []"
124
+ end
125
+
126
+ unless content.include?("config.storage_provider")
127
+ missing_configs << " # Set the storage provider (:active_storage or :aws)"
128
+ missing_configs << " # config.storage_provider = :active_storage"
129
+ end
130
+
131
+ unless content.include?("config.cache_store")
132
+ missing_configs << " # Set the cache store (:memory_store, :redis_cache_store, etc.)"
133
+ missing_configs << " # config.cache_store = :memory_store"
134
+ end
135
+
136
+ if missing_configs.any?
137
+ inject_into_file path, before: /^end/ do
138
+ "\n#{missing_configs.join("\n")}\n"
139
+ end
140
+ end
141
+ end
142
+ end
143
+ end
144
+ end
145
+ end
@@ -0,0 +1,13 @@
1
+ Panda::Core.configure do |config|
2
+ # Set the user class for authentication (e.g., 'User')
3
+ # config.user_class = nil
4
+
5
+ # Configure authentication providers (e.g., [:devise, :jwt])
6
+ # config.authentication_providers = []
7
+
8
+ # Set the storage provider (:active_storage or :aws)
9
+ # config.storage_provider = :active_storage
10
+
11
+ # Set the cache store (:memory_store, :redis_cache_store, etc.)
12
+ # config.cache_store = :memory_store
13
+ end
@@ -0,0 +1,27 @@
1
+ require "rails/generators"
2
+ require "fileutils"
3
+ require "pathname"
4
+
5
+ module Panda
6
+ module Core
7
+ module Generators
8
+ class TemplatesGenerator < Rails::Generators::Base
9
+ include Thor::Actions
10
+
11
+ desc "Copies shared configuration templates from panda_core"
12
+
13
+ source_root File.expand_path("templates", __dir__)
14
+
15
+ def copy_templates
16
+ Dir.glob(File.join(self.class.source_root, "**/{.*,*}"), File::FNM_DOTMATCH).each do |file|
17
+ next if File.directory?(file)
18
+ next if File.basename(file) == "." || File.basename(file) == ".."
19
+
20
+ relative_path = Pathname.new(file).relative_path_from(Pathname.new(self.class.source_root)).to_s
21
+ copy_file relative_path
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,28 @@
1
+ module Panda
2
+ module Core
3
+ module Media
4
+ extend ActiveSupport::Concern
5
+
6
+ included do
7
+ has_one_attached :featured_image
8
+ has_many_attached :attachments
9
+
10
+ validates :featured_image, content_type: [:png, :jpg, :jpeg],
11
+ size: {less_than: 5.megabytes}
12
+ end
13
+
14
+ def image_url(variant: nil)
15
+ return nil unless featured_image.attached?
16
+
17
+ case variant
18
+ when :thumbnail
19
+ featured_image.variant(resize_to_fill: [200, 200]).processed
20
+ when :medium
21
+ featured_image.variant(resize_to_fill: [400, 400]).processed
22
+ else
23
+ featured_image
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,6 @@
1
+ require "rails/railtie"
2
+
3
+ module Panda
4
+ module Core
5
+ end
6
+ end
@@ -0,0 +1,23 @@
1
+ module Panda
2
+ module Core
3
+ module SEO
4
+ extend ActiveSupport::Concern
5
+
6
+ included do
7
+ validates :meta_title, length: {maximum: 60}
8
+ validates :meta_description, length: {maximum: 160}
9
+ end
10
+
11
+ def structured_data
12
+ {
13
+ "@context": "https://schema.org",
14
+ "@type": self.class.name,
15
+ name: title,
16
+ description: meta_description,
17
+ datePublished: created_at,
18
+ dateModified: updated_at
19
+ }
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,21 @@
1
+ module Panda
2
+ module Core
3
+ module Services
4
+ class BaseService
5
+ def self.call(*args)
6
+ new(*args).call
7
+ end
8
+
9
+ private
10
+
11
+ def success(payload = {})
12
+ OpenStruct.new(success?: true, payload: payload)
13
+ end
14
+
15
+ def failure(errors)
16
+ OpenStruct.new(success?: false, errors: errors)
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,18 @@
1
+ module Panda
2
+ module Core
3
+ module Sluggable
4
+ extend ActiveSupport::Concern
5
+
6
+ included do
7
+ before_validation :generate_slug
8
+ validates :slug, presence: true, uniqueness: true
9
+ end
10
+
11
+ private
12
+
13
+ def generate_slug
14
+ self.slug ||= title.to_s.parameterize
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Panda
4
+ module Core
5
+ VERSION = "0.1.0"
6
+ end
7
+ end
data/lib/panda/core.rb ADDED
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "dry-configurable"
4
+ require_relative "core/version"
5
+ require "panda/core/railtie"
6
+
7
+ module Panda
8
+ module Core
9
+ extend Dry::Configurable
10
+
11
+ setting :user_class
12
+ setting :authentication_providers, default: []
13
+ setting :storage_provider, default: :active_storage
14
+ setting :cache_store, default: :memory_store
15
+
16
+ def self.root
17
+ File.expand_path("..", __dir__)
18
+ end
19
+ end
20
+ end
metadata ADDED
@@ -0,0 +1,901 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: panda-core
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Panda Software Limited
8
+ - James Inman
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2024-11-27 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: activestorage-office-previewer
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - ">="
19
+ - !ruby/object:Gem::Version
20
+ version: '0'
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ">="
26
+ - !ruby/object:Gem::Version
27
+ version: '0'
28
+ - !ruby/object:Gem::Dependency
29
+ name: annotaterb
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - ">="
33
+ - !ruby/object:Gem::Version
34
+ version: '0'
35
+ type: :runtime
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ version: '0'
42
+ - !ruby/object:Gem::Dependency
43
+ name: awesome_nested_set
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - "~>"
47
+ - !ruby/object:Gem::Version
48
+ version: '3.7'
49
+ type: :runtime
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - "~>"
54
+ - !ruby/object:Gem::Version
55
+ version: '3.7'
56
+ - !ruby/object:Gem::Dependency
57
+ name: aws-sdk-s3
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - "~>"
61
+ - !ruby/object:Gem::Version
62
+ version: '1'
63
+ type: :runtime
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - "~>"
68
+ - !ruby/object:Gem::Version
69
+ version: '1'
70
+ - !ruby/object:Gem::Dependency
71
+ name: better_errors
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - ">="
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ type: :runtime
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - ">="
82
+ - !ruby/object:Gem::Version
83
+ version: '0'
84
+ - !ruby/object:Gem::Dependency
85
+ name: binding_of_caller
86
+ requirement: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - ">="
89
+ - !ruby/object:Gem::Version
90
+ version: '0'
91
+ type: :runtime
92
+ prerelease: false
93
+ version_requirements: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - ">="
96
+ - !ruby/object:Gem::Version
97
+ version: '0'
98
+ - !ruby/object:Gem::Dependency
99
+ name: brakeman
100
+ requirement: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - ">="
103
+ - !ruby/object:Gem::Version
104
+ version: '0'
105
+ type: :runtime
106
+ prerelease: false
107
+ version_requirements: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - ">="
110
+ - !ruby/object:Gem::Version
111
+ version: '0'
112
+ - !ruby/object:Gem::Dependency
113
+ name: bullet
114
+ requirement: !ruby/object:Gem::Requirement
115
+ requirements:
116
+ - - ">="
117
+ - !ruby/object:Gem::Version
118
+ version: '0'
119
+ type: :runtime
120
+ prerelease: false
121
+ version_requirements: !ruby/object:Gem::Requirement
122
+ requirements:
123
+ - - ">="
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
126
+ - !ruby/object:Gem::Dependency
127
+ name: bundler-audit
128
+ requirement: !ruby/object:Gem::Requirement
129
+ requirements:
130
+ - - ">="
131
+ - !ruby/object:Gem::Version
132
+ version: '0'
133
+ type: :runtime
134
+ prerelease: false
135
+ version_requirements: !ruby/object:Gem::Requirement
136
+ requirements:
137
+ - - ">="
138
+ - !ruby/object:Gem::Version
139
+ version: '0'
140
+ - !ruby/object:Gem::Dependency
141
+ name: capybara
142
+ requirement: !ruby/object:Gem::Requirement
143
+ requirements:
144
+ - - ">="
145
+ - !ruby/object:Gem::Version
146
+ version: '0'
147
+ type: :runtime
148
+ prerelease: false
149
+ version_requirements: !ruby/object:Gem::Requirement
150
+ requirements:
151
+ - - ">="
152
+ - !ruby/object:Gem::Version
153
+ version: '0'
154
+ - !ruby/object:Gem::Dependency
155
+ name: cuprite
156
+ requirement: !ruby/object:Gem::Requirement
157
+ requirements:
158
+ - - ">="
159
+ - !ruby/object:Gem::Version
160
+ version: '0'
161
+ type: :runtime
162
+ prerelease: false
163
+ version_requirements: !ruby/object:Gem::Requirement
164
+ requirements:
165
+ - - ">="
166
+ - !ruby/object:Gem::Version
167
+ version: '0'
168
+ - !ruby/object:Gem::Dependency
169
+ name: danger-reek
170
+ requirement: !ruby/object:Gem::Requirement
171
+ requirements:
172
+ - - ">="
173
+ - !ruby/object:Gem::Version
174
+ version: '0'
175
+ type: :runtime
176
+ prerelease: false
177
+ version_requirements: !ruby/object:Gem::Requirement
178
+ requirements:
179
+ - - ">="
180
+ - !ruby/object:Gem::Version
181
+ version: '0'
182
+ - !ruby/object:Gem::Dependency
183
+ name: danger-rubocop
184
+ requirement: !ruby/object:Gem::Requirement
185
+ requirements:
186
+ - - ">="
187
+ - !ruby/object:Gem::Version
188
+ version: '0'
189
+ type: :runtime
190
+ prerelease: false
191
+ version_requirements: !ruby/object:Gem::Requirement
192
+ requirements:
193
+ - - ">="
194
+ - !ruby/object:Gem::Version
195
+ version: '0'
196
+ - !ruby/object:Gem::Dependency
197
+ name: danger-simplecov_json
198
+ requirement: !ruby/object:Gem::Requirement
199
+ requirements:
200
+ - - ">="
201
+ - !ruby/object:Gem::Version
202
+ version: '0'
203
+ type: :runtime
204
+ prerelease: false
205
+ version_requirements: !ruby/object:Gem::Requirement
206
+ requirements:
207
+ - - ">="
208
+ - !ruby/object:Gem::Version
209
+ version: '0'
210
+ - !ruby/object:Gem::Dependency
211
+ name: danger-todoist
212
+ requirement: !ruby/object:Gem::Requirement
213
+ requirements:
214
+ - - ">="
215
+ - !ruby/object:Gem::Version
216
+ version: '0'
217
+ type: :runtime
218
+ prerelease: false
219
+ version_requirements: !ruby/object:Gem::Requirement
220
+ requirements:
221
+ - - ">="
222
+ - !ruby/object:Gem::Version
223
+ version: '0'
224
+ - !ruby/object:Gem::Dependency
225
+ name: danger
226
+ requirement: !ruby/object:Gem::Requirement
227
+ requirements:
228
+ - - ">="
229
+ - !ruby/object:Gem::Version
230
+ version: '0'
231
+ type: :runtime
232
+ prerelease: false
233
+ version_requirements: !ruby/object:Gem::Requirement
234
+ requirements:
235
+ - - ">="
236
+ - !ruby/object:Gem::Version
237
+ version: '0'
238
+ - !ruby/object:Gem::Dependency
239
+ name: dry-configurable
240
+ requirement: !ruby/object:Gem::Requirement
241
+ requirements:
242
+ - - "~>"
243
+ - !ruby/object:Gem::Version
244
+ version: '1'
245
+ type: :runtime
246
+ prerelease: false
247
+ version_requirements: !ruby/object:Gem::Requirement
248
+ requirements:
249
+ - - "~>"
250
+ - !ruby/object:Gem::Version
251
+ version: '1'
252
+ - !ruby/object:Gem::Dependency
253
+ name: erb_lint
254
+ requirement: !ruby/object:Gem::Requirement
255
+ requirements:
256
+ - - ">="
257
+ - !ruby/object:Gem::Version
258
+ version: '0'
259
+ type: :runtime
260
+ prerelease: false
261
+ version_requirements: !ruby/object:Gem::Requirement
262
+ requirements:
263
+ - - ">="
264
+ - !ruby/object:Gem::Version
265
+ version: '0'
266
+ - !ruby/object:Gem::Dependency
267
+ name: factory_bot_rails
268
+ requirement: !ruby/object:Gem::Requirement
269
+ requirements:
270
+ - - ">="
271
+ - !ruby/object:Gem::Version
272
+ version: '0'
273
+ type: :runtime
274
+ prerelease: false
275
+ version_requirements: !ruby/object:Gem::Requirement
276
+ requirements:
277
+ - - ">="
278
+ - !ruby/object:Gem::Version
279
+ version: '0'
280
+ - !ruby/object:Gem::Dependency
281
+ name: faker
282
+ requirement: !ruby/object:Gem::Requirement
283
+ requirements:
284
+ - - ">="
285
+ - !ruby/object:Gem::Version
286
+ version: '0'
287
+ type: :runtime
288
+ prerelease: false
289
+ version_requirements: !ruby/object:Gem::Requirement
290
+ requirements:
291
+ - - ">="
292
+ - !ruby/object:Gem::Version
293
+ version: '0'
294
+ - !ruby/object:Gem::Dependency
295
+ name: faraday-multipart
296
+ requirement: !ruby/object:Gem::Requirement
297
+ requirements:
298
+ - - "~>"
299
+ - !ruby/object:Gem::Version
300
+ version: '1'
301
+ type: :runtime
302
+ prerelease: false
303
+ version_requirements: !ruby/object:Gem::Requirement
304
+ requirements:
305
+ - - "~>"
306
+ - !ruby/object:Gem::Version
307
+ version: '1'
308
+ - !ruby/object:Gem::Dependency
309
+ name: faraday-retry
310
+ requirement: !ruby/object:Gem::Requirement
311
+ requirements:
312
+ - - "~>"
313
+ - !ruby/object:Gem::Version
314
+ version: '2'
315
+ type: :runtime
316
+ prerelease: false
317
+ version_requirements: !ruby/object:Gem::Requirement
318
+ requirements:
319
+ - - "~>"
320
+ - !ruby/object:Gem::Version
321
+ version: '2'
322
+ - !ruby/object:Gem::Dependency
323
+ name: faraday
324
+ requirement: !ruby/object:Gem::Requirement
325
+ requirements:
326
+ - - "~>"
327
+ - !ruby/object:Gem::Version
328
+ version: '2'
329
+ type: :runtime
330
+ prerelease: false
331
+ version_requirements: !ruby/object:Gem::Requirement
332
+ requirements:
333
+ - - "~>"
334
+ - !ruby/object:Gem::Version
335
+ version: '2'
336
+ - !ruby/object:Gem::Dependency
337
+ name: fasterer
338
+ requirement: !ruby/object:Gem::Requirement
339
+ requirements:
340
+ - - ">="
341
+ - !ruby/object:Gem::Version
342
+ version: '0'
343
+ type: :runtime
344
+ prerelease: false
345
+ version_requirements: !ruby/object:Gem::Requirement
346
+ requirements:
347
+ - - ">="
348
+ - !ruby/object:Gem::Version
349
+ version: '0'
350
+ - !ruby/object:Gem::Dependency
351
+ name: generator_spec
352
+ requirement: !ruby/object:Gem::Requirement
353
+ requirements:
354
+ - - ">="
355
+ - !ruby/object:Gem::Version
356
+ version: '0'
357
+ type: :runtime
358
+ prerelease: false
359
+ version_requirements: !ruby/object:Gem::Requirement
360
+ requirements:
361
+ - - ">="
362
+ - !ruby/object:Gem::Version
363
+ version: '0'
364
+ - !ruby/object:Gem::Dependency
365
+ name: image_processing
366
+ requirement: !ruby/object:Gem::Requirement
367
+ requirements:
368
+ - - "~>"
369
+ - !ruby/object:Gem::Version
370
+ version: '1.2'
371
+ type: :runtime
372
+ prerelease: false
373
+ version_requirements: !ruby/object:Gem::Requirement
374
+ requirements:
375
+ - - "~>"
376
+ - !ruby/object:Gem::Version
377
+ version: '1.2'
378
+ - !ruby/object:Gem::Dependency
379
+ name: importmap-rails
380
+ requirement: !ruby/object:Gem::Requirement
381
+ requirements:
382
+ - - "~>"
383
+ - !ruby/object:Gem::Version
384
+ version: '2'
385
+ type: :runtime
386
+ prerelease: false
387
+ version_requirements: !ruby/object:Gem::Requirement
388
+ requirements:
389
+ - - "~>"
390
+ - !ruby/object:Gem::Version
391
+ version: '2'
392
+ - !ruby/object:Gem::Dependency
393
+ name: listen
394
+ requirement: !ruby/object:Gem::Requirement
395
+ requirements:
396
+ - - ">="
397
+ - !ruby/object:Gem::Version
398
+ version: '0'
399
+ type: :runtime
400
+ prerelease: false
401
+ version_requirements: !ruby/object:Gem::Requirement
402
+ requirements:
403
+ - - ">="
404
+ - !ruby/object:Gem::Version
405
+ version: '0'
406
+ - !ruby/object:Gem::Dependency
407
+ name: lookbook
408
+ requirement: !ruby/object:Gem::Requirement
409
+ requirements:
410
+ - - "~>"
411
+ - !ruby/object:Gem::Version
412
+ version: '2'
413
+ type: :runtime
414
+ prerelease: false
415
+ version_requirements: !ruby/object:Gem::Requirement
416
+ requirements:
417
+ - - "~>"
418
+ - !ruby/object:Gem::Version
419
+ version: '2'
420
+ - !ruby/object:Gem::Dependency
421
+ name: omniauth-github
422
+ requirement: !ruby/object:Gem::Requirement
423
+ requirements:
424
+ - - "~>"
425
+ - !ruby/object:Gem::Version
426
+ version: '2.0'
427
+ type: :runtime
428
+ prerelease: false
429
+ version_requirements: !ruby/object:Gem::Requirement
430
+ requirements:
431
+ - - "~>"
432
+ - !ruby/object:Gem::Version
433
+ version: '2.0'
434
+ - !ruby/object:Gem::Dependency
435
+ name: omniauth-google-oauth2
436
+ requirement: !ruby/object:Gem::Requirement
437
+ requirements:
438
+ - - "~>"
439
+ - !ruby/object:Gem::Version
440
+ version: '1.1'
441
+ type: :runtime
442
+ prerelease: false
443
+ version_requirements: !ruby/object:Gem::Requirement
444
+ requirements:
445
+ - - "~>"
446
+ - !ruby/object:Gem::Version
447
+ version: '1.1'
448
+ - !ruby/object:Gem::Dependency
449
+ name: omniauth-microsoft_graph
450
+ requirement: !ruby/object:Gem::Requirement
451
+ requirements:
452
+ - - "~>"
453
+ - !ruby/object:Gem::Version
454
+ version: '2.0'
455
+ type: :runtime
456
+ prerelease: false
457
+ version_requirements: !ruby/object:Gem::Requirement
458
+ requirements:
459
+ - - "~>"
460
+ - !ruby/object:Gem::Version
461
+ version: '2.0'
462
+ - !ruby/object:Gem::Dependency
463
+ name: omniauth-rails_csrf_protection
464
+ requirement: !ruby/object:Gem::Requirement
465
+ requirements:
466
+ - - "~>"
467
+ - !ruby/object:Gem::Version
468
+ version: '1.0'
469
+ type: :runtime
470
+ prerelease: false
471
+ version_requirements: !ruby/object:Gem::Requirement
472
+ requirements:
473
+ - - "~>"
474
+ - !ruby/object:Gem::Version
475
+ version: '1.0'
476
+ - !ruby/object:Gem::Dependency
477
+ name: omniauth
478
+ requirement: !ruby/object:Gem::Requirement
479
+ requirements:
480
+ - - "~>"
481
+ - !ruby/object:Gem::Version
482
+ version: '2.1'
483
+ type: :runtime
484
+ prerelease: false
485
+ version_requirements: !ruby/object:Gem::Requirement
486
+ requirements:
487
+ - - "~>"
488
+ - !ruby/object:Gem::Version
489
+ version: '2.1'
490
+ - !ruby/object:Gem::Dependency
491
+ name: paper_trail
492
+ requirement: !ruby/object:Gem::Requirement
493
+ requirements:
494
+ - - "~>"
495
+ - !ruby/object:Gem::Version
496
+ version: '15'
497
+ type: :runtime
498
+ prerelease: false
499
+ version_requirements: !ruby/object:Gem::Requirement
500
+ requirements:
501
+ - - "~>"
502
+ - !ruby/object:Gem::Version
503
+ version: '15'
504
+ - !ruby/object:Gem::Dependency
505
+ name: pg
506
+ requirement: !ruby/object:Gem::Requirement
507
+ requirements:
508
+ - - "~>"
509
+ - !ruby/object:Gem::Version
510
+ version: '1.5'
511
+ type: :runtime
512
+ prerelease: false
513
+ version_requirements: !ruby/object:Gem::Requirement
514
+ requirements:
515
+ - - "~>"
516
+ - !ruby/object:Gem::Version
517
+ version: '1.5'
518
+ - !ruby/object:Gem::Dependency
519
+ name: propshaft
520
+ requirement: !ruby/object:Gem::Requirement
521
+ requirements:
522
+ - - "~>"
523
+ - !ruby/object:Gem::Version
524
+ version: '1.1'
525
+ type: :runtime
526
+ prerelease: false
527
+ version_requirements: !ruby/object:Gem::Requirement
528
+ requirements:
529
+ - - "~>"
530
+ - !ruby/object:Gem::Version
531
+ version: '1.1'
532
+ - !ruby/object:Gem::Dependency
533
+ name: puma
534
+ requirement: !ruby/object:Gem::Requirement
535
+ requirements:
536
+ - - ">="
537
+ - !ruby/object:Gem::Version
538
+ version: '0'
539
+ type: :runtime
540
+ prerelease: false
541
+ version_requirements: !ruby/object:Gem::Requirement
542
+ requirements:
543
+ - - ">="
544
+ - !ruby/object:Gem::Version
545
+ version: '0'
546
+ - !ruby/object:Gem::Dependency
547
+ name: rails
548
+ requirement: !ruby/object:Gem::Requirement
549
+ requirements:
550
+ - - ">="
551
+ - !ruby/object:Gem::Version
552
+ version: '7.1'
553
+ type: :runtime
554
+ prerelease: false
555
+ version_requirements: !ruby/object:Gem::Requirement
556
+ requirements:
557
+ - - ">="
558
+ - !ruby/object:Gem::Version
559
+ version: '7.1'
560
+ - !ruby/object:Gem::Dependency
561
+ name: rake
562
+ requirement: !ruby/object:Gem::Requirement
563
+ requirements:
564
+ - - ">="
565
+ - !ruby/object:Gem::Version
566
+ version: '0'
567
+ type: :runtime
568
+ prerelease: false
569
+ version_requirements: !ruby/object:Gem::Requirement
570
+ requirements:
571
+ - - ">="
572
+ - !ruby/object:Gem::Version
573
+ version: '0'
574
+ - !ruby/object:Gem::Dependency
575
+ name: redis
576
+ requirement: !ruby/object:Gem::Requirement
577
+ requirements:
578
+ - - ">="
579
+ - !ruby/object:Gem::Version
580
+ version: '0'
581
+ type: :runtime
582
+ prerelease: false
583
+ version_requirements: !ruby/object:Gem::Requirement
584
+ requirements:
585
+ - - ">="
586
+ - !ruby/object:Gem::Version
587
+ version: '0'
588
+ - !ruby/object:Gem::Dependency
589
+ name: rspec-core
590
+ requirement: !ruby/object:Gem::Requirement
591
+ requirements:
592
+ - - "~>"
593
+ - !ruby/object:Gem::Version
594
+ version: '3.13'
595
+ type: :runtime
596
+ prerelease: false
597
+ version_requirements: !ruby/object:Gem::Requirement
598
+ requirements:
599
+ - - "~>"
600
+ - !ruby/object:Gem::Version
601
+ version: '3.13'
602
+ - !ruby/object:Gem::Dependency
603
+ name: rspec-github
604
+ requirement: !ruby/object:Gem::Requirement
605
+ requirements:
606
+ - - ">="
607
+ - !ruby/object:Gem::Version
608
+ version: '0'
609
+ type: :runtime
610
+ prerelease: false
611
+ version_requirements: !ruby/object:Gem::Requirement
612
+ requirements:
613
+ - - ">="
614
+ - !ruby/object:Gem::Version
615
+ version: '0'
616
+ - !ruby/object:Gem::Dependency
617
+ name: rspec-rails
618
+ requirement: !ruby/object:Gem::Requirement
619
+ requirements:
620
+ - - "~>"
621
+ - !ruby/object:Gem::Version
622
+ version: '7.1'
623
+ type: :runtime
624
+ prerelease: false
625
+ version_requirements: !ruby/object:Gem::Requirement
626
+ requirements:
627
+ - - "~>"
628
+ - !ruby/object:Gem::Version
629
+ version: '7.1'
630
+ - !ruby/object:Gem::Dependency
631
+ name: ruby-lsp
632
+ requirement: !ruby/object:Gem::Requirement
633
+ requirements:
634
+ - - ">="
635
+ - !ruby/object:Gem::Version
636
+ version: '0'
637
+ type: :runtime
638
+ prerelease: false
639
+ version_requirements: !ruby/object:Gem::Requirement
640
+ requirements:
641
+ - - ">="
642
+ - !ruby/object:Gem::Version
643
+ version: '0'
644
+ - !ruby/object:Gem::Dependency
645
+ name: shoulda-matchers
646
+ requirement: !ruby/object:Gem::Requirement
647
+ requirements:
648
+ - - ">="
649
+ - !ruby/object:Gem::Version
650
+ version: '0'
651
+ type: :runtime
652
+ prerelease: false
653
+ version_requirements: !ruby/object:Gem::Requirement
654
+ requirements:
655
+ - - ">="
656
+ - !ruby/object:Gem::Version
657
+ version: '0'
658
+ - !ruby/object:Gem::Dependency
659
+ name: silencer
660
+ requirement: !ruby/object:Gem::Requirement
661
+ requirements:
662
+ - - "~>"
663
+ - !ruby/object:Gem::Version
664
+ version: '2.0'
665
+ type: :runtime
666
+ prerelease: false
667
+ version_requirements: !ruby/object:Gem::Requirement
668
+ requirements:
669
+ - - "~>"
670
+ - !ruby/object:Gem::Version
671
+ version: '2.0'
672
+ - !ruby/object:Gem::Dependency
673
+ name: simplecov_json_formatter
674
+ requirement: !ruby/object:Gem::Requirement
675
+ requirements:
676
+ - - ">="
677
+ - !ruby/object:Gem::Version
678
+ version: '0'
679
+ type: :runtime
680
+ prerelease: false
681
+ version_requirements: !ruby/object:Gem::Requirement
682
+ requirements:
683
+ - - ">="
684
+ - !ruby/object:Gem::Version
685
+ version: '0'
686
+ - !ruby/object:Gem::Dependency
687
+ name: simplecov_lcov_formatter
688
+ requirement: !ruby/object:Gem::Requirement
689
+ requirements:
690
+ - - ">="
691
+ - !ruby/object:Gem::Version
692
+ version: '0'
693
+ type: :runtime
694
+ prerelease: false
695
+ version_requirements: !ruby/object:Gem::Requirement
696
+ requirements:
697
+ - - ">="
698
+ - !ruby/object:Gem::Version
699
+ version: '0'
700
+ - !ruby/object:Gem::Dependency
701
+ name: simplecov-json
702
+ requirement: !ruby/object:Gem::Requirement
703
+ requirements:
704
+ - - ">="
705
+ - !ruby/object:Gem::Version
706
+ version: '0'
707
+ type: :runtime
708
+ prerelease: false
709
+ version_requirements: !ruby/object:Gem::Requirement
710
+ requirements:
711
+ - - ">="
712
+ - !ruby/object:Gem::Version
713
+ version: '0'
714
+ - !ruby/object:Gem::Dependency
715
+ name: simplecov-lcov
716
+ requirement: !ruby/object:Gem::Requirement
717
+ requirements:
718
+ - - ">="
719
+ - !ruby/object:Gem::Version
720
+ version: '0'
721
+ type: :runtime
722
+ prerelease: false
723
+ version_requirements: !ruby/object:Gem::Requirement
724
+ requirements:
725
+ - - ">="
726
+ - !ruby/object:Gem::Version
727
+ version: '0'
728
+ - !ruby/object:Gem::Dependency
729
+ name: simplecov
730
+ requirement: !ruby/object:Gem::Requirement
731
+ requirements:
732
+ - - "~>"
733
+ - !ruby/object:Gem::Version
734
+ version: '0.22'
735
+ type: :runtime
736
+ prerelease: false
737
+ version_requirements: !ruby/object:Gem::Requirement
738
+ requirements:
739
+ - - "~>"
740
+ - !ruby/object:Gem::Version
741
+ version: '0.22'
742
+ - !ruby/object:Gem::Dependency
743
+ name: standard-rails
744
+ requirement: !ruby/object:Gem::Requirement
745
+ requirements:
746
+ - - ">="
747
+ - !ruby/object:Gem::Version
748
+ version: '0'
749
+ type: :runtime
750
+ prerelease: false
751
+ version_requirements: !ruby/object:Gem::Requirement
752
+ requirements:
753
+ - - ">="
754
+ - !ruby/object:Gem::Version
755
+ version: '0'
756
+ - !ruby/object:Gem::Dependency
757
+ name: standard
758
+ requirement: !ruby/object:Gem::Requirement
759
+ requirements:
760
+ - - ">="
761
+ - !ruby/object:Gem::Version
762
+ version: '0'
763
+ type: :runtime
764
+ prerelease: false
765
+ version_requirements: !ruby/object:Gem::Requirement
766
+ requirements:
767
+ - - ">="
768
+ - !ruby/object:Gem::Version
769
+ version: '0'
770
+ - !ruby/object:Gem::Dependency
771
+ name: stimulus-rails
772
+ requirement: !ruby/object:Gem::Requirement
773
+ requirements:
774
+ - - "~>"
775
+ - !ruby/object:Gem::Version
776
+ version: '1.3'
777
+ type: :runtime
778
+ prerelease: false
779
+ version_requirements: !ruby/object:Gem::Requirement
780
+ requirements:
781
+ - - "~>"
782
+ - !ruby/object:Gem::Version
783
+ version: '1.3'
784
+ - !ruby/object:Gem::Dependency
785
+ name: tailwindcss-rails
786
+ requirement: !ruby/object:Gem::Requirement
787
+ requirements:
788
+ - - "~>"
789
+ - !ruby/object:Gem::Version
790
+ version: '3'
791
+ type: :runtime
792
+ prerelease: false
793
+ version_requirements: !ruby/object:Gem::Requirement
794
+ requirements:
795
+ - - "~>"
796
+ - !ruby/object:Gem::Version
797
+ version: '3'
798
+ - !ruby/object:Gem::Dependency
799
+ name: turbo-rails
800
+ requirement: !ruby/object:Gem::Requirement
801
+ requirements:
802
+ - - "~>"
803
+ - !ruby/object:Gem::Version
804
+ version: '2.0'
805
+ type: :runtime
806
+ prerelease: false
807
+ version_requirements: !ruby/object:Gem::Requirement
808
+ requirements:
809
+ - - "~>"
810
+ - !ruby/object:Gem::Version
811
+ version: '2.0'
812
+ - !ruby/object:Gem::Dependency
813
+ name: view_component
814
+ requirement: !ruby/object:Gem::Requirement
815
+ requirements:
816
+ - - "~>"
817
+ - !ruby/object:Gem::Version
818
+ version: '3'
819
+ type: :runtime
820
+ prerelease: false
821
+ version_requirements: !ruby/object:Gem::Requirement
822
+ requirements:
823
+ - - "~>"
824
+ - !ruby/object:Gem::Version
825
+ version: '3'
826
+ - !ruby/object:Gem::Dependency
827
+ name: yamllint
828
+ requirement: !ruby/object:Gem::Requirement
829
+ requirements:
830
+ - - ">="
831
+ - !ruby/object:Gem::Version
832
+ version: '0'
833
+ type: :runtime
834
+ prerelease: false
835
+ version_requirements: !ruby/object:Gem::Requirement
836
+ requirements:
837
+ - - ">="
838
+ - !ruby/object:Gem::Version
839
+ version: '0'
840
+ - !ruby/object:Gem::Dependency
841
+ name: yard-activerecord
842
+ requirement: !ruby/object:Gem::Requirement
843
+ requirements:
844
+ - - ">="
845
+ - !ruby/object:Gem::Version
846
+ version: '0'
847
+ type: :runtime
848
+ prerelease: false
849
+ version_requirements: !ruby/object:Gem::Requirement
850
+ requirements:
851
+ - - ">="
852
+ - !ruby/object:Gem::Version
853
+ version: '0'
854
+ description: Shared development tools, configurations, and utilities for Panda CMS
855
+ and its related projects
856
+ email:
857
+ - bamboo@pandacms.io
858
+ executables: []
859
+ extensions: []
860
+ extra_rdoc_files: []
861
+ files:
862
+ - LICENSE
863
+ - README.md
864
+ - Rakefile
865
+ - lib/generators/panda/core/install/install_generator.rb
866
+ - lib/generators/panda/core/install/templates/initializer.rb
867
+ - lib/generators/panda/core/templates_generator.rb
868
+ - lib/panda/core.rb
869
+ - lib/panda/core/media.rb
870
+ - lib/panda/core/railtie.rb
871
+ - lib/panda/core/seo.rb
872
+ - lib/panda/core/services/base_service.rb
873
+ - lib/panda/core/sluggable.rb
874
+ - lib/panda/core/version.rb
875
+ homepage: https://github.com/tastybamboo/panda-core
876
+ licenses:
877
+ - BSD-3-Clause
878
+ metadata:
879
+ homepage_uri: https://github.com/tastybamboo/panda-core
880
+ source_code_uri: https://github.com/tastybamboo/panda-core
881
+ changelog_uri: https://github.com/tastybamboo/panda-core/blob/main/CHANGELOG.md
882
+ post_install_message:
883
+ rdoc_options: []
884
+ require_paths:
885
+ - lib
886
+ required_ruby_version: !ruby/object:Gem::Requirement
887
+ requirements:
888
+ - - ">="
889
+ - !ruby/object:Gem::Version
890
+ version: 3.0.0
891
+ required_rubygems_version: !ruby/object:Gem::Requirement
892
+ requirements:
893
+ - - ">="
894
+ - !ruby/object:Gem::Version
895
+ version: '0'
896
+ requirements: []
897
+ rubygems_version: 3.5.18
898
+ signing_key:
899
+ specification_version: 4
900
+ summary: Core libraries and development tools for Panda Software projects
901
+ test_files: []