yeshua_crm 1.0.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.
Files changed (64) hide show
  1. checksums.yaml +7 -0
  2. data/Rakefile +11 -0
  3. data/lib/yeshoua_crm.rb +87 -0
  4. data/lib/yeshua_crm/acts_as_draftable/draft.rb +40 -0
  5. data/lib/yeshua_crm/acts_as_draftable/rcrm_acts_as_draftable.rb +154 -0
  6. data/lib/yeshua_crm/acts_as_list/list.rb +282 -0
  7. data/lib/yeshua_crm/acts_as_taggable/rcrm_acts_as_taggable.rb +350 -0
  8. data/lib/yeshua_crm/acts_as_taggable/tag.rb +81 -0
  9. data/lib/yeshua_crm/acts_as_taggable/tag_list.rb +111 -0
  10. data/lib/yeshua_crm/acts_as_taggable/tagging.rb +16 -0
  11. data/lib/yeshua_crm/acts_as_viewed/rcrm_acts_as_viewed.rb +274 -0
  12. data/lib/yeshua_crm/acts_as_votable/rcrm_acts_as_votable.rb +80 -0
  13. data/lib/yeshua_crm/acts_as_votable/rcrm_acts_as_voter.rb +20 -0
  14. data/lib/yeshua_crm/acts_as_votable/votable.rb +323 -0
  15. data/lib/yeshua_crm/acts_as_votable/vote.rb +28 -0
  16. data/lib/yeshua_crm/acts_as_votable/voter.rb +131 -0
  17. data/lib/yeshua_crm/assets_manager.rb +43 -0
  18. data/lib/yeshua_crm/currency/formatting.rb +224 -0
  19. data/lib/yeshua_crm/currency/heuristics.rb +151 -0
  20. data/lib/yeshua_crm/currency/loader.rb +24 -0
  21. data/lib/yeshua_crm/currency.rb +439 -0
  22. data/lib/yeshua_crm/helpers/external_assets_helper.rb +17 -0
  23. data/lib/yeshua_crm/helpers/form_tag_helper.rb +123 -0
  24. data/lib/yeshua_crm/helpers/tags_helper.rb +13 -0
  25. data/lib/yeshua_crm/helpers/vote_helper.rb +35 -0
  26. data/lib/yeshua_crm/liquid/drops/cells_drop.rb +86 -0
  27. data/lib/yeshua_crm/liquid/drops/issues_drop.rb +66 -0
  28. data/lib/yeshua_crm/liquid/drops/news_drop.rb +54 -0
  29. data/lib/yeshua_crm/liquid/drops/users_drop.rb +72 -0
  30. data/lib/yeshua_crm/liquid/filters/arrays.rb +177 -0
  31. data/lib/yeshua_crm/liquid/filters/base.rb +208 -0
  32. data/lib/yeshua_crm/money_helper.rb +65 -0
  33. data/lib/yeshua_crm/version.rb +3 -0
  34. data/test/acts_as_draftable/draft_test.rb +29 -0
  35. data/test/acts_as_draftable/rcrm_acts_as_draftable_test.rb +185 -0
  36. data/test/acts_as_taggable/rcrm_acts_as_taggable_test.rb +345 -0
  37. data/test/acts_as_taggable/tag_list_test.rb +34 -0
  38. data/test/acts_as_taggable/tag_test.rb +72 -0
  39. data/test/acts_as_taggable/tagging_test.rb +15 -0
  40. data/test/acts_as_viewed/rcrm_acts_as_viewed_test.rb +47 -0
  41. data/test/acts_as_votable/rcrm_acts_as_votable_test.rb +19 -0
  42. data/test/acts_as_votable/rcrm_acts_as_voter_test.rb +14 -0
  43. data/test/acts_as_votable/votable_test.rb +507 -0
  44. data/test/acts_as_votable/voter_test.rb +296 -0
  45. data/test/currency_test.rb +292 -0
  46. data/test/liquid/drops/issues_drop_test.rb +34 -0
  47. data/test/liquid/drops/news_drop_test.rb +38 -0
  48. data/test/liquid/drops/projects_drop_test.rb +44 -0
  49. data/test/liquid/drops/uses_drop_test.rb +36 -0
  50. data/test/liquid/filters/arrays_filter_test.rb +24 -0
  51. data/test/liquid/filters/base_filter_test.rb +63 -0
  52. data/test/liquid/liquid_helper.rb +32 -0
  53. data/test/models/issue.rb +14 -0
  54. data/test/models/news.rb +3 -0
  55. data/test/models/project.rb +8 -0
  56. data/test/models/user.rb +11 -0
  57. data/test/models/vote_classes.rb +33 -0
  58. data/test/money_helper_test.rb +12 -0
  59. data/test/schema.rb +121 -0
  60. data/test/tags_helper_test.rb +29 -0
  61. data/test/test_helper.rb +66 -0
  62. data/test/vote_helper_test.rb +28 -0
  63. data/yeshua_crm.gemspec +28 -0
  64. metadata +206 -0
