jekyll-action-network 0.2.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: f925a540d595bae5d52294f40fad85b4ab45bb5ef98ae6dd41b343d753ca433e
4
+ data.tar.gz: 6a60b65be56cfa0fdc36313c4e7c00793c5985ffda6c3570c2a1516177e9bed0
5
+ SHA512:
6
+ metadata.gz: 69c5c92a8d307173cd5c2d90b2ec3513a19b82936c1f397993db6bd23a0bd78e2e5f43cb737f9d46f188d1d39e23dfb2e97a6c851a287718fc047550a686700b
7
+ data.tar.gz: 9ee072992fc8321b2fee437af90f7281178ed7c619afde34a082974ac4894d98bc45be6f0e67b0e196f9d60617b636a791c65916c491ee19c0265d274dd96445
@@ -0,0 +1,155 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "action_network_rest"
4
+ require "jekyll"
5
+ require "yaml"
6
+ require "dotenv/load"
7
+
8
+ ##
9
+ # This class is a Jekyll::Generator that creates collections from
10
+ # Action Network
11
+ module Jekyll
12
+ ##
13
+ # This sub class is a Jekyll::Generator that creates collections from
14
+ # Action Network
15
+ class ActionNetworkGenerator < Jekyll::Generator
16
+ def generate(site)
17
+ return unless site.config["action_network"]
18
+
19
+ @site = site
20
+ @log_name = "Action Network:"
21
+ @settings ||= settings
22
+ @config = site.config["action_network"]
23
+ return unless authenticate
24
+
25
+ @actions = Jekyll::Collection.new(site, "actions") if @config["actions"]
26
+ @config.each do |name, _config|
27
+ next unless @defaults[name]
28
+
29
+ make_collection(name)
30
+ end
31
+ site.collections["actions"] = @actions if @actions
32
+ end
33
+
34
+ def settings
35
+ @settings = YAML.load_file("#{File.expand_path(__dir__)}/settings.yaml")
36
+ @defaults = @settings["defaults"]
37
+ @fields = @settings["fields"]
38
+ @filters = @settings["filters"]
39
+ @settings
40
+ end
41
+
42
+ def make_collection(name)
43
+ if @config[name].is_a?(Hash)
44
+ config = @defaults[name].merge(@config[name])
45
+ config["mappings"] = @defaults[name]["mappings"].merge(@config[name]["mappings"] || {})
46
+ end
47
+ config ||= @defaults[name]
48
+ Jekyll.logger.info @log_name, "Processing #{name}"
49
+ actions = get_full_list(name)
50
+ Jekyll.logger.warn "#{name} before filter: #{actions.length}"
51
+ filtered_actions = filter_actions(name, actions, config)
52
+ Jekyll.logger.warn "#{name} after filter: #{filtered_actions.length}"
53
+ collection = @site.collections[name] if @site.collections[name]
54
+ collection ||= Jekyll::Collection.new(@site, config["collection"])
55
+ filtered_actions.each do |action|
56
+ slug = action["browser_url"].split("/")[-1]
57
+ path = File.join(@site.source, "_#{config["collection"]}", "#{slug}.md")
58
+ doc = Jekyll::Document.new(path, collection: collection, site: @site)
59
+ doc.content = action[config["content"]]
60
+ frontmattter_data = {}
61
+ config["mappings"].each do |a, d|
62
+ frontmattter_data[d] = action[a]
63
+ end
64
+ frontmattter_data.merge!({
65
+ "layout" => config["layout"],
66
+ "slug" => slug,
67
+ "embed_code" => make_embed_code(action["browser_url"]),
68
+ "action_type" => name
69
+ })
70
+ doc.merge_data!(frontmattter_data)
71
+ collection.docs << doc
72
+ @actions.docs << doc if @actions
73
+ end
74
+ @site.collections[config["collection"]] = collection
75
+ end
76
+
77
+ def make_embed_code(browser_url, style = nil)
78
+ relative_url = browser_url.split("://")[1].sub("actionnetwork.org/", "")
79
+ split_url = relative_url.split("/")
80
+ css = @settings["embed"]["styles"][style] if style
81
+ resource = @settings["embed"]["resources"][split_url[0]]
82
+ slug = split_url[1]
83
+ "#{css}<script src='https://actionnetwork.org/widgets/v5/#{resource}/#{slug}?format=js&source=widget'></script>
84
+ <div id='can-#{resource}-area-#{slug}' style='width: 100%'></div>"
85
+ end
86
+
87
+ def get_full_list(name)
88
+ page = 1
89
+ actions = []
90
+ loop do
91
+ action_page = @client.send(name).list(page: page)
92
+ break if action_page.empty?
93
+
94
+ actions.concat(action_page)
95
+ page += 1
96
+ end
97
+ actions
98
+ end
99
+
100
+ def filter_actions(name, actions, _config)
101
+ public = []
102
+ puts @filters["all"]
103
+ puts @filters[name] || {}
104
+ filters = @filters["all"].merge(@filters[name] || {})
105
+ filters = filters.merge(@config["filters"] || {}) if @config.is_a? Hash
106
+ puts filters
107
+ actions.each do |action|
108
+ filtered = true
109
+ filters.each do |key, value|
110
+ unless action[key] == value
111
+ if value == "%" && action[key]
112
+ filtered = false if action[key].length.positive?
113
+ else
114
+ Jekyll.logger.warn @log_name, "#{name} filtered because #{action[key]} == #{value}"
115
+ filtered = true
116
+ break
117
+ end
118
+ end
119
+ filtered = false
120
+ end
121
+ public << reduce_fields(action) unless filtered
122
+ end
123
+ public
124
+ end
125
+
126
+ def reduce_fields(action)
127
+ reduced_action = {}
128
+ @fields.each do |field|
129
+ reduced_action[field] = action[field] if action[field]
130
+ end
131
+ reduced_action
132
+ end
133
+
134
+ def get_api_key(key)
135
+ return unless key
136
+ return ENV.fetch(key[4..key.length - 1], nil) if key[0..3] == "ENV_"
137
+ return ENV["ACTION_NETWORK_API_KEY"] if ENV["ACTION_NETWORK_API_KEY"]
138
+
139
+ key
140
+ end
141
+
142
+ def authenticate
143
+ api_key = get_api_key(@config["key"])
144
+ Jekyll.logger.warn "Action Network API Key not found." unless api_key
145
+ return unless api_key
146
+
147
+ @client = ActionNetworkRest.new(api_key: api_key)
148
+ unless @client.entry_point.authenticated_successfully?
149
+ Jekyll.logger.warn "Action Network Authentication Unsucessful"
150
+ return
151
+ end
152
+ true
153
+ end
154
+ end
155
+ end
@@ -0,0 +1,115 @@
1
+ filters:
2
+ all:
3
+ "action_network:hidden": false
4
+ browser_url: "%"
5
+ events:
6
+ visibility: public
7
+ fields:
8
+ - title
9
+ - description
10
+ - petition_text
11
+ - browser_url
12
+ - image
13
+ - target
14
+ - actions
15
+ - "action_network:sponsor"
16
+ - start_date
17
+ - end_date
18
+ - location
19
+ - visibility
20
+ - capacity
21
+ - host_url
22
+ - total_events
23
+ - total_rsvps
24
+ - call_to_action
25
+ - "action_network:event_campaign_id"
26
+ - type
27
+ embed:
28
+ resources:
29
+ forms: form
30
+ events: event
31
+ petitions: petition
32
+ letters: letter
33
+ call_campaigns: call_campaign
34
+ event_campaigns: event_campaign
35
+ styles:
36
+ standard: <link href='https://actionnetwork.org/css/style-embed-v3.css' rel='stylesheet' type='text/css' />
37
+ layout_only: <link href='https://actionnetwork.org/css/style-embed-whitelabel-v3.css' rel='stylesheet' type='text/css' />
38
+ defaults:
39
+ petitions:
40
+ collection: petitions
41
+ layout: an-petition
42
+ content: description
43
+ mappings:
44
+ title: title
45
+ description: description
46
+ petition_text: petition_text
47
+ browser_url: browser_url
48
+ featured_image_url: image
49
+ target: target
50
+ "action_network:sponsor": sponsor
51
+ campaigns:
52
+ collection: campaigns
53
+ layout: an-campaign
54
+ content: description
55
+ mappings:
56
+ title: title
57
+ description: description
58
+ browser_url: browser_url
59
+ featured_image_url: image
60
+ actions: actions
61
+ "action_network:sponsor": sponsor
62
+ events:
63
+ collection: events
64
+ layout: an-event
65
+ content: description
66
+ mappings:
67
+ title: title
68
+ description: description
69
+ browser_url: browser_url
70
+ featured_image_url: image
71
+ start_date: start_date
72
+ end_date: end_date
73
+ location: location
74
+ "action_network:event_campaign_id": event_campaign_id
75
+ status: status
76
+ visibility: visibility
77
+ capacity: capacity
78
+ "action_network:sponsor": sponsor
79
+ event_campaigns:
80
+ collection: event_campaigns
81
+ layout: an-event_campaign
82
+ content: description
83
+ mappings:
84
+ title: title
85
+ description: description
86
+ browser_url: browser_url
87
+ featured_image_url: image
88
+ host_url: host_url
89
+ total_events: total_events
90
+ total_rsvps: total_rsvps
91
+ "action_network:sponsor": sponsor
92
+ advocacy_campaigns:
93
+ collection: advocacy_campaigns
94
+ layout: an-advocacy_campaign
95
+ content: description
96
+ mappings:
97
+ title: title
98
+ description: description
99
+ type: type
100
+ browser_url: browser_url
101
+ featured_image_url: image
102
+ "action_network:sponsor": sponsor
103
+ targets: targets
104
+ total_outreaches: total_outreaches
105
+ forms:
106
+ collection: forms
107
+ layout: an-form
108
+ content: description
109
+ mappings:
110
+ title: title
111
+ description: description
112
+ call_to_action: call_to_action
113
+ browser_url: browser_url
114
+ featured_image_url: image
115
+ "action_network:sponsor": sponsor
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Jekyll
4
+ module ActionNetwork
5
+ VERSION = "0.2.0"
6
+ end
7
+ end
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "jekyll/action-network/version"
4
+ require "jekyll/action-network/generator"
metadata ADDED
@@ -0,0 +1,116 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: jekyll-action-network
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.0
5
+ platform: ruby
6
+ authors:
7
+ - Joe Irving
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2022-09-18 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: dotenv
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '2.8'
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 2.8.0
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: '2.8'
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 2.8.0
33
+ - !ruby/object:Gem::Dependency
34
+ name: jekyll
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '4.2'
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ version: 4.2.0
43
+ type: :runtime
44
+ prerelease: false
45
+ version_requirements: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - "~>"
48
+ - !ruby/object:Gem::Version
49
+ version: '4.2'
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ version: 4.2.0
53
+ - !ruby/object:Gem::Dependency
54
+ name: bundler
55
+ requirement: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - "~>"
58
+ - !ruby/object:Gem::Version
59
+ version: '2.0'
60
+ type: :development
61
+ prerelease: false
62
+ version_requirements: !ruby/object:Gem::Requirement
63
+ requirements:
64
+ - - "~>"
65
+ - !ruby/object:Gem::Version
66
+ version: '2.0'
67
+ - !ruby/object:Gem::Dependency
68
+ name: rake
69
+ requirement: !ruby/object:Gem::Requirement
70
+ requirements:
71
+ - - "~>"
72
+ - !ruby/object:Gem::Version
73
+ version: 12.3.3
74
+ type: :development
75
+ prerelease: false
76
+ version_requirements: !ruby/object:Gem::Requirement
77
+ requirements:
78
+ - - "~>"
79
+ - !ruby/object:Gem::Version
80
+ version: 12.3.3
81
+ description: ''
82
+ email:
83
+ - joe@tippingpointuk.org
84
+ executables: []
85
+ extensions: []
86
+ extra_rdoc_files: []
87
+ files:
88
+ - lib/jekyll-action-network.rb
89
+ - lib/jekyll/action-network/generator.rb
90
+ - lib/jekyll/action-network/settings.yaml
91
+ - lib/jekyll/action-network/version.rb
92
+ homepage: https://github.com/tippingpointuk/jekyll-action-network/
93
+ licenses:
94
+ - MIT
95
+ metadata:
96
+ rubygems_mfa_required: 'true'
97
+ post_install_message:
98
+ rdoc_options: []
99
+ require_paths:
100
+ - lib
101
+ required_ruby_version: !ruby/object:Gem::Requirement
102
+ requirements:
103
+ - - ">="
104
+ - !ruby/object:Gem::Version
105
+ version: '0'
106
+ required_rubygems_version: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ requirements: []
112
+ rubygems_version: 3.1.2
113
+ signing_key:
114
+ specification_version: 4
115
+ summary: Generate Jekyll collection(s) from Action Network
116
+ test_files: []