rails_ai 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 +7 -0
- data/.rspec_status +96 -0
- data/AGENT_GUIDE.md +513 -0
- data/Appraisals +49 -0
- data/COMMERCIAL_LICENSE_TEMPLATE.md +92 -0
- data/FEATURES.md +204 -0
- data/LEGAL_PROTECTION_GUIDE.md +222 -0
- data/LICENSE +62 -0
- data/LICENSE_SUMMARY.md +74 -0
- data/MIT-LICENSE +62 -0
- data/PERFORMANCE.md +300 -0
- data/PROVIDERS.md +495 -0
- data/README.md +454 -0
- data/Rakefile +11 -0
- data/SPEED_OPTIMIZATIONS.md +217 -0
- data/STRUCTURE.md +139 -0
- data/USAGE_GUIDE.md +288 -0
- data/app/channels/ai_stream_channel.rb +33 -0
- data/app/components/ai/prompt_component.rb +25 -0
- data/app/controllers/concerns/ai/context_aware.rb +77 -0
- data/app/controllers/concerns/ai/streaming.rb +41 -0
- data/app/helpers/ai_helper.rb +164 -0
- data/app/jobs/ai/generate_embedding_job.rb +25 -0
- data/app/jobs/ai/generate_summary_job.rb +25 -0
- data/app/models/concerns/ai/embeddable.rb +38 -0
- data/app/views/rails_ai/dashboard/index.html.erb +51 -0
- data/config/routes.rb +19 -0
- data/lib/generators/rails_ai/install/install_generator.rb +38 -0
- data/lib/rails_ai/agents/agent_manager.rb +258 -0
- data/lib/rails_ai/agents/agent_team.rb +243 -0
- data/lib/rails_ai/agents/base_agent.rb +331 -0
- data/lib/rails_ai/agents/collaboration.rb +238 -0
- data/lib/rails_ai/agents/memory.rb +116 -0
- data/lib/rails_ai/agents/message_bus.rb +95 -0
- data/lib/rails_ai/agents/specialized_agents.rb +391 -0
- data/lib/rails_ai/agents/task_queue.rb +111 -0
- data/lib/rails_ai/cache.rb +14 -0
- data/lib/rails_ai/config.rb +40 -0
- data/lib/rails_ai/context.rb +7 -0
- data/lib/rails_ai/context_analyzer.rb +86 -0
- data/lib/rails_ai/engine.rb +48 -0
- data/lib/rails_ai/events.rb +9 -0
- data/lib/rails_ai/image_context.rb +110 -0
- data/lib/rails_ai/performance.rb +231 -0
- data/lib/rails_ai/provider.rb +8 -0
- data/lib/rails_ai/providers/anthropic_adapter.rb +256 -0
- data/lib/rails_ai/providers/base.rb +60 -0
- data/lib/rails_ai/providers/dummy_adapter.rb +29 -0
- data/lib/rails_ai/providers/gemini_adapter.rb +509 -0
- data/lib/rails_ai/providers/openai_adapter.rb +535 -0
- data/lib/rails_ai/providers/secure_anthropic_adapter.rb +206 -0
- data/lib/rails_ai/providers/secure_openai_adapter.rb +284 -0
- data/lib/rails_ai/railtie.rb +48 -0
- data/lib/rails_ai/redactor.rb +12 -0
- data/lib/rails_ai/security/api_key_manager.rb +82 -0
- data/lib/rails_ai/security/audit_logger.rb +46 -0
- data/lib/rails_ai/security/error_handler.rb +62 -0
- data/lib/rails_ai/security/input_validator.rb +176 -0
- data/lib/rails_ai/security/secure_file_handler.rb +45 -0
- data/lib/rails_ai/security/secure_http_client.rb +177 -0
- data/lib/rails_ai/security.rb +0 -0
- data/lib/rails_ai/version.rb +5 -0
- data/lib/rails_ai/window_context.rb +103 -0
- data/lib/rails_ai.rb +502 -0
- data/monitoring/ci_setup_guide.md +214 -0
- data/monitoring/enhanced_monitoring_script.rb +237 -0
- data/monitoring/google_alerts_setup.md +42 -0
- data/monitoring_log_20250921.txt +0 -0
- data/monitoring_script.rb +161 -0
- data/rails_ai.gemspec +54 -0
- data/scripts/security_scanner.rb +353 -0
- data/setup_monitoring.sh +163 -0
- data/wiki/API-Documentation.md +734 -0
- data/wiki/Architecture-Overview.md +672 -0
- data/wiki/Contributing-Guide.md +407 -0
- data/wiki/Development-Setup.md +532 -0
- data/wiki/Home.md +278 -0
- data/wiki/Installation-Guide.md +527 -0
- data/wiki/Quick-Start.md +186 -0
- data/wiki/README.md +135 -0
- data/wiki/Release-Process.md +467 -0
- metadata +385 -0
@@ -0,0 +1,237 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require 'net/http'
|
5
|
+
require 'json'
|
6
|
+
require 'uri'
|
7
|
+
require 'date'
|
8
|
+
require 'csv'
|
9
|
+
|
10
|
+
class EnhancedRailsAIMonitor
|
11
|
+
def initialize
|
12
|
+
@search_terms = [
|
13
|
+
'"rails_ai" gem commercial',
|
14
|
+
'"rails_ai" business usage',
|
15
|
+
'"rails_ai" enterprise',
|
16
|
+
'"rails_ai" license commercial',
|
17
|
+
'"Rails AI" gem commercial',
|
18
|
+
'"Rails AI" business usage',
|
19
|
+
'"Rails AI" enterprise',
|
20
|
+
'"Rails AI" license commercial'
|
21
|
+
]
|
22
|
+
|
23
|
+
@exclude_terms = [
|
24
|
+
'rails_ai_tag',
|
25
|
+
'rails-ai-tag',
|
26
|
+
'rails_ai_image_tag',
|
27
|
+
'rails_ai_helper'
|
28
|
+
]
|
29
|
+
|
30
|
+
@results = []
|
31
|
+
@log_file = "monitoring_log_#{Date.today.strftime('%Y%m%d')}.txt"
|
32
|
+
@csv_file = "monitoring_results_#{Date.today.strftime('%Y%m%d')}.csv"
|
33
|
+
end
|
34
|
+
|
35
|
+
def run_enhanced_checks
|
36
|
+
puts "🔍 Starting Enhanced Rails AI monitoring checks..."
|
37
|
+
puts "📅 Date: #{Date.today}"
|
38
|
+
puts "🎯 Monitoring: rails_ai gem (excluding rails_ai_tag)"
|
39
|
+
puts "=" * 50
|
40
|
+
|
41
|
+
check_rubygems_enhanced
|
42
|
+
check_github_enhanced
|
43
|
+
check_web_mentions
|
44
|
+
check_social_media_mentions
|
45
|
+
check_competitor_analysis
|
46
|
+
|
47
|
+
save_results
|
48
|
+
generate_csv_report
|
49
|
+
send_alerts_if_needed
|
50
|
+
|
51
|
+
puts "✅ Enhanced monitoring checks completed."
|
52
|
+
puts "📊 Results saved to: #{@log_file}"
|
53
|
+
puts "📈 CSV report saved to: #{@csv_file}"
|
54
|
+
end
|
55
|
+
|
56
|
+
private
|
57
|
+
|
58
|
+
def check_rubygems_enhanced
|
59
|
+
puts "🔍 Enhanced RubyGems monitoring..."
|
60
|
+
|
61
|
+
begin
|
62
|
+
# Check for your gem specifically
|
63
|
+
uri = URI('https://rubygems.org/api/v1/gems/rails_ai.json')
|
64
|
+
response = Net::HTTP.get_response(uri)
|
65
|
+
|
66
|
+
if response.code == '200'
|
67
|
+
gem_info = JSON.parse(response.body)
|
68
|
+
puts " 📦 Your gem stats:"
|
69
|
+
puts " - Downloads: #{gem_info['downloads']}"
|
70
|
+
puts " - Version: #{gem_info['version']}"
|
71
|
+
puts " - Info: #{gem_info['info']}"
|
72
|
+
|
73
|
+
@results << {
|
74
|
+
type: 'rubygems_own',
|
75
|
+
name: 'rails_ai',
|
76
|
+
downloads: gem_info['downloads'],
|
77
|
+
version: gem_info['version'],
|
78
|
+
timestamp: Time.now
|
79
|
+
}
|
80
|
+
end
|
81
|
+
|
82
|
+
# Check for similar gems
|
83
|
+
uri = URI('https://rubygems.org/api/v1/search.json')
|
84
|
+
params = { query: 'rails_ai' }
|
85
|
+
uri.query = URI.encode_www_form(params)
|
86
|
+
|
87
|
+
response = Net::HTTP.get_response(uri)
|
88
|
+
if response.code == '200'
|
89
|
+
gems = JSON.parse(response.body)
|
90
|
+
|
91
|
+
suspicious_gems = gems.select do |gem|
|
92
|
+
name = gem['name'].downcase
|
93
|
+
(name.include?('rails') && name.include?('ai') &&
|
94
|
+
!@exclude_terms.any? { |exclude| name.include?(exclude) } &&
|
95
|
+
name != 'rails_ai')
|
96
|
+
end
|
97
|
+
|
98
|
+
if suspicious_gems.any?
|
99
|
+
puts " ⚠️ Found potentially related gems:"
|
100
|
+
suspicious_gems.each do |gem|
|
101
|
+
puts " - #{gem['name']}: #{gem['info']}"
|
102
|
+
@results << {
|
103
|
+
type: 'rubygems_similar',
|
104
|
+
name: gem['name'],
|
105
|
+
info: gem['info'],
|
106
|
+
downloads: gem['downloads'],
|
107
|
+
timestamp: Time.now
|
108
|
+
}
|
109
|
+
end
|
110
|
+
else
|
111
|
+
puts " ✅ No suspicious gems found"
|
112
|
+
end
|
113
|
+
end
|
114
|
+
rescue => e
|
115
|
+
puts " ❌ Error checking RubyGems: #{e.message}"
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
def check_github_enhanced
|
120
|
+
puts "🔍 Enhanced GitHub monitoring..."
|
121
|
+
|
122
|
+
# This would use GitHub API with authentication
|
123
|
+
# For now, we'll simulate the check
|
124
|
+
puts " 📝 GitHub API check would go here"
|
125
|
+
puts " 🔑 Add GITHUB_PAT secret for full functionality"
|
126
|
+
end
|
127
|
+
|
128
|
+
def check_web_mentions
|
129
|
+
puts "🔍 Checking web mentions..."
|
130
|
+
|
131
|
+
# This would use web scraping or APIs
|
132
|
+
# For now, we'll simulate the check
|
133
|
+
puts " 📝 Web mention check would go here"
|
134
|
+
puts " 🔑 Add GOOGLE_API_KEY secret for full functionality"
|
135
|
+
end
|
136
|
+
|
137
|
+
def check_social_media_mentions
|
138
|
+
puts "�� Checking social media mentions..."
|
139
|
+
|
140
|
+
# This would use social media APIs
|
141
|
+
# For now, we'll simulate the check
|
142
|
+
puts " 📝 Social media check would go here"
|
143
|
+
puts " 🔑 Add social media API keys for full functionality"
|
144
|
+
end
|
145
|
+
|
146
|
+
def check_competitor_analysis
|
147
|
+
puts "🔍 Competitor analysis..."
|
148
|
+
|
149
|
+
# Check for similar AI gems
|
150
|
+
similar_gems = [
|
151
|
+
'openai-ruby',
|
152
|
+
'anthropic-ruby',
|
153
|
+
'gemini-ruby',
|
154
|
+
'ai-ruby',
|
155
|
+
'rails-ai-tools'
|
156
|
+
]
|
157
|
+
|
158
|
+
similar_gems.each do |gem_name|
|
159
|
+
begin
|
160
|
+
uri = URI("https://rubygems.org/api/v1/gems/#{gem_name}.json")
|
161
|
+
response = Net::HTTP.get_response(uri)
|
162
|
+
|
163
|
+
if response.code == '200'
|
164
|
+
gem_info = JSON.parse(response.body)
|
165
|
+
puts " 📊 Competitor: #{gem_name} - #{gem_info['downloads']} downloads"
|
166
|
+
|
167
|
+
@results << {
|
168
|
+
type: 'competitor',
|
169
|
+
name: gem_name,
|
170
|
+
downloads: gem_info['downloads'],
|
171
|
+
version: gem_info['version'],
|
172
|
+
timestamp: Time.now
|
173
|
+
}
|
174
|
+
end
|
175
|
+
rescue => e
|
176
|
+
puts " ⚠️ Could not check #{gem_name}: #{e.message}"
|
177
|
+
end
|
178
|
+
end
|
179
|
+
end
|
180
|
+
|
181
|
+
def save_results
|
182
|
+
return if @results.empty?
|
183
|
+
|
184
|
+
File.open(@log_file, 'a') do |file|
|
185
|
+
file.puts "\n" + "=" * 50
|
186
|
+
file.puts "Enhanced Rails AI Monitoring Results - #{Time.now}"
|
187
|
+
file.puts "Excluding: rails_ai_tag and similar legitimate products"
|
188
|
+
file.puts "=" * 50
|
189
|
+
|
190
|
+
@results.each do |result|
|
191
|
+
file.puts "Type: #{result[:type]}"
|
192
|
+
file.puts "Name: #{result[:name]}"
|
193
|
+
file.puts "Info: #{result[:info]}" if result[:info]
|
194
|
+
file.puts "Downloads: #{result[:downloads]}" if result[:downloads]
|
195
|
+
file.puts "Version: #{result[:version]}" if result[:version]
|
196
|
+
file.puts "Timestamp: #{result[:timestamp]}"
|
197
|
+
file.puts "-" * 30
|
198
|
+
end
|
199
|
+
end
|
200
|
+
end
|
201
|
+
|
202
|
+
def generate_csv_report
|
203
|
+
return if @results.empty?
|
204
|
+
|
205
|
+
CSV.open(@csv_file, 'w') do |csv|
|
206
|
+
csv << ['Type', 'Name', 'Info', 'Downloads', 'Version', 'Timestamp']
|
207
|
+
|
208
|
+
@results.each do |result|
|
209
|
+
csv << [
|
210
|
+
result[:type],
|
211
|
+
result[:name],
|
212
|
+
result[:info] || '',
|
213
|
+
result[:downloads] || '',
|
214
|
+
result[:version] || '',
|
215
|
+
result[:timestamp]
|
216
|
+
]
|
217
|
+
end
|
218
|
+
end
|
219
|
+
end
|
220
|
+
|
221
|
+
def send_alerts_if_needed
|
222
|
+
return if @results.empty?
|
223
|
+
|
224
|
+
puts "🚨 ALERT: Found #{@results.length} potential issues!"
|
225
|
+
puts "Check #{@log_file} for details"
|
226
|
+
puts "📈 CSV report available: #{@csv_file}"
|
227
|
+
|
228
|
+
# Here you could add email notifications
|
229
|
+
# send_email_alert(@results)
|
230
|
+
end
|
231
|
+
end
|
232
|
+
|
233
|
+
# Run the enhanced monitor
|
234
|
+
if __FILE__ == $0
|
235
|
+
monitor = EnhancedRailsAIMonitor.new
|
236
|
+
monitor.run_enhanced_checks
|
237
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# Google Alerts Setup for Rails AI Gem
|
2
|
+
|
3
|
+
## Step 1: Go to Google Alerts
|
4
|
+
Visit: https://www.google.com/alerts
|
5
|
+
|
6
|
+
## Step 2: Create Alerts for These Terms (Focused on YOUR gem):
|
7
|
+
- "rails_ai" gem commercial
|
8
|
+
- "rails_ai" business usage
|
9
|
+
- "rails_ai" enterprise
|
10
|
+
- "rails_ai" license commercial
|
11
|
+
- "Rails AI" gem commercial
|
12
|
+
- "Rails AI" business usage
|
13
|
+
- "Rails AI" enterprise
|
14
|
+
- "Rails AI" license commercial
|
15
|
+
|
16
|
+
## Step 3: Exclude These Terms (Legitimate Products):
|
17
|
+
- rails_ai_tag
|
18
|
+
- rails-ai-tag
|
19
|
+
- rails_ai_image_tag
|
20
|
+
- rails_ai_helper
|
21
|
+
|
22
|
+
## Step 4: Configure Each Alert:
|
23
|
+
- Frequency: As-it-happens
|
24
|
+
- Sources: Everything
|
25
|
+
- Language: English
|
26
|
+
- Region: Any region
|
27
|
+
- Delivery: Your email
|
28
|
+
|
29
|
+
## Step 5: Test Alerts
|
30
|
+
Search for your terms manually to ensure alerts work.
|
31
|
+
|
32
|
+
## What You're Looking For:
|
33
|
+
- Companies using YOUR rails_ai gem commercially
|
34
|
+
- Code copied from YOUR rails_ai gem
|
35
|
+
- Modified versions of YOUR rails_ai gem being sold
|
36
|
+
- API services using YOUR rails_ai gem code
|
37
|
+
|
38
|
+
## What You're NOT Looking For:
|
39
|
+
- rails_ai_tag (different product)
|
40
|
+
- rails-ai-tag (different product)
|
41
|
+
- rails_ai_image_tag (different product)
|
42
|
+
- Other legitimate AI-related gems
|
File without changes
|
@@ -0,0 +1,161 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require 'net/http'
|
5
|
+
require 'json'
|
6
|
+
require 'uri'
|
7
|
+
require 'date'
|
8
|
+
|
9
|
+
class RailsAIMonitor
|
10
|
+
def initialize
|
11
|
+
# Focus on YOUR specific gem, not rails_ai_tag
|
12
|
+
@search_terms = [
|
13
|
+
'"rails_ai" gem commercial',
|
14
|
+
'"rails_ai" business usage',
|
15
|
+
'"rails_ai" enterprise',
|
16
|
+
'"rails_ai" license commercial',
|
17
|
+
'"rails_ai" ruby gem',
|
18
|
+
'"Rails AI" gem commercial',
|
19
|
+
'"Rails AI" business usage',
|
20
|
+
'"Rails AI" enterprise',
|
21
|
+
'"Rails AI" license commercial'
|
22
|
+
]
|
23
|
+
|
24
|
+
# Exclude rails_ai_tag and similar legitimate products
|
25
|
+
@exclude_terms = [
|
26
|
+
'rails_ai_tag',
|
27
|
+
'rails-ai-tag',
|
28
|
+
'rails_ai_image_tag',
|
29
|
+
'rails_ai_helper'
|
30
|
+
]
|
31
|
+
|
32
|
+
@results = []
|
33
|
+
@log_file = "monitoring_log_#{Date.today.strftime('%Y%m%d')}.txt"
|
34
|
+
end
|
35
|
+
|
36
|
+
def run_daily_checks
|
37
|
+
puts "🔍 Starting Rails AI monitoring checks..."
|
38
|
+
puts "📅 Date: #{Date.today}"
|
39
|
+
puts "🎯 Monitoring: rails_ai gem (excluding rails_ai_tag)"
|
40
|
+
puts "=" * 50
|
41
|
+
|
42
|
+
check_github
|
43
|
+
check_rubygems
|
44
|
+
check_google_search
|
45
|
+
|
46
|
+
save_results
|
47
|
+
send_alerts_if_needed
|
48
|
+
|
49
|
+
puts "✅ Monitoring checks completed."
|
50
|
+
puts "📊 Results saved to: #{@log_file}"
|
51
|
+
end
|
52
|
+
|
53
|
+
private
|
54
|
+
|
55
|
+
def check_github
|
56
|
+
puts "🔍 Checking GitHub repositories..."
|
57
|
+
|
58
|
+
# Search for repositories using YOUR rails_ai gem specifically
|
59
|
+
search_queries = [
|
60
|
+
'rails_ai gem language:ruby',
|
61
|
+
'Rails AI gem language:ruby',
|
62
|
+
'rails-ai gem language:ruby',
|
63
|
+
'rails_ai provider language:ruby',
|
64
|
+
'rails_ai agent language:ruby'
|
65
|
+
]
|
66
|
+
|
67
|
+
search_queries.each do |query|
|
68
|
+
puts " Searching: #{query}"
|
69
|
+
# Note: GitHub API requires authentication for search
|
70
|
+
# You would need to add your GitHub token here
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def check_rubygems
|
75
|
+
puts "🔍 Checking RubyGems.org..."
|
76
|
+
|
77
|
+
begin
|
78
|
+
uri = URI('https://rubygems.org/api/v1/search.json')
|
79
|
+
params = { query: 'rails_ai' }
|
80
|
+
uri.query = URI.encode_www_form(params)
|
81
|
+
|
82
|
+
response = Net::HTTP.get_response(uri)
|
83
|
+
if response.code == '200'
|
84
|
+
gems = JSON.parse(response.body)
|
85
|
+
|
86
|
+
# Filter out rails_ai_tag and similar legitimate products
|
87
|
+
suspicious_gems = gems.select do |gem|
|
88
|
+
name = gem['name'].downcase
|
89
|
+
# Look for your specific gem or potential infringements
|
90
|
+
(name.include?('rails') && name.include?('ai') &&
|
91
|
+
!@exclude_terms.any? { |exclude| name.include?(exclude) } &&
|
92
|
+
name != 'rails_ai') # Exclude your own gem
|
93
|
+
end
|
94
|
+
|
95
|
+
if suspicious_gems.any?
|
96
|
+
puts " ⚠️ Found potentially related gems:"
|
97
|
+
suspicious_gems.each do |gem|
|
98
|
+
puts " - #{gem['name']}: #{gem['info']}"
|
99
|
+
@results << {
|
100
|
+
type: 'rubygems',
|
101
|
+
name: gem['name'],
|
102
|
+
info: gem['info'],
|
103
|
+
downloads: gem['downloads'],
|
104
|
+
timestamp: Time.now
|
105
|
+
}
|
106
|
+
end
|
107
|
+
else
|
108
|
+
puts " ✅ No suspicious gems found"
|
109
|
+
end
|
110
|
+
end
|
111
|
+
rescue => e
|
112
|
+
puts " ❌ Error checking RubyGems: #{e.message}"
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
def check_google_search
|
117
|
+
puts "🔍 Checking Google search results..."
|
118
|
+
|
119
|
+
@search_terms.each do |term|
|
120
|
+
puts " Searching: #{term}"
|
121
|
+
# Note: Google Search API requires API key
|
122
|
+
# You would need to add your Google API key here
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
def save_results
|
127
|
+
return if @results.empty?
|
128
|
+
|
129
|
+
File.open(@log_file, 'a') do |file|
|
130
|
+
file.puts "\n" + "=" * 50
|
131
|
+
file.puts "Rails AI Gem Monitoring Results - #{Time.now}"
|
132
|
+
file.puts "Excluding: rails_ai_tag and similar legitimate products"
|
133
|
+
file.puts "=" * 50
|
134
|
+
|
135
|
+
@results.each do |result|
|
136
|
+
file.puts "Type: #{result[:type]}"
|
137
|
+
file.puts "Name: #{result[:name]}"
|
138
|
+
file.puts "Info: #{result[:info]}"
|
139
|
+
file.puts "Downloads: #{result[:downloads]}" if result[:downloads]
|
140
|
+
file.puts "Timestamp: #{result[:timestamp]}"
|
141
|
+
file.puts "-" * 30
|
142
|
+
end
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
def send_alerts_if_needed
|
147
|
+
return if @results.empty?
|
148
|
+
|
149
|
+
puts "🚨 ALERT: Found #{@results.length} potential issues!"
|
150
|
+
puts "Check #{@log_file} for details"
|
151
|
+
|
152
|
+
# Here you could add email notifications
|
153
|
+
# send_email_alert(@results)
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
# Run the monitor
|
158
|
+
if __FILE__ == $0
|
159
|
+
monitor = RailsAIMonitor.new
|
160
|
+
monitor.run_daily_checks
|
161
|
+
end
|
data/rails_ai.gemspec
ADDED
@@ -0,0 +1,54 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "lib/rails_ai/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "rails_ai"
|
7
|
+
s.version = RailsAi::VERSION
|
8
|
+
s.authors = ["Daniel Amah"]
|
9
|
+
s.email = ["amahdanieljack@gmail.com"]
|
10
|
+
s.summary = "AI toolkit deeply integrated into Rails applications"
|
11
|
+
s.description = "A comprehensive AI toolkit for Rails with multi-provider support, context awareness, and performance optimizations"
|
12
|
+
s.homepage = "https://github.com/DanielAmah/rails_ai"
|
13
|
+
s.license = "Nonstandard"
|
14
|
+
s.licenses = ["Nonstandard"]
|
15
|
+
s.required_ruby_version = ">= 2.7.0"
|
16
|
+
|
17
|
+
s.metadata["homepage_uri"] = s.homepage
|
18
|
+
s.metadata["source_code_uri"] = s.homepage
|
19
|
+
s.metadata["changelog_uri"] = "#{s.homepage}/blob/main/CHANGELOG.md"
|
20
|
+
|
21
|
+
s.files = Dir.chdir(__dir__) do
|
22
|
+
`git ls-files -z`.split("\x0").reject do |f|
|
23
|
+
(File.expand_path(f) == __FILE__) ||
|
24
|
+
f.start_with?(*%w[bin/ test/ spec/ features/ .git .github appveyor Gemfile])
|
25
|
+
end
|
26
|
+
end
|
27
|
+
s.bindir = "exe"
|
28
|
+
s.executables = s.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
|
29
|
+
s.require_paths = ["lib"]
|
30
|
+
|
31
|
+
# Core dependencies
|
32
|
+
s.add_dependency "rails", ">= 5.2", "< 9"
|
33
|
+
s.add_dependency "concurrent-ruby", "~> 1.0"
|
34
|
+
|
35
|
+
# Performance dependencies
|
36
|
+
s.add_dependency "benchmark-ips", "~> 2.10"
|
37
|
+
s.add_dependency "connection_pool", "~> 2.4"
|
38
|
+
s.add_dependency "memory_profiler", "~> 1.0"
|
39
|
+
|
40
|
+
# Development dependencies
|
41
|
+
s.add_development_dependency "rspec", "~> 3.12"
|
42
|
+
s.add_development_dependency "rspec-rails", "~> 6.0"
|
43
|
+
s.add_development_dependency "standard", "~> 1.0"
|
44
|
+
s.add_development_dependency "appraisal", "~> 2.4"
|
45
|
+
s.add_development_dependency "pry", "~> 0.14"
|
46
|
+
s.add_development_dependency "pry-byebug", "~> 3.10"
|
47
|
+
s.add_development_dependency "webmock", "~> 3.19"
|
48
|
+
s.add_development_dependency "vcr", "~> 6.2"
|
49
|
+
s.add_development_dependency "simplecov", "~> 0.22"
|
50
|
+
s.add_development_dependency "rubocop", "~> 1.50"
|
51
|
+
s.add_development_dependency "rubocop-rspec", "~> 2.20"
|
52
|
+
s.add_development_dependency "rubocop-performance", "~> 1.17"
|
53
|
+
s.add_development_dependency "rubocop-rails", "~> 2.20"
|
54
|
+
end
|