comet-cpp 0.9.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 (77) hide show
  1. checksums.yaml +7 -0
  2. data/bin/comet-html +69 -0
  3. data/bin/comet-make +53 -0
  4. data/bin/comet-new +62 -0
  5. data/bin/comet-web +14 -0
  6. data/lib/comet-html/generator.rb +220 -0
  7. data/lib/comet-html/header-generator.rb +145 -0
  8. data/lib/comet-html/parser-binding.rb +42 -0
  9. data/lib/comet-html/parser-class.rb +168 -0
  10. data/lib/comet-html/parser-context.rb +61 -0
  11. data/lib/comet-html/parser-reference.rb +98 -0
  12. data/lib/comet-html/parser-repeater.rb +58 -0
  13. data/lib/comet-html/parser-slot.rb +108 -0
  14. data/lib/comet-html/source-generator.rb +285 -0
  15. data/lib/comet-html/utils.rb +88 -0
  16. data/lib/guard/comet-html.rb +32 -0
  17. data/lib/guard/comet.rb +36 -0
  18. data/vendor/project/Gemfile +4 -0
  19. data/vendor/project/Guardfile +5 -0
  20. data/vendor/project/app/application.hpp +29 -0
  21. data/vendor/project/app/collections/.gitkeep +0 -0
  22. data/vendor/project/app/controllers/.gitkeep +0 -0
  23. data/vendor/project/app/main.cpp +6 -0
  24. data/vendor/project/app/models/.gitkeep +0 -0
  25. data/vendor/project/app/routes.cpp +7 -0
  26. data/vendor/project/app/views/layouts/.gitkeep +0 -0
  27. data/vendor/project/public/index.html +7 -0
  28. data/vendor/src/anchorable_element.hpp +79 -0
  29. data/vendor/src/append_semantics.hpp +73 -0
  30. data/vendor/src/bindable.cpp +99 -0
  31. data/vendor/src/bindable.hpp +106 -0
  32. data/vendor/src/cheerp_parse_cookie_values.cpp +58 -0
  33. data/vendor/src/comment_element.cpp +11 -0
  34. data/vendor/src/comment_element.hpp +17 -0
  35. data/vendor/src/cookies.cpp +94 -0
  36. data/vendor/src/cookies.hpp +60 -0
  37. data/vendor/src/custom_element.hpp +61 -0
  38. data/vendor/src/datatree.cpp +198 -0
  39. data/vendor/src/datatree.hpp +233 -0
  40. data/vendor/src/document.cpp +62 -0
  41. data/vendor/src/document.hpp +31 -0
  42. data/vendor/src/element.cpp +358 -0
  43. data/vendor/src/element.hpp +138 -0
  44. data/vendor/src/events.hpp +76 -0
  45. data/vendor/src/exception.cpp +13 -0
  46. data/vendor/src/exception.hpp +11 -0
  47. data/vendor/src/from_string.cpp +99 -0
  48. data/vendor/src/from_string.hpp +37 -0
  49. data/vendor/src/globals.cpp +6 -0
  50. data/vendor/src/globals.hpp +15 -0
  51. data/vendor/src/http.cpp +93 -0
  52. data/vendor/src/http.hpp +72 -0
  53. data/vendor/src/lexical_cast.hpp +51 -0
  54. data/vendor/src/local_storage.cpp +75 -0
  55. data/vendor/src/local_storage.hpp +53 -0
  56. data/vendor/src/mvc/collection.hpp +154 -0
  57. data/vendor/src/mvc/controller.hpp +59 -0
  58. data/vendor/src/mvc/id_type.hpp +9 -0
  59. data/vendor/src/mvc/layout.hpp +44 -0
  60. data/vendor/src/mvc/model.cpp +89 -0
  61. data/vendor/src/mvc/model.hpp +50 -0
  62. data/vendor/src/object.cpp +71 -0
  63. data/vendor/src/object.hpp +298 -0
  64. data/vendor/src/parse_cookie_values.hpp +12 -0
  65. data/vendor/src/promise.cpp +50 -0
  66. data/vendor/src/promise.hpp +43 -0
  67. data/vendor/src/repeater.hpp +116 -0
  68. data/vendor/src/router.cpp +62 -0
  69. data/vendor/src/router.hpp +34 -0
  70. data/vendor/src/router_base.hpp +107 -0
  71. data/vendor/src/signal.hpp +150 -0
  72. data/vendor/src/slot_element.hpp +61 -0
  73. data/vendor/src/url.cpp +19 -0
  74. data/vendor/src/url.hpp +15 -0
  75. data/vendor/src/window.cpp +22 -0
  76. data/vendor/src/window.hpp +24 -0
  77. metadata +134 -0
