yeshoua_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/yeshoua_crm/acts_as_draftable/draft.rb +40 -0
  5. data/lib/yeshoua_crm/acts_as_draftable/rcrm_acts_as_draftable.rb +154 -0
  6. data/lib/yeshoua_crm/acts_as_list/list.rb +282 -0
  7. data/lib/yeshoua_crm/acts_as_taggable/rcrm_acts_as_taggable.rb +350 -0
  8. data/lib/yeshoua_crm/acts_as_taggable/tag.rb +81 -0
  9. data/lib/yeshoua_crm/acts_as_taggable/tag_list.rb +111 -0
  10. data/lib/yeshoua_crm/acts_as_taggable/tagging.rb +16 -0
  11. data/lib/yeshoua_crm/acts_as_viewed/rcrm_acts_as_viewed.rb +274 -0
  12. data/lib/yeshoua_crm/acts_as_votable/rcrm_acts_as_votable.rb +80 -0
  13. data/lib/yeshoua_crm/acts_as_votable/rcrm_acts_as_voter.rb +20 -0
  14. data/lib/yeshoua_crm/acts_as_votable/votable.rb +323 -0
  15. data/lib/yeshoua_crm/acts_as_votable/vote.rb +28 -0
  16. data/lib/yeshoua_crm/acts_as_votable/voter.rb +131 -0
  17. data/lib/yeshoua_crm/assets_manager.rb +43 -0
  18. data/lib/yeshoua_crm/currency.rb +439 -0
  19. data/lib/yeshoua_crm/currency/formatting.rb +224 -0
  20. data/lib/yeshoua_crm/currency/heuristics.rb +151 -0
  21. data/lib/yeshoua_crm/currency/loader.rb +24 -0
  22. data/lib/yeshoua_crm/helpers/external_assets_helper.rb +17 -0
  23. data/lib/yeshoua_crm/helpers/form_tag_helper.rb +123 -0
  24. data/lib/yeshoua_crm/helpers/tags_helper.rb +13 -0
  25. data/lib/yeshoua_crm/helpers/vote_helper.rb +35 -0
  26. data/lib/yeshoua_crm/liquid/drops/cells_drop.rb +86 -0
  27. data/lib/yeshoua_crm/liquid/drops/issues_drop.rb +66 -0
  28. data/lib/yeshoua_crm/liquid/drops/news_drop.rb +54 -0
  29. data/lib/yeshoua_crm/liquid/drops/users_drop.rb +72 -0
  30. data/lib/yeshoua_crm/liquid/filters/arrays.rb +177 -0
  31. data/lib/yeshoua_crm/liquid/filters/base.rb +208 -0
  32. data/lib/yeshoua_crm/money_helper.rb +65 -0
  33. data/lib/yeshoua_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/yeshoua_crm.gemspec +28 -0
  64. metadata +206 -0
