panda-core 0.1.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 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: []