active_connect 0.1.0 → 0.1.1
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 +4 -4
- data/README.md +13 -0
- data/app/models/active_connect/active_connect_data.rb +96 -0
- data/app/models/concerns/active_connect_data_integrations/httparty.rb +62 -0
- data/lib/active_connect/engine.rb +6 -0
- data/lib/active_connect/version.rb +2 -3
- data/lib/active_connect.rb +17 -1
- data/lib/generators/{active_scrape → active_connect}/install_generator.rb +6 -2
- data/lib/generators/{active_scrape → active_connect}/templates/connect.yml +1 -1
- data/lib/generators/{active_scrape/templates/create_active_connect_data.rb → active_connect/templates/create_active_connect_active_connect_data.rb} +3 -2
- data/lib/tasks/active_connect_tasks.rake +1 -1
- metadata +11 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c407dc134ca3ffbcb449c3bf7b44c07206efc8e05a92c30de2026bccdb06a954
|
4
|
+
data.tar.gz: eda55e4e6a2aa7747d8d4ad47fdadf5b419fa2c517fdec49191231b1e11bb2ec
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6bc09c444662721174ee1a1b989806ddf3ad6ceaadc7698cb232f7571e80105c88b759014dfbb82b72367730f50794baa50e6d535c56209cc97d6b867bd3870e
|
7
|
+
data.tar.gz: 54f1ed4766f2d61b77d6b461e429574866d3d48ca2d65d9b22cdc3223970e683e854c336b8bedc47250d74a459290c77b635bd47ad2f6d50723fa86f1e483dee
|
data/README.md
CHANGED
@@ -6,7 +6,20 @@ How to use my plugin.
|
|
6
6
|
|
7
7
|
|
8
8
|
# Guide ME
|
9
|
+
RAILS_ENV=test rails db:create
|
9
10
|
RAILS_ENV=test rails generate active_connect:install
|
11
|
+
RAILS_ENV=test rails test
|
12
|
+
|
13
|
+
# Create Migration in dummy app
|
14
|
+
cd test/dummy/
|
15
|
+
RAILS_ENV=test rails generate migration CreateProducts name:string --app=dummy
|
16
|
+
RAILS_ENV=test rails db:migrate
|
17
|
+
|
18
|
+
# Drop
|
19
|
+
RAILS_ENV=test rails db:drop
|
20
|
+
|
21
|
+
|
22
|
+
# RAILS_ENV=test rails db:drop
|
10
23
|
|
11
24
|
## Installation
|
12
25
|
Add this line to your application's Gemfile:
|
@@ -0,0 +1,96 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
# app/models/active_connect/active_connect_data.rb
|
3
|
+
|
4
|
+
require 'yaml'
|
5
|
+
|
6
|
+
module ActiveConnect
|
7
|
+
class ActiveConnectData < ApplicationRecord
|
8
|
+
# Include the HTTParty module for making HTTP requests
|
9
|
+
include ActiveConnectDataIntegrations::Httparty
|
10
|
+
# Define the polymorphic association to the connectable model
|
11
|
+
belongs_to :connectable, polymorphic: true
|
12
|
+
|
13
|
+
# Validate the presence of the service attribute
|
14
|
+
validates :service, presence: true
|
15
|
+
|
16
|
+
# enum status
|
17
|
+
enum :status, [:success, :failed]
|
18
|
+
|
19
|
+
# Master method to fetch data from the service
|
20
|
+
def update_data
|
21
|
+
config = load_service_config # Load the service-specific configuration
|
22
|
+
method_name = "#{config['engine']}_update_data"
|
23
|
+
|
24
|
+
if respond_to?(method_name, true)
|
25
|
+
data = send(method_name)
|
26
|
+
parse_data(data)
|
27
|
+
else
|
28
|
+
raise NoMethodError, "No method defined for engine '#{config['engine']}'"
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def parse_data(data)
|
33
|
+
return unless connectable.respond_to?(:parse_data)
|
34
|
+
|
35
|
+
# Delegate parsing to the connectable model if it has `parse_data` defined
|
36
|
+
connectable.parse_data(data)
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
|
41
|
+
# Load service-specific configuration from the YAML file
|
42
|
+
def load_service_config
|
43
|
+
config = load_yaml_config
|
44
|
+
# Validate the service exists in the YAML config
|
45
|
+
raise "Service '#{service}' not found in configuration" unless config.key?(service)
|
46
|
+
config[service]
|
47
|
+
end
|
48
|
+
|
49
|
+
private
|
50
|
+
|
51
|
+
# Update the status to error and set the run_at timestamp
|
52
|
+
def update_data_failed
|
53
|
+
update(status: :error, run_at: Time.current)
|
54
|
+
end
|
55
|
+
|
56
|
+
# Update the status to success and set the run_at timestamp
|
57
|
+
def update_data_success
|
58
|
+
update(status: :success, run_at: Time.current)
|
59
|
+
end
|
60
|
+
|
61
|
+
# Define the number of request retries defaulting to 0
|
62
|
+
def request_retries
|
63
|
+
load_service_config.dig('request_retries') || 0
|
64
|
+
end
|
65
|
+
|
66
|
+
# Define the sleep time between requests defaulting to 0 seconds
|
67
|
+
def request_sleep
|
68
|
+
load_service_config.dig('sleep') || 0
|
69
|
+
end
|
70
|
+
|
71
|
+
# Define the request timeout defaulting to 60 seconds
|
72
|
+
def request_timeout
|
73
|
+
load_service_config.dig('timeout') || 60
|
74
|
+
end
|
75
|
+
|
76
|
+
# Define the request type defaulting to 'get'
|
77
|
+
def request_type
|
78
|
+
load_service_config.dig('request_type') || 'get'
|
79
|
+
end
|
80
|
+
|
81
|
+
# Define the URL to request data from defaulting to the 'url' column
|
82
|
+
def request_url
|
83
|
+
connectable[load_service_config.dig('url_column') || 'url']
|
84
|
+
end
|
85
|
+
|
86
|
+
# Load the YAML file and handle any errors in locating or parsing it
|
87
|
+
def load_yaml_config
|
88
|
+
config_path = Rails.root.join('config', 'connect.yml')
|
89
|
+
YAML.load_file(config_path, aliases: true)
|
90
|
+
rescue Errno::ENOENT
|
91
|
+
raise "Configuration file 'connect.yml' not found"
|
92
|
+
rescue Psych::SyntaxError => e
|
93
|
+
raise "YAML syntax error occurred while parsing connect.yml: #{e.message}"
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
# Path: app/models/concerns/active_connect_data_integrations/http_party.rb
|
3
|
+
|
4
|
+
require "httparty"
|
5
|
+
|
6
|
+
module ActiveConnectDataIntegrations
|
7
|
+
module Httparty
|
8
|
+
extend ActiveSupport::Concern
|
9
|
+
|
10
|
+
def httparty_update_data
|
11
|
+
@tries = 0
|
12
|
+
options = { headers: headers_settings, timeout: request_timeout }
|
13
|
+
options.merge!(proxy_settings) if proxy_settings
|
14
|
+
data = send_request(options)
|
15
|
+
data = { status: data.code, body: data.body }
|
16
|
+
save_data(data)
|
17
|
+
data
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def save_data(data)
|
23
|
+
data[:status] == 200 ? update_data_success : update_data_failed
|
24
|
+
update(data: data)
|
25
|
+
end
|
26
|
+
|
27
|
+
def send_request(options)
|
28
|
+
sleep(request_sleep) if request_sleep.positive?
|
29
|
+
HTTParty.send(request_type, request_url, options)
|
30
|
+
rescue StandardError => e
|
31
|
+
retry if (@tries += 1) < request_retries
|
32
|
+
raise e
|
33
|
+
end
|
34
|
+
|
35
|
+
def proxy_settings
|
36
|
+
base_proxy_settings = {}
|
37
|
+
proxy_settings = load_service_config.dig('proxy')
|
38
|
+
return unless proxy_settings
|
39
|
+
proxy_split = proxy_settings.split(':')
|
40
|
+
return unless proxy_split.size > 1
|
41
|
+
|
42
|
+
base_proxy_settings[:http_proxyaddr] = proxy_split[0]
|
43
|
+
base_proxy_settings[:http_proxyport] = proxy_split[1]
|
44
|
+
return base_proxy_settings unless proxy_split.size == 4
|
45
|
+
|
46
|
+
base_proxy_settings[:http_proxyuser] = proxy_split[2]
|
47
|
+
base_proxy_settings[:http_proxypass] = proxy_split[3]
|
48
|
+
base_proxy_settings
|
49
|
+
end
|
50
|
+
|
51
|
+
def headers_settings
|
52
|
+
base_headers = {}
|
53
|
+
headers_settings = load_service_config.dig('request_headers')
|
54
|
+
return unless headers_settings
|
55
|
+
|
56
|
+
headers_settings.each do |header_key, header_value|
|
57
|
+
base_headers[header_key] = header_value
|
58
|
+
end
|
59
|
+
base_headers
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
data/lib/active_connect.rb
CHANGED
@@ -5,5 +5,21 @@ require "active_connect/version"
|
|
5
5
|
require "active_connect/engine"
|
6
6
|
|
7
7
|
module ActiveConnect
|
8
|
-
|
8
|
+
extend ActiveSupport::Concern
|
9
|
+
|
10
|
+
class_methods do
|
11
|
+
def has_one_connect(name, service:, dependent: :nullify)
|
12
|
+
# Define an association similar to ActiveStorage's `has_one_attached`
|
13
|
+
has_one :"#{name}_data", -> { where(service: service) }, class_name: "ActiveConnect::ActiveConnectData", as: :connectable, dependent: dependent
|
14
|
+
# Define a method to access the connection service
|
15
|
+
define_method(name) do
|
16
|
+
public_send("#{name}_data")
|
17
|
+
end
|
18
|
+
|
19
|
+
# Define a `connected?` method to check if a connection exists
|
20
|
+
define_method("#{name}_connected?") do
|
21
|
+
public_send("#{name}_data").present?
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
9
25
|
end
|
@@ -18,11 +18,15 @@ module ActiveConnect
|
|
18
18
|
end
|
19
19
|
|
20
20
|
def copy_scrape_yml
|
21
|
-
template "connect.yml", "config/connect.yml"
|
21
|
+
template "connect.yml", Rails.root.join("config/connect.yml")
|
22
22
|
end
|
23
23
|
|
24
24
|
def copy_migrations
|
25
|
-
migration_template "
|
25
|
+
migration_template "create_active_connect_active_connect_data.rb", Rails.root.join("db/migrate/create_active_connect_active_connect_data.rb")
|
26
|
+
end
|
27
|
+
|
28
|
+
def add_require_to_application
|
29
|
+
inject_into_file Rails.root.join("config/application.rb"), "\nrequire 'active_connect'", after: "Bundler.require(*Rails.groups)"
|
26
30
|
end
|
27
31
|
end
|
28
32
|
end
|
@@ -9,7 +9,7 @@ default: &default
|
|
9
9
|
http_party:
|
10
10
|
<<: *default
|
11
11
|
engine: "httparty"
|
12
|
-
|
12
|
+
url_column: "not_url"
|
13
13
|
request_headers:
|
14
14
|
user_agent: "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.110 Safari/537.36"
|
15
15
|
request_type: "get"
|
@@ -1,13 +1,14 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
# lib/generators/active_connect/templates/create_active_connect_data.rb
|
3
3
|
#
|
4
|
-
class
|
4
|
+
class CreateActiveConnectActiveConnectData < ActiveRecord::Migration[7.0]
|
5
5
|
def change
|
6
|
-
create_table :
|
6
|
+
create_table :active_connect_active_connect_data do |t|
|
7
7
|
t.references :connectable, polymorphic: true, index: true
|
8
8
|
t.json :data
|
9
9
|
t.datetime :run_at
|
10
10
|
t.integer :status
|
11
|
+
t.string :service
|
11
12
|
t.timestamps
|
12
13
|
end
|
13
14
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: active_connect
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- andersmarkc
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-11-
|
11
|
+
date: 2024-11-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -48,15 +48,17 @@ files:
|
|
48
48
|
- app/helpers/active_connect/application_helper.rb
|
49
49
|
- app/jobs/active_connect/application_job.rb
|
50
50
|
- app/mailers/active_connect/application_mailer.rb
|
51
|
+
- app/models/active_connect/active_connect_data.rb
|
51
52
|
- app/models/active_connect/application_record.rb
|
53
|
+
- app/models/concerns/active_connect_data_integrations/httparty.rb
|
52
54
|
- app/views/layouts/active_connect/application.html.erb
|
53
55
|
- config/routes.rb
|
54
56
|
- lib/active_connect.rb
|
55
57
|
- lib/active_connect/engine.rb
|
56
58
|
- lib/active_connect/version.rb
|
57
|
-
- lib/generators/
|
58
|
-
- lib/generators/
|
59
|
-
- lib/generators/
|
59
|
+
- lib/generators/active_connect/install_generator.rb
|
60
|
+
- lib/generators/active_connect/templates/connect.yml
|
61
|
+
- lib/generators/active_connect/templates/create_active_connect_active_connect_data.rb
|
60
62
|
- lib/tasks/active_connect_tasks.rake
|
61
63
|
homepage: https://github.com/andersmarkc/active_connect
|
62
64
|
licenses:
|
@@ -65,7 +67,7 @@ metadata:
|
|
65
67
|
homepage_uri: https://github.com/andersmarkc/active_connect
|
66
68
|
source_code_uri: https://github.com/andersmarkc/active_connect
|
67
69
|
changelog_uri: https://github.com/andersmarkc/active_connect/blob/main/CHANGELOG.md
|
68
|
-
post_install_message:
|
70
|
+
post_install_message:
|
69
71
|
rdoc_options: []
|
70
72
|
require_paths:
|
71
73
|
- lib
|
@@ -80,8 +82,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
80
82
|
- !ruby/object:Gem::Version
|
81
83
|
version: '0'
|
82
84
|
requirements: []
|
83
|
-
rubygems_version: 3.
|
84
|
-
signing_key:
|
85
|
+
rubygems_version: 3.4.10
|
86
|
+
signing_key:
|
85
87
|
specification_version: 4
|
86
88
|
summary: A scraping utility for Rails applications, designed to work similarly to
|
87
89
|
ActiveStorage.
|