@@ -0,0 +1,34 @@
1
+ require File.dirname(__FILE__) + '/../liquid_helper'
2
+ include LiquidHelperMethods
3
+
4
+ module YeshouaCrm
5
+ class IssuesDropTest < ActiveSupport::TestCase
6
+ def setup
7
+ @issue = Issue.first
8
+ @user = User.first
9
+ @liquid_render = LiquidRender.new('user' => Liquid::UserDrop.new(@user),
10
+ 'issue' => Liquid::IssueDrop.new(@issue),
11
+ 'issues' => Liquid::IssuesDrop.new(Issue.all))
12
+ end
13
+
14
+ def test_issues_all
15
+ issues_text = @liquid_render.render('{% for issue in issues.all %} {{issue.subject }} {% endfor %}')
16
+ Issue.all.map(&:subject).each do |subject|
17
+ assert_match subject, issues_text
18
+ end
19
+ end
20
+
21
+ def test_issues_size
22
+ assert_equal '4', @liquid_render.render('{{ issues.size }}')
23
+ end
24
+
25
+ def test_issue_author
26
+ assert_equal @user.name, @liquid_render.render('{{ issue.author.name }}')
27
+ end
28
+
29
+ def test_issue_delegated
30
+ assert_equal [@issue.id, @issue.subject, @issue.description].join('|'),
31
+ @liquid_render.render('{{ issue.id }}|{{ issue.subject }}|{{ issue.description }}')
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,38 @@
1
+ require File.dirname(__FILE__) + '/../liquid_helper'
2
+ include LiquidHelperMethods
3
+
4
+ module YeshouaCrm
5
+ class NewsDropTest < ActiveSupport::TestCase
6
+ def setup
7
+ @news = News.first
8
+ @user = User.first
9
+ @liquid_render = LiquidRender.new('user' => Liquid::UserDrop.new(@user),
10
+ 'news' => Liquid::NewsDrop.new(@news),
11
+ 'newss' => Liquid::NewssDrop.new(News.all))
12
+ end
13
+
14
+ def test_newss_all
15
+ newss_text = @liquid_render.render('{% for news in newss.all %} {{news.title }} {% endfor %}')
16
+ News.all.map(&:title).each do |title|
17
+ assert_match title, newss_text
18
+ end
19
+ end
20
+
21
+ def test_newss_last
22
+ assert_equal News.last.title, @liquid_render.render('{{ newss.last.title }}')
23
+ end
24
+
25
+ def test_newss_size
26
+ assert_equal '2', @liquid_render.render('{{ newss.size }}')
27
+ end
28
+
29
+ def test_news_author
30
+ assert_equal @user.name, @liquid_render.render('{{ news.author.name }}')
31
+ end
32
+
33
+ def test_issue_delegated
34
+ assert_equal [@news.id, @news.title, @news.description].join('|'),
35
+ @liquid_render.render('{{ news.id }}|{{ news.title }}|{{ news.description }}')
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,44 @@
1
+ require File.dirname(__FILE__) + '/../liquid_helper'
2
+ include LiquidHelperMethods
3
+
4
+ module YeshouaCrm
5
+ class CellsDropTest < ActiveSupport::TestCase
6
+ def setup
7
+ @cell = Cell.first
8
+ @user = User.first
9
+ @liquid_render = LiquidRender.new('user' => Liquid::UserDrop.new(@user),
10
+ 'cell' => Liquid::CellDrop.new(@cell),
11
+ 'cells' => Liquid::CellsDrop.new(Cell.all))
12
+ end
13
+
14
+ def test_cells_all
15
+ cells_text = @liquid_render.render('{% for cell in cells.all %} {{cell.identifier }} {% endfor %}')
16
+ Cell.all.map(&:identifier).each do |identifier|
17
+ assert_match identifier, cells_text
18
+ end
19
+ end
20
+
21
+ def test_cells_active
22
+ cells_text = @liquid_render.render('{% for cell in cells.active %} {{cell.identifier }} {% endfor %}')
23
+ Cell.where(:status => 1).map(&:identifier).each do |identifier|
24
+ assert_match identifier, cells_text
25
+ end
26
+ end
27
+
28
+ def test_cells_size
29
+ assert_equal '2', @liquid_render.render('{{ cells.size }}')
30
+ end
31
+
32
+ def test_cell_issues
33
+ issues_text = @liquid_render.render('{% for issue in cell.issues %} {{issue.subject }} {% endfor %}')
34
+ Cell.first.issues.each do |issue|
35
+ assert_match issue.subject, issues_text
36
+ end
37
+ end
38
+
39
+ def test_cell_delegated
40
+ assert_equal [@cell.id, @cell.identifier, @cell.description].join('|'),
41
+ @liquid_render.render('{{ cell.id }}|{{ cell.identifier }}|{{ cell.description }}')
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,36 @@
1
+ require File.dirname(__FILE__) + '/../liquid_helper'
2
+ include LiquidHelperMethods
3
+
4
+ module YeshouaCrm
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 YeshouaCrm
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 YeshouaCrm
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 YeshouaCrm::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