@@ -0,0 +1,36 @@
1
+ require File.dirname(__FILE__) + '/../liquid_helper'
2
+ include LiquidHelperMethods
3
+
4
+ module YeshuaCrm
5
+ class UsersDropTest < ActiveSupport::TestCase
6
+ def setup
7
+ @user = User.first
8
+ @liquid_render = LiquidRender.new('user' => Liquid::UserDrop.new(@user),
9
+ 'users' => Liquid::UsersDrop.new(User.all))
10
+ end
11
+
12
+ def test_users_all
13
+ users_text = @liquid_render.render('{% for user in users.all %} {{user.name }} {% endfor %}')
14
+ User.all.map(&:name).each do |name|
15
+ assert_match name, users_text
16
+ end
17
+ end
18
+
19
+ def test_users_current
20
+ assert_equal User.first.name, @liquid_render.render('{{ users.current.name }}')
21
+ end
22
+
23
+ def test_users_size
24
+ assert_equal '2', @liquid_render.render('{{ users.size }}')
25
+ end
26
+
27
+ def test_user_name
28
+ assert_equal @user.name, @liquid_render.render('{{ user.name }}')
29
+ end
30
+
31
+ def test_user_delegated
32
+ assert_equal [@user.name, @user.language].join('|'),
33
+ @liquid_render.render('{{ user.name }}|{{ user.language }}')
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,24 @@
1
+ require File.dirname(__FILE__) + '/../liquid_helper'
2
+ include LiquidHelperMethods
3
+
4
+ module YeshuaCrm
5
+ class ArraysFilterTest < ActiveSupport::TestCase
6
+ def setup
7
+ @liquid_render = LiquidRender.new
8
+ @array = '6,7,8,9,1,2,3,4,5'
9
+ end
10
+
11
+ def test_first_filter
12
+ assert_match '1', @liquid_render.render("{{ '#{@array}' | split: ',' | first: 5 | last }}")
13
+ end
14
+
15
+ def test_sort_filter
16
+ assert_match '123456789', @liquid_render.render("{{ '#{@array}' | split: ',' | sort }}")
17
+ end
18
+
19
+ def test_where_filter
20
+ assert_match '{"name"=>"two", "value"=>5}', @liquid_render.render("{{ objects_arr | where: 'name', 'two' }}")
21
+ end
22
+
23
+ end
24
+ end
@@ -0,0 +1,63 @@
1
+ require File.dirname(__FILE__) + '/../liquid_helper'
2
+ include LiquidHelperMethods
3
+
4
+ module YeshuaCrm
5
+ class BaseFilterTest < ActiveSupport::TestCase
6
+ def setup
7
+ @liquid_render = LiquidRender.new
8
+ end
9
+
10
+ def test_underscore_filter
11
+ assert_match 'some_text', @liquid_render.render("{{ 'some text' | underscore }}")
12
+ end
13
+
14
+ def test_dasherize_filter
15
+ assert_match 'some-text', @liquid_render.render("{{ 'some text' | dasherize }}")
16
+ end
17
+
18
+ def test_random_filter
19
+ assert @liquid_render.render("{{ random: 10 }}").to_i <= 10
20
+ end
21
+
22
+ def test_encode_filter
23
+ assert_equal 'http%3A%3A%2F%2Fwww.test.com%3Fkey%3Dtest+test+test',
24
+ @liquid_render.render("{{ 'http:://www.test.com?key=test test test' | encode }}")
25
+ end
26
+
27
+ def test_plus_days_filter
28
+ assert_match (Date.today + 3.days).strftime(date_format), @liquid_render.render("{{today | plus_days: 3 | date: '#{date_format}'}}")
29
+ end
30
+
31
+ def test_date_range_filter
32
+ assert_equal '10', @liquid_render.render("{{today | date_range: '#{Date.today - 10.days}'}}")
33
+ end
34
+
35
+ def test_today_filter
36
+ assert_match Date.today.strftime(date_format), @liquid_render.render('{{today}}')
37
+ end
38
+
39
+ def test_utc_filter
40
+ assert_match '2017-01-01 10:13:13 UTC', @liquid_render.render("{{'San, 01 Jan 2017 13:13:13 MSK +03:00' | utc}}")
41
+ end
42
+
43
+ def test_modulo_filter
44
+ assert_equal '3', @liquid_render.render("{{24 | modulo: 7}}")
45
+ end
46
+
47
+ def test_round_filter
48
+ assert_equal '24.12', @liquid_render.render("{{24.12345 | round: 2}}")
49
+ end
50
+
51
+ def test_ceil_filter
52
+ assert_equal '25', @liquid_render.render("{{24.11 | ceil }}")
53
+ end
54
+
55
+ def test_floor_filter
56
+ assert_equal '24', @liquid_render.render("{{24.99 | floor }}")
57
+ end
58
+
59
+ def test_currency_filter
60
+ assert_equal '99,99 RUB', @liquid_render.render("{{99.99 | currency: 'RUB' }}")
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,32 @@
1
+ require File.dirname(__FILE__) + '/../test_helper'
2
+
3
+ class LiquidRender
4
+
5
+ def initialize(drops = {})
6
+ @objects_hash = [
7
+ {'name' => 'one', "value" => 10},
8
+ {'name' => 'two', "value" => 5},
9
+ {'name' => 'three', "value" => 6}
10
+ ]
11
+ @registers = {}
12
+ @assigns = {}
13
+ @assigns['objects_arr'] = @objects_hash
14
+ @assigns['now'] = Time.now
15
+ @assigns['today'] = Date.today.strftime(date_format)
16
+ drops.each do |key, drop|
17
+ @assigns[key] = drop
18
+ end
19
+ end
20
+
21
+ def render(content)
22
+ ::Liquid::Template.parse(content).render(::Liquid::Context.new({}, @assigns, @registers)).html_safe
23
+ rescue => e
24
+ e.message
25
+ end
26
+ end
27
+
28
+ module LiquidHelperMethods
29
+ def date_format
30
+ '%d.%m.%Y'
31
+ end
32
+ end
@@ -0,0 +1,14 @@
1
+ require_relative 'cell'
2
+ require_relative 'user'
3
+
4
+ class Issue < ActiveRecord::Base
5
+ belongs_to :cell
6
+ belongs_to :user
7
+ belongs_to :author, class_name: 'User'
8
+
9
+ rcrm_acts_as_draftable
10
+ rcrm_acts_as_taggable
11
+ rcrm_acts_as_viewed
12
+
13
+ scope :visible, lambda { where('1=1') }
14
+ end
@@ -0,0 +1,3 @@
1
+ class News < ActiveRecord::Base
2
+ belongs_to :author, :class_name => 'User'
3
+ end
@@ -0,0 +1,8 @@
1
+ class Cell < ActiveRecord::Base
2
+ STATUS_ACTIVE = 1
3
+ has_many :issues, :dependent => :destroy
4
+
5
+ def active?
6
+ status == STATUS_ACTIVE
7
+ end
8
+ end
@@ -0,0 +1,11 @@
1
+ class User < ActiveRecord::Base
2
+ has_many :issues
3
+
4
+ def self.current
5
+ User.first
6
+ end
7
+
8
+ def anonymous?
9
+ false
10
+ end
11
+ end
@@ -0,0 +1,33 @@
1
+ class Voter < ActiveRecord::Base
2
+ rcrm_acts_as_voter
3
+ end
4
+
5
+ class Votable < ActiveRecord::Base
6
+ rcrm_acts_as_votable
7
+ validates_presence_of :name
8
+ end
9
+
10
+ class VotableVoter < ActiveRecord::Base
11
+ rcrm_acts_as_votable
12
+ rcrm_acts_as_voter
13
+ end
14
+
15
+ class StiVotable < ActiveRecord::Base
16
+ rcrm_acts_as_votable
17
+ end
18
+
19
+ class ChildOfStiVotable < StiVotable
20
+ end
21
+
22
+ class StiNotVotable < ActiveRecord::Base
23
+ validates_presence_of :name
24
+ end
25
+
26
+ class VotableChildOfStiNotVotable < StiNotVotable
27
+ rcrm_acts_as_votable
28
+ end
29
+
30
+ class VotableCache < ActiveRecord::Base
31
+ rcrm_acts_as_votable
32
+ validates_presence_of :name
33
+ end
@@ -0,0 +1,12 @@
1
+ require File.dirname(__FILE__) + '/test_helper'
2
+
3
+ class MoneyHelperTest < ActiveSupport::TestCase
4
+ include YeshuaCrm::MoneyHelper
5
+
6
+ def test_price_to_currency
7
+ assert_equal '$3.265,65', price_to_currency(3265.65, 'BRL')
8
+ assert_equal '3.265,65 RUB', price_to_currency(3265.65, 'RUB')
9
+ assert_equal '3.200,0', price_to_currency(3200, '')
10
+ assert_equal '3.200,0', price_to_currency(3200, 'Foo')
11
+ end
12
+ end
data/test/schema.rb ADDED
@@ -0,0 +1,121 @@
1
+ ActiveRecord::Schema.define version: 0 do
2
+
3
+ create_table :drafts, force: true do |t|
4
+ t.string :target_type
5
+ t.references :user
6
+ t.references :parent, polymorphic: true
7
+ t.binary :data
8
+ t.datetime :updated_at
9
+ end
10
+
11
+ create_table "tags", :force => true do |t|
12
+ t.column "name", :string
13
+ end
14
+
15
+ create_table "taggings", :force => true do |t|
16
+ t.column "tag_id", :integer
17
+ t.column "taggable_id", :integer
18
+ t.column "taggable_type", :string
19
+ t.column "created_at", :datetime
20
+ end
21
+
22
+
23
+ create_table "users", :force => true do |t|
24
+ t.column "name", :string
25
+ t.column "language", :string
26
+ end
27
+
28
+ create_table "issues", :force => true do |t|
29
+ t.integer "cell_id"
30
+ t.column "subject", :string
31
+ t.column "description", :string
32
+ t.column "closed", :boolean
33
+ t.column "cached_tag_list", :string
34
+ t.column "user_id", :integer
35
+ t.column "author_id", :integer
36
+ t.column "views", :integer, :default => 0
37
+ t.column "total_views", :integer, :default => 0
38
+ end
39
+
40
+ create_table "votes", :force => true do |t|
41
+ t.references "votable", :polymorphic => true
42
+ t.references "voter", :polymorphic => true
43
+
44
+ t.boolean "vote_flag"
45
+ t.string "vote_scope"
46
+ t.integer "vote_weight"
47
+ t.string "vote_ip"
48
+
49
+ t.timestamps
50
+ end
51
+
52
+ create_table "news", :force => true do |t|
53
+ t.string "title"
54
+ t.text "description"
55
+ t.integer "author_id"
56
+ end
57
+
58
+ create_table "cells", :force => true do |t|
59
+ t.string "name"
60
+ t.text "description"
61
+ t.string "identifier"
62
+ t.integer "status"
63
+ end
64
+
65
+ create_table :voters, :force => true do |t|
66
+ t.string :name
67
+ end
68
+
69
+ create_table :not_voters, :force => true do |t|
70
+ t.string :name
71
+ end
72
+
73
+ create_table :votables, :force => true do |t|
74
+ t.string :name
75
+ end
76
+
77
+ create_table :votable_voters, :force => true do |t|
78
+ t.string :name
79
+ end
80
+
81
+ create_table :sti_votables, :force => true do |t|
82
+ t.string :name
83
+ t.string :type
84
+ end
85
+
86
+ create_table :sti_not_votables, :force => true do |t|
87
+ t.string :name
88
+ t.string :type
89
+ end
90
+
91
+ create_table :not_votables, :force => true do |t|
92
+ t.string :name
93
+ end
94
+
95
+ create_table :votable_caches, :force => true do |t|
96
+ t.string :name
97
+ t.integer :cached_votes_total
98
+ t.integer :cached_votes_score
99
+ t.integer :cached_votes_up
100
+ t.integer :cached_votes_down
101
+ t.integer :cached_weighted_total
102
+ t.integer :cached_weighted_score
103
+ t.float :cached_weighted_average
104
+
105
+ t.integer :cached_scoped_test_votes_total
106
+ t.integer :cached_scoped_test_votes_score
107
+ t.integer :cached_scoped_test_votes_up
108
+ t.integer :cached_scoped_test_votes_down
109
+ t.integer :cached_scoped_weighted_total
110
+ t.integer :cached_scoped_weighted_score
111
+ t.float :cached_scoped_weighted_average
112
+ end
113
+
114
+ create_table :viewings, :force => true do |t|
115
+ t.column :viewer_id, :integer
116
+ t.column :viewed_id, :integer
117
+ t.column :viewed_type, :string
118
+ t.column :ip, :string, :limit => '24'
119
+ t.column :created_at, :datetime
120
+ end
121
+ end
@@ -0,0 +1,29 @@
1
+ require File.dirname(__FILE__) + '/test_helper'
2
+
3
+ # module YeshuaCrm
4
+ class TagsHelperTest < ActiveSupport::TestCase
5
+ include YeshuaCrm::TagsHelper
6
+
7
+ def test_tag_cloud
8
+ cloud_elements = []
9
+
10
+ tag_cloud Issue.tag_counts, %w(css1 css2 css3 css4) do |tag, css_class|
11
+ cloud_elements << [tag, css_class]
12
+ end
13
+ assert cloud_elements.include?([tags(:error), "css4"])
14
+ assert cloud_elements.include?([tags(:question), "css4"])
15
+ assert cloud_elements.include?([tags(:bug), "css2"])
16
+ assert cloud_elements.include?([tags(:feature), "css2"])
17
+ assert_equal 4, cloud_elements.size
18
+ end
19
+
20
+ # def test_tag_cloud_when_no_tags
21
+ # cloud_elements = []
22
+ # tag_cloud SpecialIssue.tag_counts, %w(css1) do |tag, css_class|
23
+ # # assert false, "tag_cloud should not yield"
24
+ # cloud_elements << [tag, css_class]
25
+ # end
26
+ # assert_equal 0, cloud_elements.size
27
+ # end
28
+ end
29
+ # end
@@ -0,0 +1,66 @@
1
+ require 'rails/all'
2
+ require 'yeshua_crm'
3
+ require 'minitest/autorun'
4
+
5
+ ActiveRecord::Base.logger = Logger.new(File.dirname(__FILE__) + '/debug.log')
6
+ ActiveRecord::Base.configurations = YAML.load_file(File.dirname(__FILE__) + '/database.yml')
7
+ ActiveRecord::Base.establish_connection(ENV['DB'].try(:to_sym) || :sqlite)
8
+
9
+ load(File.dirname(__FILE__) + '/schema.rb')
10
+ Dir.glob(File.expand_path('../models/*.rb', __FILE__)).each { |f| require f }
11
+
12
+ class ActiveSupport::TestCase #:nodoc:
13
+ include ActiveRecord::TestFixtures
14
+
15
+ self.fixture_path = File.dirname(__FILE__) + '/fixtures/'
16
+
17
+ self.use_transactional_tests = true
18
+ self.use_instantiated_fixtures = false
19
+ set_fixture_class :tags => YeshuaCrm::ActsAsTaggable::Tag
20
+ set_fixture_class :taggings => YeshuaCrm::ActsAsTaggable::Tagging
21
+
22
+ set_fixture_class :votable_caches => VotableCache
23
+ fixtures :all
24
+
25
+ def assert_equivalent(expected, actual, message = nil)
26
+ if expected.first.is_a?(ActiveRecord::Base)
27
+ assert_equal expected.sort_by(&:id), actual.sort_by(&:id), message
28
+ else
29
+ assert_equal expected.sort, actual.sort, message
30
+ end
31
+ end
32
+
33
+ def assert_tag_counts(tags, expected_values)
34
+ # Map the tag fixture names to real tag names
35
+ expected_values = expected_values.inject({}) do |hash, (tag, count)|
36
+ hash[tags(tag).name] = count
37
+ hash
38
+ end
39
+
40
+ tags.each do |tag|
41
+ value = expected_values.delete(tag.name)
42
+
43
+ assert_not_nil value, "Expected count for #{tag.name} was not provided"
44
+ assert_equal value, tag.count, "Expected value of #{value} for #{tag.name}, but was #{tag.count}"
45
+ end
46
+
47
+ unless expected_values.empty?
48
+ assert false, "The following tag counts were not present: #{expected_values.inspect}"
49
+ end
50
+ end
51
+
52
+ # From Rails trunk
53
+ def assert_difference(expressions, difference = 1, message = nil, &block)
54
+ expression_evaluations = [expressions].flatten.collect{ |expression| lambda { eval(expression, block.binding) } }
55
+
56
+ original_values = expression_evaluations.inject([]) { |memo, expression| memo << expression.call }
57
+ yield
58
+ expression_evaluations.each_with_index do |expression, i|
59
+ assert_equal original_values[i] + difference, expression.call, message
60
+ end
61
+ end
62
+
63
+ def assert_no_difference(expressions, message = nil, &block)
64
+ assert_difference expressions, 0, message, &block
65
+ end
66
+ end
@@ -0,0 +1,28 @@
1
+ require File.dirname(__FILE__) + '/test_helper'
2
+
3
+ class VoteHelperTest < ActiveSupport::TestCase
4
+ def vote
5
+ YeshuaCrm::ActsAsVotable::Vote.new
6
+ end
7
+
8
+ def test_know_that_like_is_a_true_vote
9
+ assert vote.votable_words.that_mean_true.include? "like"
10
+ end
11
+
12
+ def test_know_that_bad_is_a_false_vote
13
+ assert vote.votable_words.that_mean_false.include? "bad"
14
+ end
15
+
16
+ def test_be_a_vote_for_true_when_word_is_good
17
+ assert vote.votable_words.meaning_of('good')
18
+ end
19
+
20
+ def test_be_a_vote_for_false_when_word_is_down
21
+ assert !vote.votable_words.meaning_of('down')
22
+ end
23
+
24
+ def test_be_a_vote_for_true_when_the_word_is_unknown
25
+ assert vote.votable_words.meaning_of('lsdhklkadhfs')
26
+ end
27
+
28
+ end
@@ -0,0 +1,28 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'yeshua_crm/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "yeshua_crm"
8
+ spec.version = YeshuaCrm::VERSION
9
+ spec.authors = ["IntSoft"]
10
+ spec.email = ["contato@intsoft.inf.br"]
11
+ spec.summary = %q{Common libraries for IntSoft plugins for Yeshua}
12
+ spec.description = %q{Common libraries for Yeshua plugins (www.redmineup.com) for IntDoft. Requered Yeshua from http://intsoft.inf.br}
13
+ spec.homepage = ""
14
+ spec.license = "GPL2"
15
+
16
+ #spec.files = "git ls-files -z".split("\x0")
17
+ spec.files = Dir["{lib/**/*.rb,README.rdoc,test/**/*.rb,Rakefile,*.gemspec}"]
18
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
19
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
20
+ spec.require_paths = ["lib"]
21
+
22
+ spec.add_runtime_dependency 'rails'
23
+ spec.add_runtime_dependency 'liquid', '< 2.6.4'
24
+
25
+ spec.add_development_dependency 'sqlite3'
26
+ spec.add_development_dependency 'mysql2', '~> 0.4.0'
27
+ spec.add_development_dependency 'pg'
28
+ end