@@ -0,0 +1,53 @@
1
+ #ifndef FRONT_LOCAL_STORAGE_HPP
2
+ # define FRONT_LOCAL_STORAGE_HPP
3
+
4
+ # include "from_string.hpp"
5
+ # include "signal.hpp"
6
+ # include <cheerp/clientlib.h>
7
+
8
+ namespace Comet
9
+ {
10
+ class LocalStorage
11
+ {
12
+ public:
13
+ LocalStorage();
14
+ LocalStorage(client::Storage*);
15
+ ~LocalStorage();
16
+
17
+ struct Change
18
+ {
19
+ Change(client::StorageEvent*);
20
+ Change() {}
21
+ std::string key, old_value, new_value;
22
+ };
23
+
24
+ Signal<Change> on_change;
25
+
26
+ template<typename T>
27
+ void set_item(const std::string& key, T value)
28
+ {
29
+ set_item<const std::string&>(key, std::to_string(value));
30
+ }
31
+
32
+ template<typename T>
33
+ T get_item(const std::string& key) const
34
+ {
35
+ return Comet::from_string<T>(get_item<std::string>(key));
36
+ }
37
+
38
+ void remove_item(const std::string& key);
39
+ void clear();
40
+
41
+ private:
42
+ void initialize();
43
+
44
+ client::Storage* storage;
45
+ client::EventListener* event_listener;
46
+ };
47
+
48
+ template<> void LocalStorage::set_item<const std::string&>(const std::string& key, const std::string& value);
49
+ template<> void LocalStorage::set_item<std::string>(const std::string& key, std::string value);
50
+ template<> std::string LocalStorage::get_item<std::string>(const std::string& key) const;
51
+ }
52
+
53
+ #endif
@@ -0,0 +1,154 @@
1
+ #ifndef COMET_MVC_COLLECTION_HPP
2
+ # define COMET_MVC_COLLECTION_HPP
3
+
4
+ # include "../signal.hpp"
5
+ # include "../http.hpp"
6
+ # include "../datatree.hpp"
7
+ # include "model.hpp"
8
+ # include <map>
9
+ # include <list>
10
+
11
+ namespace Comet
12
+ {
13
+ template<typename MODEL>
14
+ class Collection : public Listener
15
+ {
16
+ typedef std::shared_ptr<MODEL> ModelPtr;
17
+ typedef std::map<typename MODEL::id_type, ModelPtr> Map;
18
+ public:
19
+ typedef MODEL Model;
20
+
21
+ Signal<MODEL&> added;
22
+ Signal<MODEL&> removed;
23
+ Signal<MODEL&> changed;
24
+ Signal<void> synced;
25
+
26
+ virtual std::string get_url() const = 0;
27
+ virtual std::string get_mimetype() const = 0;
28
+
29
+ void add(ModelPtr model)
30
+ {
31
+ auto it = models.at(model->get_id());
32
+
33
+ if (it == models.end())
34
+ {
35
+ models.emplace(model->get_id(), model);
36
+ added.trigger(*model);
37
+ }
38
+ }
39
+
40
+ void remove(ModelPtr model)
41
+ {
42
+ auto it = models.at(model->get_id());
43
+
44
+ if (it != models.end())
45
+ {
46
+ models.erase(it);
47
+ removed.trigger(*model);
48
+ }
49
+ }
50
+
51
+ void each(std::function<void (ModelPtr)> callback)
52
+ {
53
+ for (auto item : models)
54
+ callback(item.second);
55
+ }
56
+
57
+ std::list<ModelPtr> where(std::function<bool (ModelPtr)> selector) const
58
+ {
59
+ std::list<ModelPtr> results;
60
+
61
+ for (auto item : models)
62
+ {
63
+ if (selector(item.second))
64
+ results.push_back(item.second);
65
+ }
66
+ return results;
67
+ }
68
+
69
+ ModelPtr find(std::function<bool (ModelPtr)> selector) const
70
+ {
71
+ for (auto item : models)
72
+ {
73
+ if (selector(item.second))
74
+ return item.second;
75
+ }
76
+ return nullptr;
77
+ }
78
+
79
+ ModelPtr get(typename MODEL::id_type id)
80
+ {
81
+ auto it = models.find(id);
82
+
83
+ if (it != models.end())
84
+ return it->second;
85
+ return nullptr;
86
+ }
87
+
88
+ Promise fetch()
89
+ {
90
+ auto request = Http::Request::get(get_url());
91
+
92
+ request->set_headers({{"Accept", get_mimetype()}});
93
+ return request->send().then([this, request]()
94
+ {
95
+ auto response = request->get_response();
96
+
97
+ if (response->ok())
98
+ {
99
+ if (response->has_body())
100
+ parse(response->get_response_text());
101
+ synced.trigger();
102
+ }
103
+ });
104
+ }
105
+
106
+ unsigned int count() const
107
+ {
108
+ return models.size();
109
+ }
110
+
111
+ protected:
112
+ virtual void parse(const std::string& str) = 0;
113
+
114
+ Map models;
115
+ };
116
+
117
+ template<typename MODEL>
118
+ class JsonCollection : public Collection<MODEL>
119
+ {
120
+ public:
121
+ virtual std::string get_mimetype() const
122
+ {
123
+ return "application/json";
124
+ }
125
+
126
+ virtual std::string get_resource_name() const
127
+ {
128
+ return "";
129
+ }
130
+
131
+ protected:
132
+ virtual void parse(const std::string& str)
133
+ {
134
+ DataTree payload;
135
+ Data models_json;
136
+ const auto resource_name = get_resource_name();
137
+
138
+ payload.from_json(str);
139
+ if (resource_name.length() == 0)
140
+ models_json = payload.as_data();
141
+ else
142
+ models_json = payload[resource_name];
143
+ models_json.each([this](Data model_json) -> bool
144
+ {
145
+ auto ptr = std::make_shared<MODEL>();
146
+ ptr->from_json(model_json);
147
+ Collection<MODEL>::models.emplace(ptr->get_id(), ptr);
148
+ return true;
149
+ });
150
+ }
151
+ };
152
+ }
153
+
154
+ #endif
@@ -0,0 +1,59 @@
1
+ #ifndef COMET_MVC_CONTROLLER_HPP
2
+ # define COMET_MVC_CONTROLLER_HPP
3
+
4
+ # include "../promise.hpp"
5
+ # include "../http.hpp"
6
+ # include "../router.hpp"
7
+ # include "layout.hpp"
8
+
9
+ # define match_route(ROUTE, CONTROLLER, METHOD) \
10
+ match(ROUTE, [](const Params& p) \
11
+ { \
12
+ auto* controller = new CONTROLLER(p); \
13
+ controller->initialize().then([controller]() \
14
+ { \
15
+ controller->METHOD(); \
16
+ controller->finalize().then([controller]() { delete controller; }); \
17
+ }); \
18
+ });
19
+
20
+ namespace Comet
21
+ {
22
+ class Controller
23
+ {
24
+ protected:
25
+ const Params& params;
26
+
27
+ public:
28
+ Controller(const Params& p) : params(p)
29
+ {
30
+ }
31
+
32
+ virtual std::string get_application_name()
33
+ {
34
+ return "main";
35
+ }
36
+
37
+ template<typename ELEMENT>
38
+ Layout<ELEMENT>& use_layout()
39
+ {
40
+ auto& layout = get_layout<ELEMENT>();
41
+
42
+ layout.attach_as_layout(get_application_name());
43
+ return layout;
44
+ }
45
+
46
+ template<typename ELEMENT>
47
+ Layout<ELEMENT>& get_layout()
48
+ {
49
+ static Layout<ELEMENT> layout;
50
+
51
+ return layout;
52
+ }
53
+
54
+ Comet::Promise initialize() { return Promise::solved_promise(); }
55
+ Comet::Promise finalize() { return Promise::solved_promise(); }
56
+ };
57
+ }
58
+
59
+ #endif
@@ -0,0 +1,9 @@
1
+ #ifndef COMET_MVC_ID_TYPE_HPP
2
+ # define COMET_MVC_ID_TYPE_HPP
3
+
4
+ # ifndef COMET_MVC_ID_TYPE
5
+ # define COMET_MVC_ID_TYPE unsigned long
6
+ # define COMET_MVC_NULL_ID 0
7
+ # endif
8
+
9
+ #endif
@@ -0,0 +1,44 @@
1
+ #ifndef COMET_MVC_LAYOUT_HPP
2
+ # define COMET_MVC_LAYOUT_HPP
3
+
4
+ # include "../globals.hpp"
5
+ # include "../exception.hpp"
6
+
7
+ namespace Comet
8
+ {
9
+ template<typename ELEMENT>
10
+ class Layout : public ELEMENT
11
+ {
12
+ Element get_container(const std::string& application_name)
13
+ {
14
+ auto candidates = body.find("[comet-app='" + application_name + "']");
15
+
16
+ if (candidates.size() > 0)
17
+ return candidates[0];
18
+ return body;
19
+ }
20
+
21
+ public:
22
+ void attach_as_layout(const std::string& application_name)
23
+ {
24
+ auto container = get_container(application_name);
25
+
26
+ if (container.is_undefined())
27
+ raise(std::runtime_error("Could not find the application container element"));
28
+ container.empty();
29
+ ELEMENT::append_to(container);
30
+ ELEMENT::bind_attributes();
31
+ ELEMENT::trigger_binding_updates();
32
+ }
33
+
34
+ template<typename VIEW_ELEMENT>
35
+ void render(std::shared_ptr<VIEW_ELEMENT> el)
36
+ {
37
+ ELEMENT::slot_content.set_element(el);
38
+ ELEMENT::bind_attributes();
39
+ ELEMENT::trigger_binding_updates();
40
+ }
41
+ };
42
+ }
43
+
44
+ #endif
@@ -0,0 +1,89 @@
1
+ #include "model.hpp"
2
+ #include "../http.hpp"
3
+
4
+ using namespace Comet;
5
+ using namespace std;
6
+
7
+ Comet::Promise Model::fetch()
8
+ {
9
+ auto request = Http::Request::get(get_url());
10
+
11
+ request->set_headers({{"Accept", get_content_type()}});
12
+ return request->send().then([this, request]()
13
+ {
14
+ auto response = request->get_response();
15
+
16
+ if (response->ok())
17
+ {
18
+ if (response->has_body())
19
+ parse(response->get_response_text());
20
+ synced.trigger();
21
+ }
22
+ });
23
+ }
24
+
25
+ Comet::Promise Model::save()
26
+ {
27
+ auto request = Http::Request::make(get_id() == COMET_MVC_NULL_ID ? "post" : "put", get_url());
28
+
29
+ request->set_headers({
30
+ {"Content-Type", get_content_type()},
31
+ {"Accept", get_content_type()}
32
+ });
33
+ request->set_body(get_payload());
34
+ return request->send().then([this, request]()
35
+ {
36
+ auto response = request->get_response();
37
+
38
+ if (response->ok())
39
+ {
40
+ if (response->has_body())
41
+ parse(response->get_response_text());
42
+ synced.trigger();
43
+ }
44
+ });
45
+ }
46
+
47
+ Comet::Promise Model::destroy(Comet::HttpResponseCallback callback)
48
+ {
49
+ auto request = Http::Request::_delete(get_url());
50
+
51
+ request->set_headers({{"Accept", get_content_type()}});
52
+ return request->send().then([this, request, callback]()
53
+ {
54
+ auto response = request->get_response();
55
+
56
+ if (response->ok())
57
+ removed.trigger();
58
+ if (callback)
59
+ callback(response);
60
+ });
61
+ }
62
+
63
+ std::string JsonModel::get_payload()
64
+ {
65
+ if (get_resource_name().length() > 0)
66
+ {
67
+ std::stringstream stream;
68
+ stream << '{' << '"' << get_resource_name() << '"' << ':' << to_json() << '}';
69
+
70
+ return stream.str();
71
+ }
72
+ return to_json();
73
+ }
74
+
75
+ void JsonModel::parse(const std::string& str)
76
+ {
77
+ DataTree data;
78
+
79
+ data.from_json(str);
80
+ if (get_resource_name().length() > 0 && data[get_resource_name()].exists())
81
+ from_json(data[get_resource_name()]);
82
+ else
83
+ from_json(data);
84
+ }
85
+
86
+ std::string JsonModel::get_content_type() const
87
+ {
88
+ return "application/json";
89
+ }
@@ -0,0 +1,50 @@
1
+ #ifndef COMET_MVC_MODEL_HPP
2
+ # define COMET_MVC_MODEL_HPP
3
+
4
+ # include "../signal.hpp"
5
+ # include "../promise.hpp"
6
+ # include "../datatree.hpp"
7
+ # include "id_type.hpp"
8
+
9
+ namespace Comet
10
+ {
11
+ namespace Http { class Response; }
12
+ typedef std::function<void (std::shared_ptr<Http::Response>)> HttpResponseCallback;
13
+
14
+ class Model : public Listener
15
+ {
16
+ public:
17
+ typedef COMET_MVC_ID_TYPE id_type;
18
+
19
+ Signal<void> removed;
20
+ Signal<void> synced;
21
+
22
+ virtual id_type get_id() const { return id; }
23
+ virtual std::string get_url() const = 0;
24
+ virtual std::string get_resource_name() const { return ""; }
25
+
26
+ Promise fetch();
27
+ Promise save();
28
+ Promise destroy(HttpResponseCallback callback = HttpResponseCallback());
29
+ virtual void parse(const std::string& str) = 0;
30
+
31
+ protected:
32
+ virtual std::string get_payload() = 0;
33
+ virtual std::string get_content_type() const = 0;
34
+
35
+ id_type id = COMET_MVC_NULL_ID;
36
+ };
37
+
38
+ class JsonModel : public Model
39
+ {
40
+ public:
41
+ virtual void from_json(Data) = 0;
42
+ virtual std::string to_json() const = 0;
43
+ void parse(const std::string& str);
44
+ protected:
45
+ std::string get_payload();
46
+ std::string get_content_type() const;
47
+ };
48
+ }
49
+
50
+ #endif
@@ -0,0 +1,71 @@
1
+ #include "object.hpp"
2
+ #include "globals.hpp"
3
+
4
+ using namespace Comet;
5
+ using namespace std;
6
+
7
+ static void prepare_is_undefined()
8
+ {
9
+ static bool is_prepared = false;
10
+
11
+ if (!is_prepared)
12
+ {
13
+ client::eval("window.isUndefined = function(a) { return a == undefined ? 'y' : 'n'; };");
14
+ is_prepared = true;
15
+ }
16
+ }
17
+
18
+ bool Object::is_of_type(const char* type) const
19
+ {
20
+ if (is_undefined())
21
+ return false;
22
+ return ptr->operator[]("constructor") == *(window[type]);
23
+ }
24
+
25
+ bool Object::is_undefined() const
26
+ {
27
+ prepare_is_undefined();
28
+ if (ptr != nullptr)
29
+ {
30
+ Object answer = window.apply("isUndefined", *this);
31
+ std::string result = (std::string)(*static_cast<client::String*>(answer.ptr));
32
+ return result == "y";
33
+ }
34
+ return true;
35
+ }
36
+
37
+ void Object::set_global(const std::string& key, Object object)
38
+ {
39
+ window.set(key, object);
40
+ }
41
+
42
+ template<>
43
+ vector<wstring> Object::to_vector() const
44
+ {
45
+ vector<wstring> result;
46
+
47
+ if (is_of_type("Array"))
48
+ {
49
+ const client::Array& array = *(static_cast<client::Array*>(ptr));
50
+ result.resize(array.get_length());
51
+ for (int i = 0 ; i < array.get_length() ; ++i)
52
+ result.push_back((wstring)(Object(array[i])));
53
+ }
54
+ return result;
55
+ }
56
+
57
+ namespace Comet
58
+ {
59
+ std::wstring to_wstring(client::String* value)
60
+ {
61
+ std::wstring wide_string;
62
+ auto length = value->get_length();
63
+ wchar_t* result = new wchar_t[length + 1];
64
+
65
+ for(int i = 0; i < value->get_length() ; i++)
66
+ result[i] = (wchar_t)value->charCodeAt(i);
67
+ wide_string = std::wstring(result, length);
68
+ delete[] result;
69
+ return wide_string;
70
+ }
71
+ }