| @@ -162,6 +162,24 @@ AWS_ACCESS_KEY="your aws access key" | ||
| 162 | 162 | # Set AWS_SANDBOX to true if you're developing Huginn code. | 
| 163 | 163 | AWS_SANDBOX=false | 
| 164 | 164 |  | 
| 165 | +######################### | |
| 166 | +# Additional Agent gems # | |
| 167 | +######################### | |
| 168 | + | |
| 169 | +# Agent gems can be added to Huginn by specifying them in a comma separated | |
| 170 | +# list, the gem version and arguments for the gem command are optional. | |
| 171 | +# When not providing a git(hub) repository the gem needs to be published to | |
| 172 | +# https://rubygems.org. | |
| 173 | +# Check http://bundler.io/v1.11/git.html for a list of valid arguments. | |
| 174 | +# | |
| 175 | +# Configuration examples: | |
| 176 | +# | |
| 177 | +# ADDITIONAL_GEMS=huginn_nlp_agents,test_agent | |
| 178 | +# ADDITIONAL_GEMS=huginn_nlp_agents(~> 0.2.1),test_agent | |
| 179 | +# ADDITIONAL_GEMS=huginn_nlp_agents(git: https://github.com/kreuzwerker/DKT.huginn_nlp_agents.git),test_agent | |
| 180 | +# ADDITIONAL_GEMS=huginn_nlp_agents(github: kreuzwerker/DKT.huginn_nlp_agents),test_agent | |
| 181 | +# ADDITIONAL_GEMS=huginn_nlp_agents(~> 0.2.1, git: https://github.com/kreuzwerker/DKT.huginn_nlp_agents.git),test_agent | |
| 182 | + | |
| 165 | 183 | ######################## | 
| 166 | 184 | # Various Settings # | 
| 167 | 185 | ######################## | 
| @@ -102,6 +102,7 @@ gem 'geokit-rails', '~> 2.0.1' | ||
| 102 | 102 | gem 'httparty', '~> 0.13' | 
| 103 | 103 | gem 'httmultiparty', '~> 0.3.16' | 
| 104 | 104 | gem 'jquery-rails', '~> 3.1.3' | 
| 105 | +gem 'huginn_agent', '~> 0.4.0' | |
| 105 | 106 | gem 'json', '~> 1.8.1' | 
| 106 | 107 | gem 'jsonpath', '~> 0.5.6' | 
| 107 | 108 | gem 'kaminari', '~> 0.16.1' | 
| @@ -194,3 +195,7 @@ end | ||
| 194 | 195 | if_true(ENV['DATABASE_ADAPTER'].strip == 'mysql2') do | 
| 195 | 196 | gem 'mysql2', '~> 0.3.20' | 
| 196 | 197 | end | 
| 198 | + | |
| 199 | +GemfileHelper.parse_each_agent_gem(ENV['ADDITIONAL_GEMS']) do |args| | |
| 200 | + gem *args | |
| 201 | +end | 
| @@ -281,6 +281,8 @@ GEM | ||
| 281 | 281 | httparty (0.13.7) | 
| 282 | 282 | json (~> 1.8) | 
| 283 | 283 | multi_xml (>= 0.5.2) | 
| 284 | + huginn_agent (0.4.0) | |
| 285 | + thor | |
| 284 | 286 | hypdf (1.0.10) | 
| 285 | 287 | httmultiparty (~> 0.3) | 
| 286 | 288 | httparty (~> 0.13) | 
| @@ -629,6 +631,7 @@ DEPENDENCIES | ||
| 629 | 631 | hipchat (~> 1.2.0) | 
| 630 | 632 | httmultiparty (~> 0.3.16) | 
| 631 | 633 | httparty (~> 0.13) | 
| 634 | + huginn_agent (~> 0.4.0) | |
| 632 | 635 | hypdf (~> 1.0.10) | 
| 633 | 636 | jquery-rails (~> 3.1.3) | 
| 634 | 637 | json (~> 1.8.1) | 
| @@ -1 +1,2 @@ | ||
| 1 | -require 'pp' | |
| 1 | +require 'pp' | |
| 2 | +HuginnAgent.require! | 
| @@ -19,8 +19,33 @@ class GemfileHelper | ||
| 19 | 19 | ) | 
| 20 | 20 | end | 
| 21 | 21 |  | 
| 22 | + GEM_NAME = '[A-Za-z0-9\.\-\_]+'.freeze | |
| 23 | +    GEM_OPTIONS = '(.+?)\s*(?:,\s*(.+?)){0,1}'.freeze | |
| 24 | + GEM_SEPARATOR = '\s*(?:,|\z)'.freeze | |
| 25 | +    GEM_REGULAR_EXPRESSION = /(#{GEM_NAME})(?:\(#{GEM_OPTIONS}\)){0,1}#{GEM_SEPARATOR}/ | |
| 26 | + | |
| 27 | + def parse_each_agent_gem(string) | |
| 28 | + return unless string | |
| 29 | + string.scan(GEM_REGULAR_EXPRESSION).each do |name, version, args| | |
| 30 | + if version =~ /\w+:/ | |
| 31 | +          args = "#{version},#{args}" | |
| 32 | + version = nil | |
| 33 | + end | |
| 34 | + yield [name, version, parse_gem_args(args)].compact | |
| 35 | + end | |
| 36 | + end | |
| 37 | + | |
| 22 | 38 | private | 
| 23 | 39 |  | 
| 40 | + def parse_gem_args(args) | |
| 41 | + return nil unless args | |
| 42 | +      options = {} | |
| 43 | +      args.scan(/(\w+):\s*(.+?)#{GEM_SEPARATOR}/).each do |key, value| | |
| 44 | + options[key.to_sym] = value | |
| 45 | + end | |
| 46 | + options | |
| 47 | + end | |
| 48 | + | |
| 24 | 49 | def sanity_check(env) | 
| 25 | 50 | return if ENV['CI'] == 'true' || !env.empty? | 
| 26 | 51 | puts warning | 
| @@ -0,0 +1,48 @@ | ||
| 1 | +require 'rails_helper' | |
| 2 | + | |
| 3 | +describe GemfileHelper do | |
| 4 | + context 'parse_each_agent_gem' do | |
| 5 | + VALID_STRINGS = [ | |
| 6 | + ['huginn_nlp_agents(~> 0.2.1)', [ | |
| 7 | + ['huginn_nlp_agents', '~> 0.2.1'] | |
| 8 | + ]], | |
| 9 | + ['huginn_nlp_agents(~> 0.2.1, git: http://github.com/dsander/huginn.git, branch: agents_in_gems)', | |
| 10 | + [['huginn_nlp_agents', '~> 0.2.1', git: 'http://github.com/dsander/huginn.git', branch: 'agents_in_gems']] | |
| 11 | + ], | |
| 12 | + ['huginn_nlp_agents(~> 0.2.1, git: http://github.com/dsander/huginn.git, ref: 2342asdab) , huginn_nlp_agents(~> 0.2.1)', [ | |
| 13 | + ['huginn_nlp_agents', '~> 0.2.1', git: 'http://github.com/dsander/huginn.git', ref: '2342asdab'], | |
| 14 | + ['huginn_nlp_agents', '~> 0.2.1'] | |
| 15 | + ]], | |
| 16 | + ['huginn_nlp_agents(~> 0.2.1, path: /tmp/test)', [ | |
| 17 | + ['huginn_nlp_agents', '~> 0.2.1', path: '/tmp/test'] | |
| 18 | + ]], | |
| 19 | + ['huginn_nlp_agents', [ | |
| 20 | + ['huginn_nlp_agents'] | |
| 21 | + ]], | |
| 22 | + ['huginn_nlp_agents, test(0.1), test2(github: test2/huginn_test)', [ | |
| 23 | + ['huginn_nlp_agents'], | |
| 24 | + ['test', '0.1'], | |
| 25 | + ['test2', github: 'test2/huginn_test'] | |
| 26 | + ]], | |
| 27 | + ['huginn_nlp_agents(git: http://github.com/dsander/huginn.git, ref: 2342asdab)', [ | |
| 28 | + ['huginn_nlp_agents', git: 'http://github.com/dsander/huginn.git', ref: '2342asdab'] | |
| 29 | + ]], | |
| 30 | + ] | |
| 31 | + | |
| 32 | + it 'parses valid gem strings correctly' do | |
| 33 | + VALID_STRINGS.each do |string, outcomes| | |
| 34 | + GemfileHelper.parse_each_agent_gem(string) do |args| | |
| 35 | + expect(args).to eq(outcomes.shift) | |
| 36 | + end | |
| 37 | + end | |
| 38 | + end | |
| 39 | + | |
| 40 | + it 'does nothing when nil is passed' do | |
| 41 | +      expect { |b| GemfileHelper.parse_each_agent_gem(nil, &b) }.not_to yield_control | |
| 42 | + end | |
| 43 | + | |
| 44 | + it 'does nothing when an empty string is passed' do | |
| 45 | +      expect { |b| GemfileHelper.parse_each_agent_gem('', &b) }.not_to yield_control | |
| 46 | + end | |
| 47 | + end | |
| 48 | +end |